From 68d662e689cd42687341c550fb6ebb74e6968d21 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Mon, 8 Sep 2014 00:29:57 +0200 Subject: module -> pyload --- .gitignore | 29 +- docs/access_api.rst | 14 +- docs/conf.py | 4 +- docs/docs.conf | 4 +- docs/index.rst | 2 +- docs/module_overview.rst | 20 +- docs/write_hooks.rst | 40 +- docs/write_plugins.rst | 18 +- locale/af/LC_MESSAGES/django.po | 420 +- locale/af/LC_MESSAGES/pyLoad.po | 420 +- locale/af/LC_MESSAGES/pyLoadCli.po | 138 +- locale/af/LC_MESSAGES/setup.po | 222 +- locale/ar/LC_MESSAGES/django.po | 420 +- locale/ar/LC_MESSAGES/pyLoad.po | 424 +- locale/ar/LC_MESSAGES/pyLoadCli.po | 138 +- locale/ar/LC_MESSAGES/setup.po | 222 +- locale/bn/LC_MESSAGES/django.po | 420 +- locale/bn/LC_MESSAGES/pyLoad.po | 420 +- locale/bn/LC_MESSAGES/pyLoadCli.po | 138 +- locale/bn/LC_MESSAGES/setup.po | 222 +- locale/ca/LC_MESSAGES/django.po | 420 +- locale/ca/LC_MESSAGES/pyLoad.po | 424 +- locale/ca/LC_MESSAGES/pyLoadCli.po | 138 +- locale/ca/LC_MESSAGES/setup.po | 224 +- locale/cli.pot | 138 +- locale/core.pot | 436 +- locale/cs/LC_MESSAGES/django.po | 420 +- locale/cs/LC_MESSAGES/pyLoad.po | 424 +- locale/cs/LC_MESSAGES/pyLoadCli.po | 138 +- locale/cs/LC_MESSAGES/setup.po | 224 +- locale/da/LC_MESSAGES/django.po | 420 +- locale/da/LC_MESSAGES/pyLoad.po | 420 +- locale/da/LC_MESSAGES/pyLoadCli.po | 138 +- locale/da/LC_MESSAGES/setup.po | 222 +- locale/de/LC_MESSAGES/django.po | 420 +- locale/de/LC_MESSAGES/pyLoad.po | 424 +- locale/de/LC_MESSAGES/pyLoadCli.po | 138 +- locale/de/LC_MESSAGES/setup.po | 224 +- locale/django.pot | 420 +- locale/el/LC_MESSAGES/django.po | 420 +- locale/el/LC_MESSAGES/pyLoad.po | 422 +- locale/el/LC_MESSAGES/pyLoadCli.po | 138 +- locale/el/LC_MESSAGES/setup.po | 224 +- locale/eo/LC_MESSAGES/django.po | 420 +- locale/eo/LC_MESSAGES/pyLoad.po | 420 +- locale/eo/LC_MESSAGES/pyLoadCli.po | 138 +- locale/eo/LC_MESSAGES/setup.po | 222 +- locale/es/LC_MESSAGES/django.po | 420 +- locale/es/LC_MESSAGES/pyLoad.po | 424 +- locale/es/LC_MESSAGES/pyLoadCli.po | 138 +- locale/es/LC_MESSAGES/setup.po | 224 +- locale/fa/LC_MESSAGES/django.po | 420 +- locale/fa/LC_MESSAGES/pyLoad.po | 420 +- locale/fa/LC_MESSAGES/pyLoadCli.po | 138 +- locale/fa/LC_MESSAGES/setup.po | 222 +- locale/fi/LC_MESSAGES/django.po | 420 +- locale/fi/LC_MESSAGES/pyLoad.po | 420 +- locale/fi/LC_MESSAGES/pyLoadCli.po | 138 +- locale/fi/LC_MESSAGES/setup.po | 222 +- locale/fr/LC_MESSAGES/django.po | 420 +- locale/fr/LC_MESSAGES/pyLoad.po | 424 +- locale/fr/LC_MESSAGES/pyLoadCli.po | 138 +- locale/fr/LC_MESSAGES/setup.po | 224 +- locale/ga/LC_MESSAGES/django.po | 420 +- locale/ga/LC_MESSAGES/pyLoad.po | 420 +- locale/ga/LC_MESSAGES/pyLoadCli.po | 138 +- locale/ga/LC_MESSAGES/setup.po | 222 +- locale/gl/LC_MESSAGES/django.po | 420 +- locale/gl/LC_MESSAGES/pyLoad.po | 424 +- locale/gl/LC_MESSAGES/pyLoadCli.po | 138 +- locale/gl/LC_MESSAGES/setup.po | 224 +- locale/he/LC_MESSAGES/django.po | 420 +- locale/he/LC_MESSAGES/pyLoad.po | 420 +- locale/he/LC_MESSAGES/pyLoadCli.po | 138 +- locale/he/LC_MESSAGES/setup.po | 222 +- locale/hi/LC_MESSAGES/django.po | 420 +- locale/hi/LC_MESSAGES/pyLoad.po | 420 +- locale/hi/LC_MESSAGES/pyLoadCli.po | 138 +- locale/hi/LC_MESSAGES/setup.po | 222 +- locale/hr/LC_MESSAGES/django.po | 420 +- locale/hr/LC_MESSAGES/pyLoad.po | 420 +- locale/hr/LC_MESSAGES/pyLoadCli.po | 138 +- locale/hr/LC_MESSAGES/setup.po | 222 +- locale/hu/LC_MESSAGES/django.po | 420 +- locale/hu/LC_MESSAGES/pyLoad.po | 420 +- locale/hu/LC_MESSAGES/pyLoadCli.po | 138 +- locale/hu/LC_MESSAGES/setup.po | 222 +- locale/id/LC_MESSAGES/django.po | 420 +- locale/id/LC_MESSAGES/pyLoad.po | 423 +- locale/id/LC_MESSAGES/pyLoadCli.po | 138 +- locale/id/LC_MESSAGES/setup.po | 222 +- locale/it/LC_MESSAGES/django.po | 420 +- locale/it/LC_MESSAGES/pyLoad.po | 424 +- locale/it/LC_MESSAGES/pyLoadCli.po | 138 +- locale/it/LC_MESSAGES/setup.po | 224 +- locale/ja/LC_MESSAGES/django.po | 420 +- locale/ja/LC_MESSAGES/pyLoad.po | 420 +- locale/ja/LC_MESSAGES/pyLoadCli.po | 138 +- locale/ja/LC_MESSAGES/setup.po | 222 +- locale/ko/LC_MESSAGES/django.po | 420 +- locale/ko/LC_MESSAGES/pyLoad.po | 420 +- locale/ko/LC_MESSAGES/pyLoadCli.po | 138 +- locale/ko/LC_MESSAGES/setup.po | 222 +- locale/ms/LC_MESSAGES/django.po | 420 +- locale/ms/LC_MESSAGES/pyLoad.po | 420 +- locale/ms/LC_MESSAGES/pyLoadCli.po | 138 +- locale/ms/LC_MESSAGES/setup.po | 222 +- locale/nl/LC_MESSAGES/django.po | 420 +- locale/nl/LC_MESSAGES/pyLoad.po | 424 +- locale/nl/LC_MESSAGES/pyLoadCli.po | 138 +- locale/nl/LC_MESSAGES/setup.po | 222 +- locale/no/LC_MESSAGES/django.po | 420 +- locale/no/LC_MESSAGES/pyLoad.po | 420 +- locale/no/LC_MESSAGES/pyLoadCli.po | 138 +- locale/no/LC_MESSAGES/setup.po | 222 +- locale/pa/LC_MESSAGES/django.po | 420 +- locale/pa/LC_MESSAGES/pyLoad.po | 420 +- locale/pa/LC_MESSAGES/pyLoadCli.po | 138 +- locale/pa/LC_MESSAGES/setup.po | 222 +- locale/pl/LC_MESSAGES/django.po | 420 +- locale/pl/LC_MESSAGES/pyLoad.po | 424 +- locale/pl/LC_MESSAGES/pyLoadCli.po | 138 +- locale/pl/LC_MESSAGES/setup.po | 224 +- locale/pt/LC_MESSAGES/django.po | 420 +- locale/pt/LC_MESSAGES/pyLoad.po | 420 +- locale/pt/LC_MESSAGES/pyLoadCli.po | 138 +- locale/pt/LC_MESSAGES/setup.po | 222 +- locale/ro/LC_MESSAGES/django.po | 420 +- locale/ro/LC_MESSAGES/pyLoad.po | 420 +- locale/ro/LC_MESSAGES/pyLoadCli.po | 138 +- locale/ro/LC_MESSAGES/setup.po | 222 +- locale/ru/LC_MESSAGES/django.po | 420 +- locale/ru/LC_MESSAGES/pyLoad.po | 422 +- locale/ru/LC_MESSAGES/pyLoadCli.po | 138 +- locale/ru/LC_MESSAGES/setup.po | 222 +- locale/setup.pot | 214 +- locale/si/LC_MESSAGES/django.po | 420 +- locale/si/LC_MESSAGES/pyLoad.po | 420 +- locale/si/LC_MESSAGES/pyLoadCli.po | 138 +- locale/si/LC_MESSAGES/setup.po | 222 +- locale/sq/LC_MESSAGES/django.po | 420 +- locale/sq/LC_MESSAGES/pyLoad.po | 420 +- locale/sq/LC_MESSAGES/pyLoadCli.po | 138 +- locale/sq/LC_MESSAGES/setup.po | 222 +- locale/sr/LC_MESSAGES/django.po | 420 +- locale/sr/LC_MESSAGES/pyLoad.po | 424 +- locale/sr/LC_MESSAGES/pyLoadCli.po | 138 +- locale/sr/LC_MESSAGES/setup.po | 224 +- locale/sv/LC_MESSAGES/django.po | 420 +- locale/sv/LC_MESSAGES/pyLoad.po | 424 +- locale/sv/LC_MESSAGES/pyLoadCli.po | 138 +- locale/sv/LC_MESSAGES/setup.po | 224 +- locale/te/LC_MESSAGES/django.po | 420 +- locale/te/LC_MESSAGES/pyLoad.po | 420 +- locale/te/LC_MESSAGES/pyLoadCli.po | 138 +- locale/te/LC_MESSAGES/setup.po | 222 +- locale/tr/LC_MESSAGES/django.po | 420 +- locale/tr/LC_MESSAGES/pyLoad.po | 420 +- locale/tr/LC_MESSAGES/pyLoadCli.po | 138 +- locale/tr/LC_MESSAGES/setup.po | 222 +- locale/uk/LC_MESSAGES/django.po | 420 +- locale/uk/LC_MESSAGES/pyLoad.po | 420 +- locale/uk/LC_MESSAGES/pyLoadCli.po | 138 +- locale/uk/LC_MESSAGES/setup.po | 222 +- locale/vi/LC_MESSAGES/django.po | 420 +- locale/vi/LC_MESSAGES/pyLoad.po | 420 +- locale/vi/LC_MESSAGES/pyLoadCli.po | 138 +- locale/vi/LC_MESSAGES/setup.po | 222 +- locale/zh/LC_MESSAGES/django.po | 420 +- locale/zh/LC_MESSAGES/pyLoad.po | 420 +- locale/zh/LC_MESSAGES/pyLoadCli.po | 138 +- locale/zh/LC_MESSAGES/setup.po | 222 +- module/Api.py | 1030 ---- module/CaptchaManager.py | 158 - module/ConfigParser.py | 373 -- module/Core.py | 663 --- module/HookManager.py | 305 - module/InitHomeDir.py | 79 - module/PullEvents.py | 120 - module/PyFile.py | 284 - module/PyPackage.py | 79 - module/Scheduler.py | 141 - module/ThreadManager.py | 317 -- module/__init__.py | 0 module/cli/AddPackage.py | 65 - module/cli/Cli.py | 585 -- module/cli/Handler.py | 47 - module/cli/ManageFiles.py | 203 - module/cli/__init__.py | 4 - module/cli/printer.py | 25 - module/common/APIExerciser.py | 157 - module/common/ImportDebugger.py | 19 - module/common/JsEngine.py | 155 - module/common/__init__.py | 0 module/common/json_layer.py | 12 - module/common/packagetools.py | 136 - module/common/pavement.py | 412 -- module/common/pylgettext.py | 60 - module/common/test_api.py | 20 - module/common/test_json.py | 48 - module/config/default.conf | 64 - module/database/DatabaseBackend.py | 305 - module/database/FileDatabase.py | 891 --- module/database/StorageDatabase.py | 49 - module/database/UserDatabase.py | 108 - module/database/__init__.py | 8 - module/debug.py | 94 - module/forwarder.py | 61 - module/lib/BeautifulSoup.py | 2017 ------- module/lib/Getch.py | 76 - module/lib/MultipartPostHandler.py | 139 - module/lib/SafeEval.py | 47 - module/lib/__init__.py | 0 module/lib/beaker/__init__.py | 1 - module/lib/beaker/cache.py | 589 -- module/lib/beaker/container.py | 750 --- module/lib/beaker/converters.py | 29 - module/lib/beaker/crypto/__init__.py | 44 - module/lib/beaker/crypto/jcecrypto.py | 32 - module/lib/beaker/crypto/nsscrypto.py | 45 - module/lib/beaker/crypto/pbkdf2.py | 347 -- module/lib/beaker/crypto/pycrypto.py | 34 - module/lib/beaker/crypto/util.py | 30 - module/lib/beaker/exceptions.py | 29 - module/lib/beaker/ext/__init__.py | 0 module/lib/beaker/ext/database.py | 174 - module/lib/beaker/ext/google.py | 121 - module/lib/beaker/ext/memcached.py | 203 - module/lib/beaker/ext/sqla.py | 136 - module/lib/beaker/middleware.py | 168 - module/lib/beaker/session.py | 726 --- module/lib/beaker/synchronization.py | 386 -- module/lib/beaker/util.py | 462 -- module/lib/bottle.py | 3732 ------------ module/lib/feedparser.py | 4013 ------------- module/lib/jinja2/__init__.py | 69 - module/lib/jinja2/_compat.py | 150 - module/lib/jinja2/_stringdefs.py | 132 - module/lib/jinja2/bccache.py | 344 -- module/lib/jinja2/compiler.py | 1640 ------ module/lib/jinja2/constants.py | 32 - module/lib/jinja2/debug.py | 337 -- module/lib/jinja2/defaults.py | 43 - module/lib/jinja2/environment.py | 1191 ---- module/lib/jinja2/exceptions.py | 146 - module/lib/jinja2/ext.py | 636 --- module/lib/jinja2/filters.py | 987 ---- module/lib/jinja2/lexer.py | 733 --- module/lib/jinja2/loaders.py | 471 -- module/lib/jinja2/meta.py | 103 - module/lib/jinja2/nodes.py | 914 --- module/lib/jinja2/optimizer.py | 68 - module/lib/jinja2/parser.py | 895 --- module/lib/jinja2/runtime.py | 581 -- module/lib/jinja2/sandbox.py | 368 -- module/lib/jinja2/tests.py | 149 - module/lib/jinja2/testsuite/__init__.py | 156 - module/lib/jinja2/testsuite/api.py | 261 - module/lib/jinja2/testsuite/bytecode_cache.py | 37 - module/lib/jinja2/testsuite/core_tags.py | 305 - module/lib/jinja2/testsuite/debug.py | 58 - module/lib/jinja2/testsuite/doctests.py | 29 - module/lib/jinja2/testsuite/ext.py | 459 -- module/lib/jinja2/testsuite/filters.py | 515 -- module/lib/jinja2/testsuite/imports.py | 141 - module/lib/jinja2/testsuite/inheritance.py | 250 - module/lib/jinja2/testsuite/lexnparse.py | 593 -- module/lib/jinja2/testsuite/loader.py | 226 - module/lib/jinja2/testsuite/regression.py | 279 - module/lib/jinja2/testsuite/res/__init__.py | 0 .../lib/jinja2/testsuite/res/templates/broken.html | 3 - .../jinja2/testsuite/res/templates/foo/test.html | 1 - .../testsuite/res/templates/syntaxerror.html | 4 - .../lib/jinja2/testsuite/res/templates/test.html | 1 - module/lib/jinja2/testsuite/security.py | 166 - module/lib/jinja2/testsuite/tests.py | 93 - module/lib/jinja2/testsuite/utils.py | 82 - module/lib/jinja2/utils.py | 520 -- module/lib/jinja2/visitor.py | 87 - module/lib/markupsafe/__init__.py | 298 - module/lib/markupsafe/_compat.py | 26 - module/lib/markupsafe/_constants.py | 267 - module/lib/markupsafe/_native.py | 46 - module/lib/markupsafe/_speedups.c | 239 - module/lib/markupsafe/tests.py | 179 - module/lib/rename_process.py | 14 - module/lib/simplejson/__init__.py | 560 -- module/lib/simplejson/compat.py | 46 - module/lib/simplejson/decoder.py | 393 -- module/lib/simplejson/encoder.py | 648 --- module/lib/simplejson/ordered_dict.py | 119 - module/lib/simplejson/scanner.py | 133 - module/lib/simplejson/tool.py | 42 - module/lib/thrift/TSCons.py | 35 - module/lib/thrift/TSerialization.py | 38 - module/lib/thrift/TTornado.py | 153 - module/lib/thrift/Thrift.py | 170 - module/lib/thrift/__init__.py | 20 - module/lib/thrift/protocol/TBase.py | 81 - module/lib/thrift/protocol/TBinaryProtocol.py | 260 - module/lib/thrift/protocol/TCompactProtocol.py | 403 -- module/lib/thrift/protocol/TJSONProtocol.py | 550 -- module/lib/thrift/protocol/TProtocol.py | 406 -- module/lib/thrift/protocol/__init__.py | 20 - module/lib/thrift/protocol/fastbinary.c | 1219 ---- module/lib/thrift/server/THttpServer.py | 87 - module/lib/thrift/server/TNonblockingServer.py | 346 -- module/lib/thrift/server/TProcessPoolServer.py | 118 - module/lib/thrift/server/TServer.py | 269 - module/lib/thrift/server/__init__.py | 20 - module/lib/thrift/transport/THttpClient.py | 149 - module/lib/thrift/transport/TSSLSocket.py | 214 - module/lib/thrift/transport/TSocket.py | 176 - module/lib/thrift/transport/TTransport.py | 330 -- module/lib/thrift/transport/TTwisted.py | 221 - module/lib/thrift/transport/TZlibTransport.py | 248 - module/lib/thrift/transport/__init__.py | 20 - module/lib/wsgiserver/LICENSE.txt | 25 - module/lib/wsgiserver/__init__.py | 2299 -------- module/network/Browser.py | 132 - module/network/Bucket.py | 59 - module/network/CookieJar.py | 50 - module/network/HTTPChunk.py | 292 - module/network/HTTPDownload.py | 325 -- module/network/HTTPRequest.py | 303 - module/network/RequestFactory.py | 126 - module/network/XDCCRequest.py | 159 - module/network/__init__.py | 1 - module/plugins/Account.py | 281 - module/plugins/AccountManager.py | 173 - module/plugins/Container.py | 61 - module/plugins/Crypter.py | 64 - module/plugins/Hook.py | 149 - module/plugins/Hoster.py | 20 - module/plugins/OCR.py | 299 - module/plugins/Plugin.py | 629 -- module/plugins/PluginManager.py | 356 -- module/plugins/README.md | 16 - module/plugins/__init__.py | 0 module/plugins/accounts/AlldebridCom.py | 58 - module/plugins/accounts/BayfilesCom.py | 36 - module/plugins/accounts/BitshareCom.py | 31 - module/plugins/accounts/CramitIn.py | 15 - module/plugins/accounts/CyberlockerCh.py | 35 - module/plugins/accounts/CzshareCom.py | 41 - module/plugins/accounts/DebridItaliaCom.py | 36 - module/plugins/accounts/DepositfilesCom.py | 32 - module/plugins/accounts/EasybytezCom.py | 61 - module/plugins/accounts/EgoFilesCom.py | 44 - module/plugins/accounts/EuroshareEu.py | 41 - module/plugins/accounts/FastixRu.py | 36 - module/plugins/accounts/FastshareCz.py | 41 - module/plugins/accounts/File4safeCom.py | 18 - module/plugins/accounts/FilecloudIo.py | 57 - module/plugins/accounts/FilefactoryCom.py | 46 - module/plugins/accounts/FilejungleCom.py | 47 - module/plugins/accounts/FilerNet.py | 49 - module/plugins/accounts/FilerioCom.py | 15 - module/plugins/accounts/FilesMailRu.py | 27 - module/plugins/accounts/FileserveCom.py | 43 - module/plugins/accounts/FourSharedCom.py | 34 - module/plugins/accounts/FreakshareCom.py | 39 - module/plugins/accounts/FreeWayMe.py | 52 - module/plugins/accounts/FshareVn.py | 59 - module/plugins/accounts/Ftp.py | 16 - module/plugins/accounts/HellshareCz.py | 74 - module/plugins/accounts/HotfileCom.py | 74 - module/plugins/accounts/Http.py | 16 - module/plugins/accounts/LetitbitNet.py | 33 - module/plugins/accounts/LinksnappyCom.py | 49 - module/plugins/accounts/MegaDebridEu.py | 37 - module/plugins/accounts/MegasharesCom.py | 46 - module/plugins/accounts/MovReelCom.py | 21 - module/plugins/accounts/MultiDebridCom.py | 34 - module/plugins/accounts/MultishareCz.py | 44 - module/plugins/accounts/NetloadIn.py | 38 - module/plugins/accounts/OboomCom.py | 53 - module/plugins/accounts/OneFichierCom.py | 48 - module/plugins/accounts/OverLoadMe.py | 35 - module/plugins/accounts/Premium4Me.py | 29 - module/plugins/accounts/PremiumizeMe.py | 46 - module/plugins/accounts/QuickshareCz.py | 39 - module/plugins/accounts/RPNetBiz.py | 49 - module/plugins/accounts/RapidgatorNet.py | 56 - module/plugins/accounts/RapidshareCom.py | 54 - module/plugins/accounts/RarefileNet.py | 15 - module/plugins/accounts/RealdebridCom.py | 35 - module/plugins/accounts/RehostTo.py | 37 - module/plugins/accounts/RyushareCom.py | 23 - module/plugins/accounts/ShareRapidCom.py | 52 - module/plugins/accounts/ShareonlineBiz.py | 42 - module/plugins/accounts/SimplyPremiumCom.py | 45 - module/plugins/accounts/SimplydebridCom.py | 33 - module/plugins/accounts/StahnuTo.py | 34 - module/plugins/accounts/TurbobitNet.py | 41 - module/plugins/accounts/UlozTo.py | 45 - module/plugins/accounts/UnrestrictLi.py | 43 - module/plugins/accounts/UploadedTo.py | 53 - module/plugins/accounts/UploadheroCom.py | 40 - module/plugins/accounts/UploadingCom.py | 40 - module/plugins/accounts/UptoboxCom.py | 17 - module/plugins/accounts/YibaishiwuCom.py | 38 - module/plugins/accounts/ZeveraCom.py | 54 - module/plugins/accounts/__init__.py | 0 module/plugins/container/CCF.py | 43 - module/plugins/container/DLC_25.pyc | Bin 8340 -> 0 bytes module/plugins/container/DLC_26.pyc | Bin 8313 -> 0 bytes module/plugins/container/DLC_27.pyc | Bin 8237 -> 0 bytes module/plugins/container/LinkList.py | 73 - module/plugins/container/RSDF.py | 51 - module/plugins/container/__init__.py | 0 module/plugins/crypter/BitshareComFolder.py | 18 - module/plugins/crypter/C1neonCom.py | 15 - module/plugins/crypter/ChipDe.py | 27 - module/plugins/crypter/CrockoComFolder.py | 17 - module/plugins/crypter/CryptItCom.py | 15 - module/plugins/crypter/CzshareComFolder.py | 31 - module/plugins/crypter/DDLMusicOrg.py | 48 - module/plugins/crypter/DailymotionBatch.py | 98 - module/plugins/crypter/DataHuFolder.py | 43 - module/plugins/crypter/DdlstorageComFolder.py | 18 - module/plugins/crypter/DepositfilesComFolder.py | 17 - module/plugins/crypter/Dereferer.py | 24 - module/plugins/crypter/DlProtectCom.py | 62 - module/plugins/crypter/DontKnowMe.py | 26 - module/plugins/crypter/DuckCryptInfo.py | 59 - module/plugins/crypter/DuploadOrgFolder.py | 17 - module/plugins/crypter/EasybytezComFolder.py | 20 - module/plugins/crypter/EmbeduploadCom.py | 55 - module/plugins/crypter/FilebeerInfoFolder.py | 15 - module/plugins/crypter/FilecloudIoFolder.py | 18 - module/plugins/crypter/FilefactoryComFolder.py | 25 - module/plugins/crypter/FilerNetFolder.py | 22 - module/plugins/crypter/FileserveComFolder.py | 37 - module/plugins/crypter/FilestubeCom.py | 18 - module/plugins/crypter/FiletramCom.py | 18 - module/plugins/crypter/FiredriveComFolder.py | 28 - module/plugins/crypter/FourChanOrg.py | 25 - module/plugins/crypter/FreakhareComFolder.py | 35 - module/plugins/crypter/FreetexthostCom.py | 25 - module/plugins/crypter/FshareVnFolder.py | 17 - module/plugins/crypter/GooGl.py | 29 - module/plugins/crypter/HoerbuchIn.py | 57 - module/plugins/crypter/HotfileFolderCom.py | 30 - module/plugins/crypter/ILoadTo.py | 15 - module/plugins/crypter/ImgurComAlbum.py | 24 - module/plugins/crypter/LetitbitNetFolder.py | 32 - module/plugins/crypter/LinkSaveIn.py | 225 - module/plugins/crypter/LinkdecrypterCom.py | 91 - module/plugins/crypter/LixIn.py | 59 - module/plugins/crypter/LofCc.py | 15 - module/plugins/crypter/MBLinkInfo.py | 15 - module/plugins/crypter/MediafireComFolder.py | 56 - module/plugins/crypter/Movie2kTo.py | 15 - module/plugins/crypter/MultiUpOrg.py | 35 - module/plugins/crypter/MultiloadCz.py | 42 - module/plugins/crypter/MultiuploadCom.py | 64 - module/plugins/crypter/NCryptIn.py | 303 - module/plugins/crypter/NetfolderIn.py | 73 - module/plugins/crypter/NosvideoCom.py | 18 - module/plugins/crypter/OneKhDe.py | 38 - module/plugins/crypter/OronComFolder.py | 15 - module/plugins/crypter/PastebinCom.py | 18 - module/plugins/crypter/QuickshareCzFolder.py | 31 - module/plugins/crypter/RSLayerCom.py | 15 - module/plugins/crypter/RelinkUs.py | 263 - module/plugins/crypter/SafelinkingNet.py | 82 - module/plugins/crypter/SecuredIn.py | 15 - module/plugins/crypter/SerienjunkiesOrg.py | 324 -- module/plugins/crypter/ShareLinksBiz.py | 269 - module/plugins/crypter/ShareRapidComFolder.py | 17 - module/plugins/crypter/SpeedLoadOrgFolder.py | 15 - module/plugins/crypter/StealthTo.py | 15 - module/plugins/crypter/TnyCz.py | 24 - module/plugins/crypter/TrailerzoneInfo.py | 15 - module/plugins/crypter/TurbobitNetFolder.py | 39 - module/plugins/crypter/TusfilesNetFolder.py | 40 - module/plugins/crypter/UlozToFolder.py | 45 - module/plugins/crypter/UploadableChFolder.py | 21 - module/plugins/crypter/UploadedToFolder.py | 38 - module/plugins/crypter/WiiReloadedOrg.py | 15 - module/plugins/crypter/XupPl.py | 23 - module/plugins/crypter/YoutubeBatch.py | 138 - module/plugins/crypter/__init__.py | 0 module/plugins/hooks/AlldebridCom.py | 28 - module/plugins/hooks/BypassCaptcha.py | 127 - module/plugins/hooks/Captcha9kw.py | 156 - module/plugins/hooks/CaptchaBrotherhood.py | 157 - module/plugins/hooks/Checksum.py | 175 - module/plugins/hooks/ClickAndLoad.py | 76 - module/plugins/hooks/DeathByCaptcha.py | 202 - module/plugins/hooks/DebridItaliaCom.py | 29 - module/plugins/hooks/DeleteFinished.py | 69 - module/plugins/hooks/DownloadScheduler.py | 75 - module/plugins/hooks/EasybytezCom.py | 37 - module/plugins/hooks/Ev0InFetcher.py | 81 - module/plugins/hooks/ExpertDecoders.py | 94 - module/plugins/hooks/ExternalScripts.py | 104 - module/plugins/hooks/ExtractArchive.py | 320 -- module/plugins/hooks/FastixRu.py | 28 - module/plugins/hooks/FreeWayMe.py | 26 - module/plugins/hooks/HotFolder.py | 65 - module/plugins/hooks/IRCInterface.py | 404 -- module/plugins/hooks/ImageTyperz.py | 143 - module/plugins/hooks/LinkdecrypterCom.py | 55 - module/plugins/hooks/LinksnappyCom.py | 28 - module/plugins/hooks/MegaDebridEu.py | 31 - module/plugins/hooks/MergeFiles.py | 76 - module/plugins/hooks/MultiDebridCom.py | 29 - module/plugins/hooks/MultiHome.py | 75 - module/plugins/hooks/MultishareCz.py | 27 - module/plugins/hooks/OverLoadMe.py | 31 - module/plugins/hooks/Premium4Me.py | 34 - module/plugins/hooks/PremiumizeMe.py | 54 - module/plugins/hooks/RPNetBiz.py | 52 - module/plugins/hooks/RealdebridCom.py | 28 - module/plugins/hooks/RehostTo.py | 40 - module/plugins/hooks/RestartFailed.py | 42 - module/plugins/hooks/SimplyPremiumCom.py | 30 - module/plugins/hooks/SimplydebridCom.py | 23 - module/plugins/hooks/UnSkipOnFail.py | 85 - module/plugins/hooks/UnrestrictLi.py | 31 - module/plugins/hooks/UpdateManager.py | 281 - module/plugins/hooks/WindowsPhoneToastNotify.py | 59 - module/plugins/hooks/XFileSharingPro.py | 78 - module/plugins/hooks/XMPPInterface.py | 233 - module/plugins/hooks/ZeveraCom.py | 23 - module/plugins/hooks/__init__.py | 0 module/plugins/hoster/AlldebridCom.py | 87 - module/plugins/hoster/BasePlugin.py | 116 - module/plugins/hoster/BayfilesCom.py | 84 - module/plugins/hoster/BezvadataCz.py | 87 - module/plugins/hoster/BillionuploadsCom.py | 23 - module/plugins/hoster/BitshareCom.py | 151 - module/plugins/hoster/BoltsharingCom.py | 18 - module/plugins/hoster/CatShareNet.py | 44 - module/plugins/hoster/CloudzerNet.py | 18 - module/plugins/hoster/CramitIn.py | 27 - module/plugins/hoster/CrockoCom.py | 75 - module/plugins/hoster/CyberlockerCh.py | 18 - module/plugins/hoster/CzshareCom.py | 148 - module/plugins/hoster/DailymotionCom.py | 111 - module/plugins/hoster/DataHu.py | 41 - module/plugins/hoster/DataportCz.py | 56 - module/plugins/hoster/DateiTo.py | 83 - module/plugins/hoster/DdlstorageCom.py | 18 - module/plugins/hoster/DebridItaliaCom.py | 49 - module/plugins/hoster/DepositfilesCom.py | 129 - module/plugins/hoster/DlFreeFr.py | 205 - module/plugins/hoster/DuploadOrg.py | 22 - module/plugins/hoster/EasybytezCom.py | 31 - module/plugins/hoster/EdiskCz.py | 54 - module/plugins/hoster/EgoFilesCom.py | 89 - module/plugins/hoster/EpicShareNet.py | 26 - module/plugins/hoster/EuroshareEu.py | 64 - module/plugins/hoster/ExtabitCom.py | 77 - module/plugins/hoster/FastixRu.py | 71 - module/plugins/hoster/FastshareCz.py | 88 - module/plugins/hoster/File4safeCom.py | 40 - module/plugins/hoster/FileApeCom.py | 18 - module/plugins/hoster/FileParadoxIn.py | 25 - module/plugins/hoster/FileStoreTo.py | 34 - module/plugins/hoster/FilebeerInfo.py | 18 - module/plugins/hoster/FilecloudIo.py | 115 - module/plugins/hoster/FilefactoryCom.py | 106 - module/plugins/hoster/FilejungleCom.py | 28 - module/plugins/hoster/FileomCom.py | 39 - module/plugins/hoster/FilepostCom.py | 129 - module/plugins/hoster/FilerNet.py | 109 - module/plugins/hoster/FilerioCom.py | 27 - module/plugins/hoster/FilesMailRu.py | 101 - module/plugins/hoster/FileserveCom.py | 209 - module/plugins/hoster/FileshareInUa.py | 83 - module/plugins/hoster/FilezyNet.py | 42 - module/plugins/hoster/FiredriveCom.py | 51 - module/plugins/hoster/FlyFilesNet.py | 46 - module/plugins/hoster/FourSharedCom.py | 59 - module/plugins/hoster/FreakshareCom.py | 173 - module/plugins/hoster/FreeWayMe.py | 35 - module/plugins/hoster/FreevideoCz.py | 18 - module/plugins/hoster/FshareVn.py | 120 - module/plugins/hoster/Ftp.py | 74 - module/plugins/hoster/GamefrontCom.py | 84 - module/plugins/hoster/GigapetaCom.py | 64 - module/plugins/hoster/GooIm.py | 36 - module/plugins/hoster/HellshareCz.py | 47 - module/plugins/hoster/HellspyCz.py | 18 - module/plugins/hoster/HotfileCom.py | 18 - module/plugins/hoster/HugefilesNet.py | 25 - module/plugins/hoster/HundredEightyUploadCom.py | 26 - module/plugins/hoster/IFileWs.py | 23 - module/plugins/hoster/IcyFilesCom.py | 18 - module/plugins/hoster/IfileIt.py | 62 - module/plugins/hoster/IfolderRu.py | 75 - module/plugins/hoster/JumbofilesCom.py | 36 - module/plugins/hoster/Keep2shareCC.py | 110 - module/plugins/hoster/LemUploadsCom.py | 26 - module/plugins/hoster/LetitbitNet.py | 160 - module/plugins/hoster/LinksnappyCom.py | 72 - module/plugins/hoster/LoadTo.py | 69 - module/plugins/hoster/LomafileCom.py | 61 - module/plugins/hoster/LuckyShareNet.py | 75 - module/plugins/hoster/MediafireCom.py | 125 - module/plugins/hoster/MegaDebridEu.py | 89 - module/plugins/hoster/MegaFilesSe.py | 23 - module/plugins/hoster/MegaNz.py | 132 - module/plugins/hoster/MegacrypterCom.py | 53 - module/plugins/hoster/MegareleaseOrg.py | 22 - module/plugins/hoster/MegasharesCom.py | 105 - module/plugins/hoster/MovReelCom.py | 24 - module/plugins/hoster/MultiDebridCom.py | 45 - module/plugins/hoster/MultishareCz.py | 72 - module/plugins/hoster/MyvideoDe.py | 45 - module/plugins/hoster/NarodRu.py | 60 - module/plugins/hoster/NetloadIn.py | 258 - module/plugins/hoster/NosuploadCom.py | 42 - module/plugins/hoster/NovafileCom.py | 33 - module/plugins/hoster/NowDownloadEu.py | 60 - module/plugins/hoster/OboomCom.py | 132 - module/plugins/hoster/OneFichierCom.py | 90 - module/plugins/hoster/OverLoadMe.py | 82 - module/plugins/hoster/PandaPlanet.py | 28 - module/plugins/hoster/PornhostCom.py | 76 - module/plugins/hoster/PornhubCom.py | 85 - module/plugins/hoster/PotloadCom.py | 22 - module/plugins/hoster/Premium4Me.py | 72 - module/plugins/hoster/PremiumizeMe.py | 55 - module/plugins/hoster/PromptfileCom.py | 45 - module/plugins/hoster/QuickshareCz.py | 92 - module/plugins/hoster/RPNetBiz.py | 80 - module/plugins/hoster/RapidgatorNet.py | 191 - module/plugins/hoster/RapidshareCom.py | 223 - module/plugins/hoster/RarefileNet.py | 39 - module/plugins/hoster/RealdebridCom.py | 91 - module/plugins/hoster/RedtubeCom.py | 58 - module/plugins/hoster/RehostTo.py | 41 - module/plugins/hoster/RemixshareCom.py | 59 - module/plugins/hoster/RgHostNet.py | 32 - module/plugins/hoster/RyushareCom.py | 85 - module/plugins/hoster/SecureUploadEu.py | 23 - module/plugins/hoster/SendmywayCom.py | 23 - module/plugins/hoster/SendspaceCom.py | 60 - module/plugins/hoster/Share4webCom.py | 21 - module/plugins/hoster/Share76Com.py | 18 - module/plugins/hoster/ShareFilesCo.py | 18 - module/plugins/hoster/ShareRapidCom.py | 66 - module/plugins/hoster/SharebeesCom.py | 18 - module/plugins/hoster/ShareonlineBiz.py | 199 - module/plugins/hoster/ShareplaceCom.py | 84 - module/plugins/hoster/ShragleCom.py | 18 - module/plugins/hoster/SimplyPremiumCom.py | 81 - module/plugins/hoster/SimplydebridCom.py | 62 - module/plugins/hoster/SockshareCom.py | 88 - module/plugins/hoster/SoundcloudCom.py | 57 - module/plugins/hoster/SpeedLoadOrg.py | 18 - module/plugins/hoster/SpeedfileCz.py | 18 - module/plugins/hoster/SpeedyshareCom.py | 43 - module/plugins/hoster/StreamCz.py | 70 - module/plugins/hoster/StreamcloudEu.py | 124 - module/plugins/hoster/TurbobitNet.py | 167 - module/plugins/hoster/TurbouploadCom.py | 18 - module/plugins/hoster/TusfilesNet.py | 31 - module/plugins/hoster/TwoSharedCom.py | 39 - module/plugins/hoster/UlozTo.py | 158 - module/plugins/hoster/UloziskoSk.py | 70 - module/plugins/hoster/UnibytesCom.py | 71 - module/plugins/hoster/UnrestrictLi.py | 89 - module/plugins/hoster/UploadStationCom.py | 18 - module/plugins/hoster/UploadedTo.py | 240 - module/plugins/hoster/UploadheroCom.py | 77 - module/plugins/hoster/UploadingCom.py | 99 - module/plugins/hoster/UpstoreNet.py | 75 - module/plugins/hoster/UptoboxCom.py | 69 - module/plugins/hoster/VeehdCom.py | 79 - module/plugins/hoster/VeohCom.py | 51 - module/plugins/hoster/VidPlayNet.py | 27 - module/plugins/hoster/VimeoCom.py | 72 - module/plugins/hoster/Vipleech4uCom.py | 18 - module/plugins/hoster/WarserverCz.py | 18 - module/plugins/hoster/WebshareCz.py | 60 - module/plugins/hoster/WrzucTo.py | 51 - module/plugins/hoster/WuploadCom.py | 18 - module/plugins/hoster/X7To.py | 18 - module/plugins/hoster/XFileSharingPro.py | 324 -- module/plugins/hoster/XHamsterCom.py | 123 - module/plugins/hoster/XVideosCom.py | 28 - module/plugins/hoster/Xdcc.py | 205 - module/plugins/hoster/YibaishiwuCom.py | 54 - module/plugins/hoster/YoupornCom.py | 56 - module/plugins/hoster/YourfilesTo.py | 81 - module/plugins/hoster/YoutubeCom.py | 180 - module/plugins/hoster/ZDF.py | 56 - module/plugins/hoster/ZeveraCom.py | 108 - module/plugins/hoster/ZippyshareCom.py | 74 - module/plugins/hoster/__init__.py | 0 module/plugins/internal/AbstractExtractor.py | 101 - module/plugins/internal/CaptchaService.py | 96 - module/plugins/internal/DeadCrypter.py | 19 - module/plugins/internal/DeadHoster.py | 27 - module/plugins/internal/MultiHoster.py | 192 - module/plugins/internal/SimpleCrypter.py | 118 - module/plugins/internal/SimpleHoster.py | 292 - module/plugins/internal/UnRar.py | 212 - module/plugins/internal/UnZip.py | 38 - module/plugins/internal/XFSPAccount.py | 69 - module/plugins/internal/__init__.py | 0 module/plugins/ocr/GigasizeCom.py | 23 - module/plugins/ocr/LinksaveIn.py | 148 - module/plugins/ocr/NetloadIn.py | 27 - module/plugins/ocr/ShareonlineBiz.py | 38 - module/plugins/ocr/__init__.py | 0 module/remote/ClickAndLoadBackend.py | 170 - module/remote/RemoteManager.py | 91 - module/remote/SocketBackend.py | 25 - module/remote/ThriftBackend.py | 56 - module/remote/__init__.py | 3 - module/remote/socketbackend/__init__.py | 0 module/remote/socketbackend/create_ttypes.py | 86 - module/remote/socketbackend/ttypes.py | 381 -- module/remote/thriftbackend/Processor.py | 77 - module/remote/thriftbackend/Protocol.py | 30 - module/remote/thriftbackend/Socket.py | 129 - module/remote/thriftbackend/ThriftClient.py | 87 - module/remote/thriftbackend/ThriftTest.py | 91 - module/remote/thriftbackend/Transport.py | 37 - module/remote/thriftbackend/__init__.py | 0 module/remote/thriftbackend/pyload.thrift | 337 -- module/remote/thriftbackend/thriftgen/__init__.py | 0 .../thriftbackend/thriftgen/pyload/Pyload-remote | 570 -- .../thriftbackend/thriftgen/pyload/Pyload.py | 5533 ------------------ .../thriftbackend/thriftgen/pyload/__init__.py | 3 - .../thriftbackend/thriftgen/pyload/constants.py | 10 - .../thriftbackend/thriftgen/pyload/ttypes.py | 834 --- module/setup.py | 538 -- module/threads/PluginThread.py | 675 --- module/threads/ServerThread.py | 108 - module/threads/__init__.py | 0 module/unescape.py | 3 - module/utils.py | 227 - module/webui/__init__.py | 147 - module/webui/app/__init__.py | 3 - module/webui/app/api.py | 101 - module/webui/app/cnl.py | 168 - module/webui/app/json.py | 311 - module/webui/app/pyload.py | 544 -- module/webui/app/utils.py | 138 - module/webui/filters.py | 61 - module/webui/middlewares.py | 132 - module/webui/servers/lighttpd_default.conf | 153 - module/webui/servers/nginx_default.conf | 87 - module/webui/themes/dark/css/MooDialog.css | 94 - module/webui/themes/dark/css/dark.css | 962 ---- module/webui/themes/dark/css/log.css | 75 - module/webui/themes/dark/css/pathchooser.css | 68 - module/webui/themes/dark/css/window.css | 92 - .../themes/dark/img/MooDialog/dialog-close.png | Bin 689 -> 0 bytes .../themes/dark/img/MooDialog/dialog-error.png | Bin 1472 -> 0 bytes .../themes/dark/img/MooDialog/dialog-question.png | Bin 2073 -> 0 bytes .../themes/dark/img/MooDialog/dialog-warning.png | Bin 1651 -> 0 bytes module/webui/themes/dark/img/button.png | Bin 569 -> 0 bytes module/webui/themes/dark/img/dark-bg.jpg | Bin 40930 -> 0 bytes .../webui/themes/dark/img/default/add_folder.png | Bin 571 -> 0 bytes .../webui/themes/dark/img/default/ajax-loader.gif | Bin 404 -> 0 bytes .../themes/dark/img/default/arrow_refresh.png | Bin 685 -> 0 bytes .../webui/themes/dark/img/default/arrow_right.png | Bin 349 -> 0 bytes .../webui/themes/dark/img/default/big_button.gif | Bin 1905 -> 0 bytes .../themes/dark/img/default/big_button_over.gif | Bin 728 -> 0 bytes module/webui/themes/dark/img/default/body.png | Bin 402 -> 0 bytes module/webui/themes/dark/img/default/closebtn.gif | Bin 254 -> 0 bytes module/webui/themes/dark/img/default/cog.png | Bin 512 -> 0 bytes .../webui/themes/dark/img/default/control_add.png | Bin 446 -> 0 bytes .../themes/dark/img/default/control_add_blue.png | Bin 845 -> 0 bytes .../themes/dark/img/default/control_cancel.png | Bin 3349 -> 0 bytes .../dark/img/default/control_cancel_blue.png | Bin 787 -> 0 bytes .../themes/dark/img/default/control_pause.png | Bin 598 -> 0 bytes .../themes/dark/img/default/control_pause_blue.png | Bin 721 -> 0 bytes .../webui/themes/dark/img/default/control_play.png | Bin 592 -> 0 bytes .../themes/dark/img/default/control_play_blue.png | Bin 717 -> 0 bytes .../webui/themes/dark/img/default/control_stop.png | Bin 403 -> 0 bytes .../themes/dark/img/default/control_stop_blue.png | Bin 695 -> 0 bytes module/webui/themes/dark/img/default/delete.png | Bin 715 -> 0 bytes .../webui/themes/dark/img/default/drag_corner.gif | Bin 76 -> 0 bytes module/webui/themes/dark/img/default/error.png | Bin 701 -> 0 bytes module/webui/themes/dark/img/default/folder.png | Bin 537 -> 0 bytes module/webui/themes/dark/img/default/full.png | Bin 3543 -> 0 bytes .../webui/themes/dark/img/default/head-login.png | Bin 1288 -> 0 bytes .../dark/img/default/head-menu-collector.png | Bin 1953 -> 0 bytes .../themes/dark/img/default/head-menu-config.png | Bin 1802 -> 0 bytes .../dark/img/default/head-menu-development.png | Bin 876 -> 0 bytes .../themes/dark/img/default/head-menu-download.png | Bin 721 -> 0 bytes .../themes/dark/img/default/head-menu-home.png | Bin 920 -> 0 bytes .../themes/dark/img/default/head-menu-index.png | Bin 482 -> 0 bytes .../themes/dark/img/default/head-menu-news.png | Bin 628 -> 0 bytes .../themes/dark/img/default/head-menu-queue.png | Bin 2629 -> 0 bytes .../themes/dark/img/default/head-menu-recent.png | Bin 932 -> 0 bytes .../themes/dark/img/default/head-menu-wiki.png | Bin 1204 -> 0 bytes .../dark/img/default/head-search-noshadow.png | Bin 1187 -> 0 bytes module/webui/themes/dark/img/default/head_bg1.png | Bin 125 -> 0 bytes module/webui/themes/dark/img/default/images.png | Bin 661 -> 0 bytes module/webui/themes/dark/img/default/notice.png | Bin 778 -> 0 bytes .../webui/themes/dark/img/default/package_go.png | Bin 898 -> 0 bytes .../dark/img/default/page-tools-backlinks.png | Bin 540 -> 0 bytes .../themes/dark/img/default/page-tools-edit.png | Bin 574 -> 0 bytes .../dark/img/default/page-tools-revisions.png | Bin 603 -> 0 bytes module/webui/themes/dark/img/default/parseUri.png | Bin 666 -> 0 bytes module/webui/themes/dark/img/default/pencil.png | Bin 450 -> 0 bytes module/webui/themes/dark/img/default/reconnect.png | Bin 755 -> 0 bytes .../webui/themes/dark/img/default/status_None.png | Bin 7613 -> 0 bytes .../themes/dark/img/default/status_downloading.png | Bin 943 -> 0 bytes .../themes/dark/img/default/status_failed.png | Bin 701 -> 0 bytes .../themes/dark/img/default/status_finished.png | Bin 781 -> 0 bytes .../themes/dark/img/default/status_offline.png | Bin 700 -> 0 bytes .../webui/themes/dark/img/default/status_proc.png | Bin 512 -> 0 bytes .../webui/themes/dark/img/default/status_queue.png | Bin 7613 -> 0 bytes .../themes/dark/img/default/status_waiting.png | Bin 889 -> 0 bytes module/webui/themes/dark/img/default/success.png | Bin 781 -> 0 bytes .../themes/dark/img/default/tabs-border-bottom.png | Bin 163 -> 0 bytes .../dark/img/default/user-actions-logout.png | Bin 799 -> 0 bytes .../dark/img/default/user-actions-profile.png | Bin 628 -> 0 bytes module/webui/themes/dark/img/default/user-info.png | Bin 3963 -> 0 bytes module/webui/themes/dark/img/pyload-logo.png | Bin 6947 -> 0 bytes module/webui/themes/dark/img/tab-background.png | Bin 3044 -> 0 bytes module/webui/themes/dark/js/render/admin.coffee | 58 - module/webui/themes/dark/js/render/admin.min.js | 3 - module/webui/themes/dark/js/render/base.coffee | 177 - module/webui/themes/dark/js/render/base.min.js | 3 - module/webui/themes/dark/js/render/package.js | 376 -- module/webui/themes/dark/js/render/settings.coffee | 107 - module/webui/themes/dark/js/render/settings.min.js | 3 - module/webui/themes/dark/js/static/MooDialog.js | 140 - .../webui/themes/dark/js/static/MooDialog.min.js | 1 - module/webui/themes/dark/js/static/MooDropMenu.js | 86 - .../webui/themes/dark/js/static/MooDropMenu.min.js | 1 - .../webui/themes/dark/js/static/mootools-core.js | 5977 -------------------- .../themes/dark/js/static/mootools-core.min.js | 491 -- .../webui/themes/dark/js/static/mootools-more.js | 2856 ---------- .../themes/dark/js/static/mootools-more.min.js | 226 - module/webui/themes/dark/js/static/purr.js | 309 - module/webui/themes/dark/js/static/purr.min.js | 1 - module/webui/themes/dark/js/static/tinytab.js | 43 - module/webui/themes/dark/js/static/tinytab.min.js | 1 - module/webui/themes/dark/tml/admin.html | 98 - module/webui/themes/dark/tml/base.html | 177 - module/webui/themes/dark/tml/captcha.html | 42 - module/webui/themes/dark/tml/downloads.html | 29 - module/webui/themes/dark/tml/folder.html | 15 - module/webui/themes/dark/tml/home.html | 263 - module/webui/themes/dark/tml/info.html | 76 - module/webui/themes/dark/tml/login.html | 37 - module/webui/themes/dark/tml/logout.html | 9 - module/webui/themes/dark/tml/logs.html | 41 - module/webui/themes/dark/tml/pathchooser.html | 76 - module/webui/themes/dark/tml/queue.html | 104 - module/webui/themes/dark/tml/settings.html | 204 - module/webui/themes/dark/tml/settings_item.html | 48 - module/webui/themes/dark/tml/window.html | 52 - module/webui/themes/default/css/MooDialog.css | 91 - module/webui/themes/default/css/default.css | 902 --- module/webui/themes/default/css/log.css | 71 - module/webui/themes/default/css/pathchooser.css | 68 - module/webui/themes/default/css/window.css | 73 - .../themes/default/img/MooDialog/dialog-close.png | Bin 689 -> 0 bytes .../themes/default/img/MooDialog/dialog-error.png | Bin 1472 -> 0 bytes .../default/img/MooDialog/dialog-question.png | Bin 2073 -> 0 bytes .../default/img/MooDialog/dialog-warning.png | Bin 1651 -> 0 bytes module/webui/themes/default/img/add_folder.png | Bin 571 -> 0 bytes module/webui/themes/default/img/ajax-loader.gif | Bin 404 -> 0 bytes module/webui/themes/default/img/arrow_refresh.png | Bin 685 -> 0 bytes module/webui/themes/default/img/arrow_right.png | Bin 349 -> 0 bytes module/webui/themes/default/img/big_button.gif | Bin 1905 -> 0 bytes .../webui/themes/default/img/big_button_over.gif | Bin 728 -> 0 bytes module/webui/themes/default/img/body.png | Bin 402 -> 0 bytes module/webui/themes/default/img/button.png | Bin 452 -> 0 bytes module/webui/themes/default/img/closebtn.gif | Bin 254 -> 0 bytes module/webui/themes/default/img/cog.png | Bin 512 -> 0 bytes module/webui/themes/default/img/control_add.png | Bin 446 -> 0 bytes .../webui/themes/default/img/control_add_blue.png | Bin 845 -> 0 bytes module/webui/themes/default/img/control_cancel.png | Bin 3349 -> 0 bytes .../themes/default/img/control_cancel_blue.png | Bin 787 -> 0 bytes module/webui/themes/default/img/control_pause.png | Bin 598 -> 0 bytes .../themes/default/img/control_pause_blue.png | Bin 721 -> 0 bytes module/webui/themes/default/img/control_play.png | Bin 592 -> 0 bytes .../webui/themes/default/img/control_play_blue.png | Bin 717 -> 0 bytes module/webui/themes/default/img/control_stop.png | Bin 403 -> 0 bytes .../webui/themes/default/img/control_stop_blue.png | Bin 695 -> 0 bytes module/webui/themes/default/img/delete.png | Bin 715 -> 0 bytes module/webui/themes/default/img/drag_corner.gif | Bin 76 -> 0 bytes module/webui/themes/default/img/error.png | Bin 701 -> 0 bytes module/webui/themes/default/img/folder.png | Bin 537 -> 0 bytes module/webui/themes/default/img/full.png | Bin 3543 -> 0 bytes module/webui/themes/default/img/head-login.png | Bin 1288 -> 0 bytes .../themes/default/img/head-menu-collector.png | Bin 1953 -> 0 bytes .../webui/themes/default/img/head-menu-config.png | Bin 1802 -> 0 bytes .../themes/default/img/head-menu-development.png | Bin 876 -> 0 bytes .../themes/default/img/head-menu-download.png | Bin 721 -> 0 bytes module/webui/themes/default/img/head-menu-home.png | Bin 920 -> 0 bytes .../webui/themes/default/img/head-menu-index.png | Bin 482 -> 0 bytes module/webui/themes/default/img/head-menu-news.png | Bin 628 -> 0 bytes .../webui/themes/default/img/head-menu-queue.png | Bin 2629 -> 0 bytes .../webui/themes/default/img/head-menu-recent.png | Bin 932 -> 0 bytes module/webui/themes/default/img/head-menu-wiki.png | Bin 1204 -> 0 bytes .../themes/default/img/head-search-noshadow.png | Bin 1187 -> 0 bytes module/webui/themes/default/img/head_bg1.png | Bin 125 -> 0 bytes module/webui/themes/default/img/images.png | Bin 661 -> 0 bytes module/webui/themes/default/img/notice.png | Bin 778 -> 0 bytes module/webui/themes/default/img/package_go.png | Bin 898 -> 0 bytes .../themes/default/img/page-tools-backlinks.png | Bin 540 -> 0 bytes .../webui/themes/default/img/page-tools-edit.png | Bin 574 -> 0 bytes .../themes/default/img/page-tools-revisions.png | Bin 603 -> 0 bytes module/webui/themes/default/img/parseUri.png | Bin 666 -> 0 bytes module/webui/themes/default/img/pencil.png | Bin 450 -> 0 bytes module/webui/themes/default/img/pyload-logo.png | Bin 8457 -> 0 bytes module/webui/themes/default/img/reconnect.png | Bin 755 -> 0 bytes module/webui/themes/default/img/status_None.png | Bin 7613 -> 0 bytes .../themes/default/img/status_downloading.png | Bin 943 -> 0 bytes module/webui/themes/default/img/status_failed.png | Bin 701 -> 0 bytes .../webui/themes/default/img/status_finished.png | Bin 781 -> 0 bytes module/webui/themes/default/img/status_offline.png | Bin 700 -> 0 bytes module/webui/themes/default/img/status_proc.png | Bin 512 -> 0 bytes module/webui/themes/default/img/status_queue.png | Bin 7613 -> 0 bytes module/webui/themes/default/img/status_waiting.png | Bin 889 -> 0 bytes module/webui/themes/default/img/success.png | Bin 781 -> 0 bytes module/webui/themes/default/img/tab-background.png | Bin 179 -> 0 bytes .../themes/default/img/tabs-border-bottom.png | Bin 163 -> 0 bytes .../themes/default/img/user-actions-logout.png | Bin 799 -> 0 bytes .../themes/default/img/user-actions-profile.png | Bin 628 -> 0 bytes module/webui/themes/default/img/user-info.png | Bin 3963 -> 0 bytes module/webui/themes/default/js/render/admin.coffee | 58 - module/webui/themes/default/js/render/admin.min.js | 3 - module/webui/themes/default/js/render/base.coffee | 177 - module/webui/themes/default/js/render/base.min.js | 3 - .../webui/themes/default/js/render/filemanager.js | 291 - module/webui/themes/default/js/render/package.js | 376 -- .../webui/themes/default/js/render/settings.coffee | 107 - .../webui/themes/default/js/render/settings.min.js | 3 - module/webui/themes/default/js/static/MooDialog.js | 140 - .../themes/default/js/static/MooDialog.min.js | 1 - .../webui/themes/default/js/static/MooDropMenu.js | 86 - .../themes/default/js/static/MooDropMenu.min.js | 1 - .../themes/default/js/static/mootools-core.js | 5977 -------------------- .../themes/default/js/static/mootools-core.min.js | 491 -- .../themes/default/js/static/mootools-more.js | 2856 ---------- .../themes/default/js/static/mootools-more.min.js | 226 - module/webui/themes/default/js/static/purr.js | 309 - module/webui/themes/default/js/static/purr.min.js | 1 - module/webui/themes/default/js/static/tinytab.js | 43 - .../webui/themes/default/js/static/tinytab.min.js | 1 - module/webui/themes/default/tml/admin.html | 98 - module/webui/themes/default/tml/base.html | 180 - module/webui/themes/default/tml/captcha.html | 42 - module/webui/themes/default/tml/downloads.html | 29 - module/webui/themes/default/tml/filemanager.html | 78 - module/webui/themes/default/tml/folder.html | 15 - module/webui/themes/default/tml/home.html | 266 - module/webui/themes/default/tml/info.html | 81 - module/webui/themes/default/tml/login.html | 36 - module/webui/themes/default/tml/logout.html | 9 - module/webui/themes/default/tml/logs.html | 41 - module/webui/themes/default/tml/pathchooser.html | 76 - module/webui/themes/default/tml/queue.html | 104 - module/webui/themes/default/tml/settings.html | 204 - module/webui/themes/default/tml/settings_item.html | 48 - module/webui/themes/default/tml/window.html | 46 - module/webui/themes/flat/css/MooDialog.css | 84 - module/webui/themes/flat/css/flat.css | 863 --- module/webui/themes/flat/css/log.css | 72 - module/webui/themes/flat/css/pathchooser.css | 68 - module/webui/themes/flat/css/window.css | 73 - .../themes/flat/img/MooDialog/dialog-close.png | Bin 689 -> 0 bytes .../themes/flat/img/MooDialog/dialog-error.png | Bin 1472 -> 0 bytes .../themes/flat/img/MooDialog/dialog-question.png | Bin 2073 -> 0 bytes .../themes/flat/img/MooDialog/dialog-warning.png | Bin 1651 -> 0 bytes module/webui/themes/flat/img/arrow_refresh.png | Bin 119032 -> 0 bytes module/webui/themes/flat/img/arrow_right.png | Bin 136967 -> 0 bytes module/webui/themes/flat/img/button.png | Bin 569 -> 0 bytes module/webui/themes/flat/img/cog.png | Bin 137406 -> 0 bytes module/webui/themes/flat/img/control_add.png | Bin 116941 -> 0 bytes module/webui/themes/flat/img/control_add_blue.png | Bin 116941 -> 0 bytes module/webui/themes/flat/img/control_cancel.png | Bin 116939 -> 0 bytes .../webui/themes/flat/img/control_cancel_blue.png | Bin 116939 -> 0 bytes module/webui/themes/flat/img/control_pause.png | Bin 134855 -> 0 bytes .../webui/themes/flat/img/control_pause_blue.png | Bin 134855 -> 0 bytes module/webui/themes/flat/img/control_play.png | Bin 134904 -> 0 bytes module/webui/themes/flat/img/control_play_blue.png | Bin 134904 -> 0 bytes module/webui/themes/flat/img/control_stop.png | Bin 134835 -> 0 bytes module/webui/themes/flat/img/control_stop_blue.png | Bin 134835 -> 0 bytes .../webui/themes/flat/img/default/add_folder.png | Bin 571 -> 0 bytes .../webui/themes/flat/img/default/ajax-loader.gif | Bin 404 -> 0 bytes .../webui/themes/flat/img/default/big_button.gif | Bin 1905 -> 0 bytes .../themes/flat/img/default/big_button_over.gif | Bin 728 -> 0 bytes module/webui/themes/flat/img/default/body.png | Bin 402 -> 0 bytes module/webui/themes/flat/img/default/closebtn.gif | Bin 254 -> 0 bytes .../webui/themes/flat/img/default/drag_corner.gif | Bin 76 -> 0 bytes module/webui/themes/flat/img/default/full.png | Bin 3543 -> 0 bytes .../themes/flat/img/default/head-menu-recent.png | Bin 932 -> 0 bytes module/webui/themes/flat/img/default/head_bg1.png | Bin 125 -> 0 bytes module/webui/themes/flat/img/default/images.png | Bin 661 -> 0 bytes module/webui/themes/flat/img/default/parseUri.png | Bin 666 -> 0 bytes .../webui/themes/flat/img/default/pyload-logo.png | Bin 8457 -> 0 bytes .../themes/flat/img/default/tab-background.png | Bin 179 -> 0 bytes .../themes/flat/img/default/tabs-border-bottom.png | Bin 163 -> 0 bytes module/webui/themes/flat/img/delete.png | Bin 117658 -> 0 bytes module/webui/themes/flat/img/error.png | Bin 137673 -> 0 bytes module/webui/themes/flat/img/folder.png | Bin 134669 -> 0 bytes module/webui/themes/flat/img/head-login.png | Bin 137406 -> 0 bytes .../webui/themes/flat/img/head-menu-collector.png | Bin 134985 -> 0 bytes module/webui/themes/flat/img/head-menu-config.png | Bin 137664 -> 0 bytes .../themes/flat/img/head-menu-development.png | Bin 135818 -> 0 bytes .../webui/themes/flat/img/head-menu-download.png | Bin 137664 -> 0 bytes module/webui/themes/flat/img/head-menu-home.png | Bin 139387 -> 0 bytes module/webui/themes/flat/img/head-menu-index.png | Bin 136511 -> 0 bytes module/webui/themes/flat/img/head-menu-news.png | Bin 136511 -> 0 bytes module/webui/themes/flat/img/head-menu-queue.png | Bin 136269 -> 0 bytes module/webui/themes/flat/img/head-menu-wiki.png | Bin 137217 -> 0 bytes .../webui/themes/flat/img/head-search-noshadow.png | Bin 137217 -> 0 bytes module/webui/themes/flat/img/notice.png | Bin 3061 -> 0 bytes module/webui/themes/flat/img/package_go.png | Bin 136299 -> 0 bytes .../webui/themes/flat/img/page-tools-backlinks.png | Bin 138112 -> 0 bytes module/webui/themes/flat/img/page-tools-edit.png | Bin 138112 -> 0 bytes .../webui/themes/flat/img/page-tools-revisions.png | Bin 138112 -> 0 bytes module/webui/themes/flat/img/pencil.png | Bin 138112 -> 0 bytes module/webui/themes/flat/img/reconnect.png | Bin 3063 -> 0 bytes module/webui/themes/flat/img/status_None.png | Bin 138112 -> 0 bytes .../webui/themes/flat/img/status_downloading.png | Bin 3061 -> 0 bytes module/webui/themes/flat/img/status_failed.png | Bin 137673 -> 0 bytes module/webui/themes/flat/img/status_finished.png | Bin 117658 -> 0 bytes module/webui/themes/flat/img/status_offline.png | Bin 137673 -> 0 bytes module/webui/themes/flat/img/status_proc.png | Bin 137406 -> 0 bytes module/webui/themes/flat/img/status_queue.png | Bin 138112 -> 0 bytes module/webui/themes/flat/img/status_waiting.png | Bin 138112 -> 0 bytes module/webui/themes/flat/img/success.png | Bin 117658 -> 0 bytes .../webui/themes/flat/img/user-actions-logout.png | Bin 138112 -> 0 bytes .../webui/themes/flat/img/user-actions-profile.png | Bin 138112 -> 0 bytes module/webui/themes/flat/img/user-info.png | Bin 3080 -> 0 bytes module/webui/themes/flat/js/render/admin.coffee | 58 - module/webui/themes/flat/js/render/admin.min.js | 3 - module/webui/themes/flat/js/render/base.coffee | 177 - module/webui/themes/flat/js/render/base.min.js | 3 - module/webui/themes/flat/js/render/package.js | 376 -- module/webui/themes/flat/js/render/settings.coffee | 107 - module/webui/themes/flat/js/render/settings.min.js | 3 - module/webui/themes/flat/js/static/MooDialog.js | 140 - .../webui/themes/flat/js/static/MooDialog.min.js | 1 - module/webui/themes/flat/js/static/MooDropMenu.js | 86 - .../webui/themes/flat/js/static/MooDropMenu.min.js | 1 - .../webui/themes/flat/js/static/mootools-core.js | 5977 -------------------- .../themes/flat/js/static/mootools-core.min.js | 491 -- .../webui/themes/flat/js/static/mootools-more.js | 2856 ---------- .../themes/flat/js/static/mootools-more.min.js | 226 - module/webui/themes/flat/js/static/purr.js | 309 - module/webui/themes/flat/js/static/purr.min.js | 1 - module/webui/themes/flat/js/static/tinytab.js | 43 - module/webui/themes/flat/js/static/tinytab.min.js | 1 - module/webui/themes/flat/tml/admin.html | 98 - module/webui/themes/flat/tml/base.html | 177 - module/webui/themes/flat/tml/captcha.html | 42 - module/webui/themes/flat/tml/downloads.html | 29 - module/webui/themes/flat/tml/folder.html | 15 - module/webui/themes/flat/tml/home.html | 263 - module/webui/themes/flat/tml/info.html | 81 - module/webui/themes/flat/tml/login.html | 36 - module/webui/themes/flat/tml/logout.html | 9 - module/webui/themes/flat/tml/logs.html | 41 - module/webui/themes/flat/tml/pathchooser.html | 76 - module/webui/themes/flat/tml/queue.html | 104 - module/webui/themes/flat/tml/settings.html | 204 - module/webui/themes/flat/tml/settings_item.html | 48 - module/webui/themes/flat/tml/window.html | 46 - pyload-cli.py | 2 +- pyload.py | 2 +- pyload/Api.py | 1030 ++++ pyload/CaptchaManager.py | 158 + pyload/ConfigParser.py | 373 ++ pyload/Core.py | 663 +++ pyload/HookManager.py | 305 + pyload/InitHomeDir.py | 79 + pyload/PullEvents.py | 120 + pyload/PyFile.py | 284 + pyload/PyPackage.py | 79 + pyload/Scheduler.py | 141 + pyload/ThreadManager.py | 317 ++ pyload/__init__.py | 0 pyload/cli/AddPackage.py | 65 + pyload/cli/Cli.py | 585 ++ pyload/cli/Handler.py | 47 + pyload/cli/ManageFiles.py | 203 + pyload/cli/__init__.py | 4 + pyload/cli/printer.py | 25 + pyload/common/APIExerciser.py | 157 + pyload/common/ImportDebugger.py | 19 + pyload/common/JsEngine.py | 155 + pyload/common/__init__.py | 0 pyload/common/json_layer.py | 12 + pyload/common/packagetools.py | 136 + pyload/common/pavement.py | 412 ++ pyload/common/pylgettext.py | 60 + pyload/common/test_api.py | 20 + pyload/common/test_json.py | 48 + pyload/config/default.conf | 64 + pyload/database/DatabaseBackend.py | 305 + pyload/database/FileDatabase.py | 891 +++ pyload/database/StorageDatabase.py | 49 + pyload/database/UserDatabase.py | 108 + pyload/database/__init__.py | 8 + pyload/debug.py | 94 + pyload/forwarder.py | 61 + pyload/lib/BeautifulSoup.py | 2017 +++++++ pyload/lib/Getch.py | 76 + pyload/lib/MultipartPostHandler.py | 139 + pyload/lib/SafeEval.py | 47 + pyload/lib/__init__.py | 0 pyload/lib/beaker/__init__.py | 1 + pyload/lib/beaker/cache.py | 589 ++ pyload/lib/beaker/container.py | 750 +++ pyload/lib/beaker/converters.py | 29 + pyload/lib/beaker/crypto/__init__.py | 44 + pyload/lib/beaker/crypto/jcecrypto.py | 32 + pyload/lib/beaker/crypto/nsscrypto.py | 45 + pyload/lib/beaker/crypto/pbkdf2.py | 347 ++ pyload/lib/beaker/crypto/pycrypto.py | 34 + pyload/lib/beaker/crypto/util.py | 30 + pyload/lib/beaker/exceptions.py | 29 + pyload/lib/beaker/ext/__init__.py | 0 pyload/lib/beaker/ext/database.py | 174 + pyload/lib/beaker/ext/google.py | 121 + pyload/lib/beaker/ext/memcached.py | 203 + pyload/lib/beaker/ext/sqla.py | 136 + pyload/lib/beaker/middleware.py | 168 + pyload/lib/beaker/session.py | 726 +++ pyload/lib/beaker/synchronization.py | 386 ++ pyload/lib/beaker/util.py | 462 ++ pyload/lib/bottle.py | 3732 ++++++++++++ pyload/lib/feedparser.py | 4013 +++++++++++++ pyload/lib/jinja2/__init__.py | 69 + pyload/lib/jinja2/_compat.py | 150 + pyload/lib/jinja2/_stringdefs.py | 132 + pyload/lib/jinja2/bccache.py | 344 ++ pyload/lib/jinja2/compiler.py | 1640 ++++++ pyload/lib/jinja2/constants.py | 32 + pyload/lib/jinja2/debug.py | 337 ++ pyload/lib/jinja2/defaults.py | 43 + pyload/lib/jinja2/environment.py | 1191 ++++ pyload/lib/jinja2/exceptions.py | 146 + pyload/lib/jinja2/ext.py | 636 +++ pyload/lib/jinja2/filters.py | 987 ++++ pyload/lib/jinja2/lexer.py | 733 +++ pyload/lib/jinja2/loaders.py | 471 ++ pyload/lib/jinja2/meta.py | 103 + pyload/lib/jinja2/nodes.py | 914 +++ pyload/lib/jinja2/optimizer.py | 68 + pyload/lib/jinja2/parser.py | 895 +++ pyload/lib/jinja2/runtime.py | 581 ++ pyload/lib/jinja2/sandbox.py | 368 ++ pyload/lib/jinja2/tests.py | 149 + pyload/lib/jinja2/testsuite/__init__.py | 156 + pyload/lib/jinja2/testsuite/api.py | 261 + pyload/lib/jinja2/testsuite/bytecode_cache.py | 37 + pyload/lib/jinja2/testsuite/core_tags.py | 305 + pyload/lib/jinja2/testsuite/debug.py | 58 + pyload/lib/jinja2/testsuite/doctests.py | 29 + pyload/lib/jinja2/testsuite/ext.py | 459 ++ pyload/lib/jinja2/testsuite/filters.py | 515 ++ pyload/lib/jinja2/testsuite/imports.py | 141 + pyload/lib/jinja2/testsuite/inheritance.py | 250 + pyload/lib/jinja2/testsuite/lexnparse.py | 593 ++ pyload/lib/jinja2/testsuite/loader.py | 226 + pyload/lib/jinja2/testsuite/regression.py | 279 + pyload/lib/jinja2/testsuite/res/__init__.py | 0 .../lib/jinja2/testsuite/res/templates/broken.html | 3 + .../jinja2/testsuite/res/templates/foo/test.html | 1 + .../testsuite/res/templates/syntaxerror.html | 4 + .../lib/jinja2/testsuite/res/templates/test.html | 1 + pyload/lib/jinja2/testsuite/security.py | 166 + pyload/lib/jinja2/testsuite/tests.py | 93 + pyload/lib/jinja2/testsuite/utils.py | 82 + pyload/lib/jinja2/utils.py | 520 ++ pyload/lib/jinja2/visitor.py | 87 + pyload/lib/markupsafe/__init__.py | 298 + pyload/lib/markupsafe/_compat.py | 26 + pyload/lib/markupsafe/_constants.py | 267 + pyload/lib/markupsafe/_native.py | 46 + pyload/lib/markupsafe/_speedups.c | 239 + pyload/lib/markupsafe/tests.py | 179 + pyload/lib/rename_process.py | 14 + pyload/lib/simplejson/__init__.py | 560 ++ pyload/lib/simplejson/compat.py | 46 + pyload/lib/simplejson/decoder.py | 393 ++ pyload/lib/simplejson/encoder.py | 648 +++ pyload/lib/simplejson/ordered_dict.py | 119 + pyload/lib/simplejson/scanner.py | 133 + pyload/lib/simplejson/tool.py | 42 + pyload/lib/thrift/TSCons.py | 35 + pyload/lib/thrift/TSerialization.py | 38 + pyload/lib/thrift/TTornado.py | 153 + pyload/lib/thrift/Thrift.py | 170 + pyload/lib/thrift/__init__.py | 20 + pyload/lib/thrift/protocol/TBase.py | 81 + pyload/lib/thrift/protocol/TBinaryProtocol.py | 260 + pyload/lib/thrift/protocol/TCompactProtocol.py | 403 ++ pyload/lib/thrift/protocol/TJSONProtocol.py | 550 ++ pyload/lib/thrift/protocol/TProtocol.py | 406 ++ pyload/lib/thrift/protocol/__init__.py | 20 + pyload/lib/thrift/protocol/fastbinary.c | 1219 ++++ pyload/lib/thrift/server/THttpServer.py | 87 + pyload/lib/thrift/server/TNonblockingServer.py | 346 ++ pyload/lib/thrift/server/TProcessPoolServer.py | 118 + pyload/lib/thrift/server/TServer.py | 269 + pyload/lib/thrift/server/__init__.py | 20 + pyload/lib/thrift/transport/THttpClient.py | 149 + pyload/lib/thrift/transport/TSSLSocket.py | 214 + pyload/lib/thrift/transport/TSocket.py | 176 + pyload/lib/thrift/transport/TTransport.py | 330 ++ pyload/lib/thrift/transport/TTwisted.py | 221 + pyload/lib/thrift/transport/TZlibTransport.py | 248 + pyload/lib/thrift/transport/__init__.py | 20 + pyload/lib/wsgiserver/LICENSE.txt | 25 + pyload/lib/wsgiserver/__init__.py | 2299 ++++++++ pyload/network/Browser.py | 132 + pyload/network/Bucket.py | 59 + pyload/network/CookieJar.py | 50 + pyload/network/HTTPChunk.py | 292 + pyload/network/HTTPDownload.py | 325 ++ pyload/network/HTTPRequest.py | 303 + pyload/network/RequestFactory.py | 126 + pyload/network/XDCCRequest.py | 159 + pyload/network/__init__.py | 1 + pyload/plugins/Account.py | 281 + pyload/plugins/AccountManager.py | 173 + pyload/plugins/Container.py | 61 + pyload/plugins/Crypter.py | 64 + pyload/plugins/Hook.py | 149 + pyload/plugins/Hoster.py | 20 + pyload/plugins/OCR.py | 299 + pyload/plugins/Plugin.py | 629 ++ pyload/plugins/PluginManager.py | 356 ++ pyload/plugins/README.md | 16 + pyload/plugins/__init__.py | 0 pyload/plugins/accounts/AlldebridCom.py | 58 + pyload/plugins/accounts/BayfilesCom.py | 36 + pyload/plugins/accounts/BitshareCom.py | 31 + pyload/plugins/accounts/CramitIn.py | 15 + pyload/plugins/accounts/CyberlockerCh.py | 35 + pyload/plugins/accounts/CzshareCom.py | 41 + pyload/plugins/accounts/DebridItaliaCom.py | 36 + pyload/plugins/accounts/DepositfilesCom.py | 32 + pyload/plugins/accounts/EasybytezCom.py | 61 + pyload/plugins/accounts/EgoFilesCom.py | 44 + pyload/plugins/accounts/EuroshareEu.py | 41 + pyload/plugins/accounts/FastixRu.py | 36 + pyload/plugins/accounts/FastshareCz.py | 41 + pyload/plugins/accounts/File4safeCom.py | 18 + pyload/plugins/accounts/FilecloudIo.py | 57 + pyload/plugins/accounts/FilefactoryCom.py | 46 + pyload/plugins/accounts/FilejungleCom.py | 47 + pyload/plugins/accounts/FilerNet.py | 49 + pyload/plugins/accounts/FilerioCom.py | 15 + pyload/plugins/accounts/FilesMailRu.py | 27 + pyload/plugins/accounts/FileserveCom.py | 43 + pyload/plugins/accounts/FourSharedCom.py | 34 + pyload/plugins/accounts/FreakshareCom.py | 39 + pyload/plugins/accounts/FreeWayMe.py | 52 + pyload/plugins/accounts/FshareVn.py | 59 + pyload/plugins/accounts/Ftp.py | 16 + pyload/plugins/accounts/HellshareCz.py | 74 + pyload/plugins/accounts/HotfileCom.py | 74 + pyload/plugins/accounts/Http.py | 16 + pyload/plugins/accounts/LetitbitNet.py | 33 + pyload/plugins/accounts/LinksnappyCom.py | 49 + pyload/plugins/accounts/MegaDebridEu.py | 37 + pyload/plugins/accounts/MegasharesCom.py | 46 + pyload/plugins/accounts/MovReelCom.py | 21 + pyload/plugins/accounts/MultiDebridCom.py | 34 + pyload/plugins/accounts/MultishareCz.py | 44 + pyload/plugins/accounts/NetloadIn.py | 38 + pyload/plugins/accounts/OboomCom.py | 53 + pyload/plugins/accounts/OneFichierCom.py | 48 + pyload/plugins/accounts/OverLoadMe.py | 35 + pyload/plugins/accounts/Premium4Me.py | 29 + pyload/plugins/accounts/PremiumizeMe.py | 46 + pyload/plugins/accounts/QuickshareCz.py | 39 + pyload/plugins/accounts/RPNetBiz.py | 49 + pyload/plugins/accounts/RapidgatorNet.py | 56 + pyload/plugins/accounts/RapidshareCom.py | 54 + pyload/plugins/accounts/RarefileNet.py | 15 + pyload/plugins/accounts/RealdebridCom.py | 35 + pyload/plugins/accounts/RehostTo.py | 37 + pyload/plugins/accounts/RyushareCom.py | 23 + pyload/plugins/accounts/ShareRapidCom.py | 52 + pyload/plugins/accounts/ShareonlineBiz.py | 42 + pyload/plugins/accounts/SimplyPremiumCom.py | 45 + pyload/plugins/accounts/SimplydebridCom.py | 33 + pyload/plugins/accounts/StahnuTo.py | 34 + pyload/plugins/accounts/TurbobitNet.py | 41 + pyload/plugins/accounts/UlozTo.py | 45 + pyload/plugins/accounts/UnrestrictLi.py | 43 + pyload/plugins/accounts/UploadedTo.py | 53 + pyload/plugins/accounts/UploadheroCom.py | 40 + pyload/plugins/accounts/UploadingCom.py | 40 + pyload/plugins/accounts/UptoboxCom.py | 17 + pyload/plugins/accounts/YibaishiwuCom.py | 38 + pyload/plugins/accounts/ZeveraCom.py | 54 + pyload/plugins/accounts/__init__.py | 0 pyload/plugins/container/CCF.py | 43 + pyload/plugins/container/DLC_25.pyc | Bin 0 -> 8340 bytes pyload/plugins/container/DLC_26.pyc | Bin 0 -> 8313 bytes pyload/plugins/container/DLC_27.pyc | Bin 0 -> 8237 bytes pyload/plugins/container/LinkList.py | 73 + pyload/plugins/container/RSDF.py | 51 + pyload/plugins/container/__init__.py | 0 pyload/plugins/crypter/BitshareComFolder.py | 18 + pyload/plugins/crypter/C1neonCom.py | 15 + pyload/plugins/crypter/ChipDe.py | 27 + pyload/plugins/crypter/CrockoComFolder.py | 17 + pyload/plugins/crypter/CryptItCom.py | 15 + pyload/plugins/crypter/CzshareComFolder.py | 31 + pyload/plugins/crypter/DDLMusicOrg.py | 48 + pyload/plugins/crypter/DailymotionBatch.py | 98 + pyload/plugins/crypter/DataHuFolder.py | 43 + pyload/plugins/crypter/DdlstorageComFolder.py | 18 + pyload/plugins/crypter/DepositfilesComFolder.py | 17 + pyload/plugins/crypter/Dereferer.py | 24 + pyload/plugins/crypter/DlProtectCom.py | 62 + pyload/plugins/crypter/DontKnowMe.py | 26 + pyload/plugins/crypter/DuckCryptInfo.py | 59 + pyload/plugins/crypter/DuploadOrgFolder.py | 17 + pyload/plugins/crypter/EasybytezComFolder.py | 20 + pyload/plugins/crypter/EmbeduploadCom.py | 55 + pyload/plugins/crypter/FilebeerInfoFolder.py | 15 + pyload/plugins/crypter/FilecloudIoFolder.py | 18 + pyload/plugins/crypter/FilefactoryComFolder.py | 25 + pyload/plugins/crypter/FilerNetFolder.py | 22 + pyload/plugins/crypter/FileserveComFolder.py | 37 + pyload/plugins/crypter/FilestubeCom.py | 18 + pyload/plugins/crypter/FiletramCom.py | 18 + pyload/plugins/crypter/FiredriveComFolder.py | 28 + pyload/plugins/crypter/FourChanOrg.py | 25 + pyload/plugins/crypter/FreakhareComFolder.py | 35 + pyload/plugins/crypter/FreetexthostCom.py | 25 + pyload/plugins/crypter/FshareVnFolder.py | 17 + pyload/plugins/crypter/GooGl.py | 29 + pyload/plugins/crypter/HoerbuchIn.py | 57 + pyload/plugins/crypter/HotfileFolderCom.py | 30 + pyload/plugins/crypter/ILoadTo.py | 15 + pyload/plugins/crypter/ImgurComAlbum.py | 24 + pyload/plugins/crypter/LetitbitNetFolder.py | 32 + pyload/plugins/crypter/LinkSaveIn.py | 225 + pyload/plugins/crypter/LinkdecrypterCom.py | 91 + pyload/plugins/crypter/LixIn.py | 59 + pyload/plugins/crypter/LofCc.py | 15 + pyload/plugins/crypter/MBLinkInfo.py | 15 + pyload/plugins/crypter/MediafireComFolder.py | 56 + pyload/plugins/crypter/Movie2kTo.py | 15 + pyload/plugins/crypter/MultiUpOrg.py | 35 + pyload/plugins/crypter/MultiloadCz.py | 42 + pyload/plugins/crypter/MultiuploadCom.py | 64 + pyload/plugins/crypter/NCryptIn.py | 303 + pyload/plugins/crypter/NetfolderIn.py | 73 + pyload/plugins/crypter/NosvideoCom.py | 18 + pyload/plugins/crypter/OneKhDe.py | 38 + pyload/plugins/crypter/OronComFolder.py | 15 + pyload/plugins/crypter/PastebinCom.py | 18 + pyload/plugins/crypter/QuickshareCzFolder.py | 31 + pyload/plugins/crypter/RSLayerCom.py | 15 + pyload/plugins/crypter/RelinkUs.py | 263 + pyload/plugins/crypter/SafelinkingNet.py | 82 + pyload/plugins/crypter/SecuredIn.py | 15 + pyload/plugins/crypter/SerienjunkiesOrg.py | 324 ++ pyload/plugins/crypter/ShareLinksBiz.py | 269 + pyload/plugins/crypter/ShareRapidComFolder.py | 17 + pyload/plugins/crypter/SpeedLoadOrgFolder.py | 15 + pyload/plugins/crypter/StealthTo.py | 15 + pyload/plugins/crypter/TnyCz.py | 24 + pyload/plugins/crypter/TrailerzoneInfo.py | 15 + pyload/plugins/crypter/TurbobitNetFolder.py | 39 + pyload/plugins/crypter/TusfilesNetFolder.py | 40 + pyload/plugins/crypter/UlozToFolder.py | 45 + pyload/plugins/crypter/UploadableChFolder.py | 21 + pyload/plugins/crypter/UploadedToFolder.py | 38 + pyload/plugins/crypter/WiiReloadedOrg.py | 15 + pyload/plugins/crypter/XupPl.py | 23 + pyload/plugins/crypter/YoutubeBatch.py | 138 + pyload/plugins/crypter/__init__.py | 0 pyload/plugins/hooks/AlldebridCom.py | 28 + pyload/plugins/hooks/BypassCaptcha.py | 127 + pyload/plugins/hooks/Captcha9kw.py | 156 + pyload/plugins/hooks/CaptchaBrotherhood.py | 157 + pyload/plugins/hooks/Checksum.py | 175 + pyload/plugins/hooks/ClickAndLoad.py | 76 + pyload/plugins/hooks/DeathByCaptcha.py | 202 + pyload/plugins/hooks/DebridItaliaCom.py | 29 + pyload/plugins/hooks/DeleteFinished.py | 69 + pyload/plugins/hooks/DownloadScheduler.py | 75 + pyload/plugins/hooks/EasybytezCom.py | 37 + pyload/plugins/hooks/Ev0InFetcher.py | 81 + pyload/plugins/hooks/ExpertDecoders.py | 94 + pyload/plugins/hooks/ExternalScripts.py | 104 + pyload/plugins/hooks/ExtractArchive.py | 320 ++ pyload/plugins/hooks/FastixRu.py | 28 + pyload/plugins/hooks/FreeWayMe.py | 26 + pyload/plugins/hooks/HotFolder.py | 65 + pyload/plugins/hooks/IRCInterface.py | 404 ++ pyload/plugins/hooks/ImageTyperz.py | 143 + pyload/plugins/hooks/LinkdecrypterCom.py | 55 + pyload/plugins/hooks/LinksnappyCom.py | 28 + pyload/plugins/hooks/MegaDebridEu.py | 31 + pyload/plugins/hooks/MergeFiles.py | 76 + pyload/plugins/hooks/MultiDebridCom.py | 29 + pyload/plugins/hooks/MultiHome.py | 75 + pyload/plugins/hooks/MultishareCz.py | 27 + pyload/plugins/hooks/OverLoadMe.py | 31 + pyload/plugins/hooks/Premium4Me.py | 34 + pyload/plugins/hooks/PremiumizeMe.py | 54 + pyload/plugins/hooks/RPNetBiz.py | 52 + pyload/plugins/hooks/RealdebridCom.py | 28 + pyload/plugins/hooks/RehostTo.py | 40 + pyload/plugins/hooks/RestartFailed.py | 42 + pyload/plugins/hooks/SimplyPremiumCom.py | 30 + pyload/plugins/hooks/SimplydebridCom.py | 23 + pyload/plugins/hooks/UnSkipOnFail.py | 85 + pyload/plugins/hooks/UnrestrictLi.py | 31 + pyload/plugins/hooks/UpdateManager.py | 281 + pyload/plugins/hooks/WindowsPhoneToastNotify.py | 59 + pyload/plugins/hooks/XFileSharingPro.py | 78 + pyload/plugins/hooks/XMPPInterface.py | 233 + pyload/plugins/hooks/ZeveraCom.py | 23 + pyload/plugins/hooks/__init__.py | 0 pyload/plugins/hoster/AlldebridCom.py | 87 + pyload/plugins/hoster/BasePlugin.py | 116 + pyload/plugins/hoster/BayfilesCom.py | 84 + pyload/plugins/hoster/BezvadataCz.py | 87 + pyload/plugins/hoster/BillionuploadsCom.py | 23 + pyload/plugins/hoster/BitshareCom.py | 151 + pyload/plugins/hoster/BoltsharingCom.py | 18 + pyload/plugins/hoster/CatShareNet.py | 44 + pyload/plugins/hoster/CloudzerNet.py | 18 + pyload/plugins/hoster/CramitIn.py | 27 + pyload/plugins/hoster/CrockoCom.py | 75 + pyload/plugins/hoster/CyberlockerCh.py | 18 + pyload/plugins/hoster/CzshareCom.py | 148 + pyload/plugins/hoster/DailymotionCom.py | 111 + pyload/plugins/hoster/DataHu.py | 41 + pyload/plugins/hoster/DataportCz.py | 56 + pyload/plugins/hoster/DateiTo.py | 83 + pyload/plugins/hoster/DdlstorageCom.py | 18 + pyload/plugins/hoster/DebridItaliaCom.py | 49 + pyload/plugins/hoster/DepositfilesCom.py | 129 + pyload/plugins/hoster/DlFreeFr.py | 205 + pyload/plugins/hoster/DuploadOrg.py | 22 + pyload/plugins/hoster/EasybytezCom.py | 31 + pyload/plugins/hoster/EdiskCz.py | 54 + pyload/plugins/hoster/EgoFilesCom.py | 89 + pyload/plugins/hoster/EpicShareNet.py | 26 + pyload/plugins/hoster/EuroshareEu.py | 64 + pyload/plugins/hoster/ExtabitCom.py | 77 + pyload/plugins/hoster/FastixRu.py | 71 + pyload/plugins/hoster/FastshareCz.py | 88 + pyload/plugins/hoster/File4safeCom.py | 40 + pyload/plugins/hoster/FileApeCom.py | 18 + pyload/plugins/hoster/FileParadoxIn.py | 25 + pyload/plugins/hoster/FileStoreTo.py | 34 + pyload/plugins/hoster/FilebeerInfo.py | 18 + pyload/plugins/hoster/FilecloudIo.py | 115 + pyload/plugins/hoster/FilefactoryCom.py | 106 + pyload/plugins/hoster/FilejungleCom.py | 28 + pyload/plugins/hoster/FileomCom.py | 39 + pyload/plugins/hoster/FilepostCom.py | 129 + pyload/plugins/hoster/FilerNet.py | 109 + pyload/plugins/hoster/FilerioCom.py | 27 + pyload/plugins/hoster/FilesMailRu.py | 101 + pyload/plugins/hoster/FileserveCom.py | 209 + pyload/plugins/hoster/FileshareInUa.py | 83 + pyload/plugins/hoster/FilezyNet.py | 42 + pyload/plugins/hoster/FiredriveCom.py | 51 + pyload/plugins/hoster/FlyFilesNet.py | 46 + pyload/plugins/hoster/FourSharedCom.py | 59 + pyload/plugins/hoster/FreakshareCom.py | 173 + pyload/plugins/hoster/FreeWayMe.py | 35 + pyload/plugins/hoster/FreevideoCz.py | 18 + pyload/plugins/hoster/FshareVn.py | 120 + pyload/plugins/hoster/Ftp.py | 74 + pyload/plugins/hoster/GamefrontCom.py | 84 + pyload/plugins/hoster/GigapetaCom.py | 64 + pyload/plugins/hoster/GooIm.py | 36 + pyload/plugins/hoster/HellshareCz.py | 47 + pyload/plugins/hoster/HellspyCz.py | 18 + pyload/plugins/hoster/HotfileCom.py | 18 + pyload/plugins/hoster/HugefilesNet.py | 25 + pyload/plugins/hoster/HundredEightyUploadCom.py | 26 + pyload/plugins/hoster/IFileWs.py | 23 + pyload/plugins/hoster/IcyFilesCom.py | 18 + pyload/plugins/hoster/IfileIt.py | 62 + pyload/plugins/hoster/IfolderRu.py | 75 + pyload/plugins/hoster/JumbofilesCom.py | 36 + pyload/plugins/hoster/Keep2shareCC.py | 110 + pyload/plugins/hoster/LemUploadsCom.py | 26 + pyload/plugins/hoster/LetitbitNet.py | 160 + pyload/plugins/hoster/LinksnappyCom.py | 72 + pyload/plugins/hoster/LoadTo.py | 69 + pyload/plugins/hoster/LomafileCom.py | 61 + pyload/plugins/hoster/LuckyShareNet.py | 75 + pyload/plugins/hoster/MediafireCom.py | 125 + pyload/plugins/hoster/MegaDebridEu.py | 89 + pyload/plugins/hoster/MegaFilesSe.py | 23 + pyload/plugins/hoster/MegaNz.py | 132 + pyload/plugins/hoster/MegacrypterCom.py | 53 + pyload/plugins/hoster/MegareleaseOrg.py | 22 + pyload/plugins/hoster/MegasharesCom.py | 105 + pyload/plugins/hoster/MovReelCom.py | 24 + pyload/plugins/hoster/MultiDebridCom.py | 45 + pyload/plugins/hoster/MultishareCz.py | 72 + pyload/plugins/hoster/MyvideoDe.py | 45 + pyload/plugins/hoster/NarodRu.py | 60 + pyload/plugins/hoster/NetloadIn.py | 258 + pyload/plugins/hoster/NosuploadCom.py | 42 + pyload/plugins/hoster/NovafileCom.py | 33 + pyload/plugins/hoster/NowDownloadEu.py | 60 + pyload/plugins/hoster/OboomCom.py | 132 + pyload/plugins/hoster/OneFichierCom.py | 90 + pyload/plugins/hoster/OverLoadMe.py | 82 + pyload/plugins/hoster/PandaPlanet.py | 28 + pyload/plugins/hoster/PornhostCom.py | 76 + pyload/plugins/hoster/PornhubCom.py | 85 + pyload/plugins/hoster/PotloadCom.py | 22 + pyload/plugins/hoster/Premium4Me.py | 72 + pyload/plugins/hoster/PremiumizeMe.py | 55 + pyload/plugins/hoster/PromptfileCom.py | 45 + pyload/plugins/hoster/QuickshareCz.py | 92 + pyload/plugins/hoster/RPNetBiz.py | 80 + pyload/plugins/hoster/RapidgatorNet.py | 191 + pyload/plugins/hoster/RapidshareCom.py | 223 + pyload/plugins/hoster/RarefileNet.py | 39 + pyload/plugins/hoster/RealdebridCom.py | 91 + pyload/plugins/hoster/RedtubeCom.py | 58 + pyload/plugins/hoster/RehostTo.py | 41 + pyload/plugins/hoster/RemixshareCom.py | 59 + pyload/plugins/hoster/RgHostNet.py | 32 + pyload/plugins/hoster/RyushareCom.py | 85 + pyload/plugins/hoster/SecureUploadEu.py | 23 + pyload/plugins/hoster/SendmywayCom.py | 23 + pyload/plugins/hoster/SendspaceCom.py | 60 + pyload/plugins/hoster/Share4webCom.py | 21 + pyload/plugins/hoster/Share76Com.py | 18 + pyload/plugins/hoster/ShareFilesCo.py | 18 + pyload/plugins/hoster/ShareRapidCom.py | 66 + pyload/plugins/hoster/SharebeesCom.py | 18 + pyload/plugins/hoster/ShareonlineBiz.py | 199 + pyload/plugins/hoster/ShareplaceCom.py | 84 + pyload/plugins/hoster/ShragleCom.py | 18 + pyload/plugins/hoster/SimplyPremiumCom.py | 81 + pyload/plugins/hoster/SimplydebridCom.py | 62 + pyload/plugins/hoster/SockshareCom.py | 88 + pyload/plugins/hoster/SoundcloudCom.py | 57 + pyload/plugins/hoster/SpeedLoadOrg.py | 18 + pyload/plugins/hoster/SpeedfileCz.py | 18 + pyload/plugins/hoster/SpeedyshareCom.py | 43 + pyload/plugins/hoster/StreamCz.py | 70 + pyload/plugins/hoster/StreamcloudEu.py | 124 + pyload/plugins/hoster/TurbobitNet.py | 167 + pyload/plugins/hoster/TurbouploadCom.py | 18 + pyload/plugins/hoster/TusfilesNet.py | 31 + pyload/plugins/hoster/TwoSharedCom.py | 39 + pyload/plugins/hoster/UlozTo.py | 158 + pyload/plugins/hoster/UloziskoSk.py | 70 + pyload/plugins/hoster/UnibytesCom.py | 71 + pyload/plugins/hoster/UnrestrictLi.py | 89 + pyload/plugins/hoster/UploadStationCom.py | 18 + pyload/plugins/hoster/UploadedTo.py | 240 + pyload/plugins/hoster/UploadheroCom.py | 77 + pyload/plugins/hoster/UploadingCom.py | 99 + pyload/plugins/hoster/UpstoreNet.py | 75 + pyload/plugins/hoster/UptoboxCom.py | 69 + pyload/plugins/hoster/VeehdCom.py | 79 + pyload/plugins/hoster/VeohCom.py | 51 + pyload/plugins/hoster/VidPlayNet.py | 27 + pyload/plugins/hoster/VimeoCom.py | 72 + pyload/plugins/hoster/Vipleech4uCom.py | 18 + pyload/plugins/hoster/WarserverCz.py | 18 + pyload/plugins/hoster/WebshareCz.py | 60 + pyload/plugins/hoster/WrzucTo.py | 51 + pyload/plugins/hoster/WuploadCom.py | 18 + pyload/plugins/hoster/X7To.py | 18 + pyload/plugins/hoster/XFileSharingPro.py | 324 ++ pyload/plugins/hoster/XHamsterCom.py | 123 + pyload/plugins/hoster/XVideosCom.py | 28 + pyload/plugins/hoster/Xdcc.py | 205 + pyload/plugins/hoster/YibaishiwuCom.py | 54 + pyload/plugins/hoster/YoupornCom.py | 56 + pyload/plugins/hoster/YourfilesTo.py | 81 + pyload/plugins/hoster/YoutubeCom.py | 180 + pyload/plugins/hoster/ZDF.py | 56 + pyload/plugins/hoster/ZeveraCom.py | 108 + pyload/plugins/hoster/ZippyshareCom.py | 74 + pyload/plugins/hoster/__init__.py | 0 pyload/plugins/internal/AbstractExtractor.py | 101 + pyload/plugins/internal/CaptchaService.py | 96 + pyload/plugins/internal/DeadCrypter.py | 19 + pyload/plugins/internal/DeadHoster.py | 27 + pyload/plugins/internal/MultiHoster.py | 192 + pyload/plugins/internal/SimpleCrypter.py | 118 + pyload/plugins/internal/SimpleHoster.py | 292 + pyload/plugins/internal/UnRar.py | 212 + pyload/plugins/internal/UnZip.py | 38 + pyload/plugins/internal/XFSPAccount.py | 69 + pyload/plugins/internal/__init__.py | 0 pyload/plugins/ocr/GigasizeCom.py | 23 + pyload/plugins/ocr/LinksaveIn.py | 149 + pyload/plugins/ocr/NetloadIn.py | 27 + pyload/plugins/ocr/ShareonlineBiz.py | 38 + pyload/plugins/ocr/__init__.py | 0 pyload/remote/ClickAndLoadBackend.py | 170 + pyload/remote/RemoteManager.py | 91 + pyload/remote/SocketBackend.py | 25 + pyload/remote/ThriftBackend.py | 56 + pyload/remote/__init__.py | 3 + pyload/remote/socketbackend/__init__.py | 0 pyload/remote/socketbackend/create_ttypes.py | 86 + pyload/remote/socketbackend/ttypes.py | 381 ++ pyload/remote/thriftbackend/Processor.py | 77 + pyload/remote/thriftbackend/Protocol.py | 30 + pyload/remote/thriftbackend/Socket.py | 129 + pyload/remote/thriftbackend/ThriftClient.py | 87 + pyload/remote/thriftbackend/ThriftTest.py | 91 + pyload/remote/thriftbackend/Transport.py | 37 + pyload/remote/thriftbackend/__init__.py | 0 pyload/remote/thriftbackend/pyload.thrift | 337 ++ pyload/remote/thriftbackend/thriftgen/__init__.py | 0 .../thriftbackend/thriftgen/pyload/Pyload-remote | 570 ++ .../thriftbackend/thriftgen/pyload/Pyload.py | 5533 ++++++++++++++++++ .../thriftbackend/thriftgen/pyload/__init__.py | 3 + .../thriftbackend/thriftgen/pyload/constants.py | 10 + .../thriftbackend/thriftgen/pyload/ttypes.py | 834 +++ pyload/setup.py | 538 ++ pyload/threads/PluginThread.py | 675 +++ pyload/threads/ServerThread.py | 108 + pyload/threads/__init__.py | 0 pyload/unescape.py | 3 + pyload/utils.py | 227 + pyload/webui/__init__.py | 147 + pyload/webui/app/__init__.py | 3 + pyload/webui/app/api.py | 101 + pyload/webui/app/cnl.py | 168 + pyload/webui/app/json.py | 311 + pyload/webui/app/pyload.py | 544 ++ pyload/webui/app/utils.py | 138 + pyload/webui/filters.py | 61 + pyload/webui/middlewares.py | 132 + pyload/webui/servers/lighttpd_default.conf | 153 + pyload/webui/servers/nginx_default.conf | 87 + pyload/webui/themes/dark/css/MooDialog.css | 94 + pyload/webui/themes/dark/css/dark.css | 962 ++++ pyload/webui/themes/dark/css/log.css | 75 + pyload/webui/themes/dark/css/pathchooser.css | 68 + pyload/webui/themes/dark/css/window.css | 92 + .../themes/dark/img/MooDialog/dialog-close.png | Bin 0 -> 689 bytes .../themes/dark/img/MooDialog/dialog-error.png | Bin 0 -> 1472 bytes .../themes/dark/img/MooDialog/dialog-question.png | Bin 0 -> 2073 bytes .../themes/dark/img/MooDialog/dialog-warning.png | Bin 0 -> 1651 bytes pyload/webui/themes/dark/img/button.png | Bin 0 -> 569 bytes pyload/webui/themes/dark/img/dark-bg.jpg | Bin 0 -> 40930 bytes .../webui/themes/dark/img/default/add_folder.png | Bin 0 -> 571 bytes .../webui/themes/dark/img/default/ajax-loader.gif | Bin 0 -> 404 bytes .../themes/dark/img/default/arrow_refresh.png | Bin 0 -> 685 bytes .../webui/themes/dark/img/default/arrow_right.png | Bin 0 -> 349 bytes .../webui/themes/dark/img/default/big_button.gif | Bin 0 -> 1905 bytes .../themes/dark/img/default/big_button_over.gif | Bin 0 -> 728 bytes pyload/webui/themes/dark/img/default/body.png | Bin 0 -> 402 bytes pyload/webui/themes/dark/img/default/closebtn.gif | Bin 0 -> 254 bytes pyload/webui/themes/dark/img/default/cog.png | Bin 0 -> 512 bytes .../webui/themes/dark/img/default/control_add.png | Bin 0 -> 446 bytes .../themes/dark/img/default/control_add_blue.png | Bin 0 -> 845 bytes .../themes/dark/img/default/control_cancel.png | Bin 0 -> 3349 bytes .../dark/img/default/control_cancel_blue.png | Bin 0 -> 787 bytes .../themes/dark/img/default/control_pause.png | Bin 0 -> 598 bytes .../themes/dark/img/default/control_pause_blue.png | Bin 0 -> 721 bytes .../webui/themes/dark/img/default/control_play.png | Bin 0 -> 592 bytes .../themes/dark/img/default/control_play_blue.png | Bin 0 -> 717 bytes .../webui/themes/dark/img/default/control_stop.png | Bin 0 -> 403 bytes .../themes/dark/img/default/control_stop_blue.png | Bin 0 -> 695 bytes pyload/webui/themes/dark/img/default/delete.png | Bin 0 -> 715 bytes .../webui/themes/dark/img/default/drag_corner.gif | Bin 0 -> 76 bytes pyload/webui/themes/dark/img/default/error.png | Bin 0 -> 701 bytes pyload/webui/themes/dark/img/default/folder.png | Bin 0 -> 537 bytes pyload/webui/themes/dark/img/default/full.png | Bin 0 -> 3543 bytes .../webui/themes/dark/img/default/head-login.png | Bin 0 -> 1288 bytes .../dark/img/default/head-menu-collector.png | Bin 0 -> 1953 bytes .../themes/dark/img/default/head-menu-config.png | Bin 0 -> 1802 bytes .../dark/img/default/head-menu-development.png | Bin 0 -> 876 bytes .../themes/dark/img/default/head-menu-download.png | Bin 0 -> 721 bytes .../themes/dark/img/default/head-menu-home.png | Bin 0 -> 920 bytes .../themes/dark/img/default/head-menu-index.png | Bin 0 -> 482 bytes .../themes/dark/img/default/head-menu-news.png | Bin 0 -> 628 bytes .../themes/dark/img/default/head-menu-queue.png | Bin 0 -> 2629 bytes .../themes/dark/img/default/head-menu-recent.png | Bin 0 -> 932 bytes .../themes/dark/img/default/head-menu-wiki.png | Bin 0 -> 1204 bytes .../dark/img/default/head-search-noshadow.png | Bin 0 -> 1187 bytes pyload/webui/themes/dark/img/default/head_bg1.png | Bin 0 -> 125 bytes pyload/webui/themes/dark/img/default/images.png | Bin 0 -> 661 bytes pyload/webui/themes/dark/img/default/notice.png | Bin 0 -> 778 bytes .../webui/themes/dark/img/default/package_go.png | Bin 0 -> 898 bytes .../dark/img/default/page-tools-backlinks.png | Bin 0 -> 540 bytes .../themes/dark/img/default/page-tools-edit.png | Bin 0 -> 574 bytes .../dark/img/default/page-tools-revisions.png | Bin 0 -> 603 bytes pyload/webui/themes/dark/img/default/parseUri.png | Bin 0 -> 666 bytes pyload/webui/themes/dark/img/default/pencil.png | Bin 0 -> 450 bytes pyload/webui/themes/dark/img/default/reconnect.png | Bin 0 -> 755 bytes .../webui/themes/dark/img/default/status_None.png | Bin 0 -> 7613 bytes .../themes/dark/img/default/status_downloading.png | Bin 0 -> 943 bytes .../themes/dark/img/default/status_failed.png | Bin 0 -> 701 bytes .../themes/dark/img/default/status_finished.png | Bin 0 -> 781 bytes .../themes/dark/img/default/status_offline.png | Bin 0 -> 700 bytes .../webui/themes/dark/img/default/status_proc.png | Bin 0 -> 512 bytes .../webui/themes/dark/img/default/status_queue.png | Bin 0 -> 7613 bytes .../themes/dark/img/default/status_waiting.png | Bin 0 -> 889 bytes pyload/webui/themes/dark/img/default/success.png | Bin 0 -> 781 bytes .../themes/dark/img/default/tabs-border-bottom.png | Bin 0 -> 163 bytes .../dark/img/default/user-actions-logout.png | Bin 0 -> 799 bytes .../dark/img/default/user-actions-profile.png | Bin 0 -> 628 bytes pyload/webui/themes/dark/img/default/user-info.png | Bin 0 -> 3963 bytes pyload/webui/themes/dark/img/pyload-logo.png | Bin 0 -> 6947 bytes pyload/webui/themes/dark/img/tab-background.png | Bin 0 -> 3044 bytes pyload/webui/themes/dark/js/render/admin.coffee | 58 + pyload/webui/themes/dark/js/render/admin.min.js | 3 + pyload/webui/themes/dark/js/render/base.coffee | 177 + pyload/webui/themes/dark/js/render/base.min.js | 3 + pyload/webui/themes/dark/js/render/package.js | 376 ++ pyload/webui/themes/dark/js/render/settings.coffee | 107 + pyload/webui/themes/dark/js/render/settings.min.js | 3 + pyload/webui/themes/dark/js/static/MooDialog.js | 140 + .../webui/themes/dark/js/static/MooDialog.min.js | 1 + pyload/webui/themes/dark/js/static/MooDropMenu.js | 86 + .../webui/themes/dark/js/static/MooDropMenu.min.js | 1 + .../webui/themes/dark/js/static/mootools-core.js | 5977 ++++++++++++++++++++ .../themes/dark/js/static/mootools-core.min.js | 491 ++ .../webui/themes/dark/js/static/mootools-more.js | 2856 ++++++++++ .../themes/dark/js/static/mootools-more.min.js | 226 + pyload/webui/themes/dark/js/static/purr.js | 309 + pyload/webui/themes/dark/js/static/purr.min.js | 1 + pyload/webui/themes/dark/js/static/tinytab.js | 43 + pyload/webui/themes/dark/js/static/tinytab.min.js | 1 + pyload/webui/themes/dark/tml/admin.html | 98 + pyload/webui/themes/dark/tml/base.html | 177 + pyload/webui/themes/dark/tml/captcha.html | 42 + pyload/webui/themes/dark/tml/downloads.html | 29 + pyload/webui/themes/dark/tml/folder.html | 15 + pyload/webui/themes/dark/tml/home.html | 263 + pyload/webui/themes/dark/tml/info.html | 76 + pyload/webui/themes/dark/tml/login.html | 37 + pyload/webui/themes/dark/tml/logout.html | 9 + pyload/webui/themes/dark/tml/logs.html | 41 + pyload/webui/themes/dark/tml/pathchooser.html | 76 + pyload/webui/themes/dark/tml/queue.html | 104 + pyload/webui/themes/dark/tml/settings.html | 204 + pyload/webui/themes/dark/tml/settings_item.html | 48 + pyload/webui/themes/dark/tml/window.html | 52 + pyload/webui/themes/default/css/MooDialog.css | 91 + pyload/webui/themes/default/css/default.css | 902 +++ pyload/webui/themes/default/css/log.css | 71 + pyload/webui/themes/default/css/pathchooser.css | 68 + pyload/webui/themes/default/css/window.css | 73 + .../themes/default/img/MooDialog/dialog-close.png | Bin 0 -> 689 bytes .../themes/default/img/MooDialog/dialog-error.png | Bin 0 -> 1472 bytes .../default/img/MooDialog/dialog-question.png | Bin 0 -> 2073 bytes .../default/img/MooDialog/dialog-warning.png | Bin 0 -> 1651 bytes pyload/webui/themes/default/img/add_folder.png | Bin 0 -> 571 bytes pyload/webui/themes/default/img/ajax-loader.gif | Bin 0 -> 404 bytes pyload/webui/themes/default/img/arrow_refresh.png | Bin 0 -> 685 bytes pyload/webui/themes/default/img/arrow_right.png | Bin 0 -> 349 bytes pyload/webui/themes/default/img/big_button.gif | Bin 0 -> 1905 bytes .../webui/themes/default/img/big_button_over.gif | Bin 0 -> 728 bytes pyload/webui/themes/default/img/body.png | Bin 0 -> 402 bytes pyload/webui/themes/default/img/button.png | Bin 0 -> 452 bytes pyload/webui/themes/default/img/closebtn.gif | Bin 0 -> 254 bytes pyload/webui/themes/default/img/cog.png | Bin 0 -> 512 bytes pyload/webui/themes/default/img/control_add.png | Bin 0 -> 446 bytes .../webui/themes/default/img/control_add_blue.png | Bin 0 -> 845 bytes pyload/webui/themes/default/img/control_cancel.png | Bin 0 -> 3349 bytes .../themes/default/img/control_cancel_blue.png | Bin 0 -> 787 bytes pyload/webui/themes/default/img/control_pause.png | Bin 0 -> 598 bytes .../themes/default/img/control_pause_blue.png | Bin 0 -> 721 bytes pyload/webui/themes/default/img/control_play.png | Bin 0 -> 592 bytes .../webui/themes/default/img/control_play_blue.png | Bin 0 -> 717 bytes pyload/webui/themes/default/img/control_stop.png | Bin 0 -> 403 bytes .../webui/themes/default/img/control_stop_blue.png | Bin 0 -> 695 bytes pyload/webui/themes/default/img/delete.png | Bin 0 -> 715 bytes pyload/webui/themes/default/img/drag_corner.gif | Bin 0 -> 76 bytes pyload/webui/themes/default/img/error.png | Bin 0 -> 701 bytes pyload/webui/themes/default/img/folder.png | Bin 0 -> 537 bytes pyload/webui/themes/default/img/full.png | Bin 0 -> 3543 bytes pyload/webui/themes/default/img/head-login.png | Bin 0 -> 1288 bytes .../themes/default/img/head-menu-collector.png | Bin 0 -> 1953 bytes .../webui/themes/default/img/head-menu-config.png | Bin 0 -> 1802 bytes .../themes/default/img/head-menu-development.png | Bin 0 -> 876 bytes .../themes/default/img/head-menu-download.png | Bin 0 -> 721 bytes pyload/webui/themes/default/img/head-menu-home.png | Bin 0 -> 920 bytes .../webui/themes/default/img/head-menu-index.png | Bin 0 -> 482 bytes pyload/webui/themes/default/img/head-menu-news.png | Bin 0 -> 628 bytes .../webui/themes/default/img/head-menu-queue.png | Bin 0 -> 2629 bytes .../webui/themes/default/img/head-menu-recent.png | Bin 0 -> 932 bytes pyload/webui/themes/default/img/head-menu-wiki.png | Bin 0 -> 1204 bytes .../themes/default/img/head-search-noshadow.png | Bin 0 -> 1187 bytes pyload/webui/themes/default/img/head_bg1.png | Bin 0 -> 125 bytes pyload/webui/themes/default/img/images.png | Bin 0 -> 661 bytes pyload/webui/themes/default/img/notice.png | Bin 0 -> 778 bytes pyload/webui/themes/default/img/package_go.png | Bin 0 -> 898 bytes .../themes/default/img/page-tools-backlinks.png | Bin 0 -> 540 bytes .../webui/themes/default/img/page-tools-edit.png | Bin 0 -> 574 bytes .../themes/default/img/page-tools-revisions.png | Bin 0 -> 603 bytes pyload/webui/themes/default/img/parseUri.png | Bin 0 -> 666 bytes pyload/webui/themes/default/img/pencil.png | Bin 0 -> 450 bytes pyload/webui/themes/default/img/pyload-logo.png | Bin 0 -> 8457 bytes pyload/webui/themes/default/img/reconnect.png | Bin 0 -> 755 bytes pyload/webui/themes/default/img/status_None.png | Bin 0 -> 7613 bytes .../themes/default/img/status_downloading.png | Bin 0 -> 943 bytes pyload/webui/themes/default/img/status_failed.png | Bin 0 -> 701 bytes .../webui/themes/default/img/status_finished.png | Bin 0 -> 781 bytes pyload/webui/themes/default/img/status_offline.png | Bin 0 -> 700 bytes pyload/webui/themes/default/img/status_proc.png | Bin 0 -> 512 bytes pyload/webui/themes/default/img/status_queue.png | Bin 0 -> 7613 bytes pyload/webui/themes/default/img/status_waiting.png | Bin 0 -> 889 bytes pyload/webui/themes/default/img/success.png | Bin 0 -> 781 bytes pyload/webui/themes/default/img/tab-background.png | Bin 0 -> 179 bytes .../themes/default/img/tabs-border-bottom.png | Bin 0 -> 163 bytes .../themes/default/img/user-actions-logout.png | Bin 0 -> 799 bytes .../themes/default/img/user-actions-profile.png | Bin 0 -> 628 bytes pyload/webui/themes/default/img/user-info.png | Bin 0 -> 3963 bytes pyload/webui/themes/default/js/render/admin.coffee | 58 + pyload/webui/themes/default/js/render/admin.min.js | 3 + pyload/webui/themes/default/js/render/base.coffee | 177 + pyload/webui/themes/default/js/render/base.min.js | 3 + .../webui/themes/default/js/render/filemanager.js | 291 + pyload/webui/themes/default/js/render/package.js | 376 ++ .../webui/themes/default/js/render/settings.coffee | 107 + .../webui/themes/default/js/render/settings.min.js | 3 + pyload/webui/themes/default/js/static/MooDialog.js | 140 + .../themes/default/js/static/MooDialog.min.js | 1 + .../webui/themes/default/js/static/MooDropMenu.js | 86 + .../themes/default/js/static/MooDropMenu.min.js | 1 + .../themes/default/js/static/mootools-core.js | 5977 ++++++++++++++++++++ .../themes/default/js/static/mootools-core.min.js | 491 ++ .../themes/default/js/static/mootools-more.js | 2856 ++++++++++ .../themes/default/js/static/mootools-more.min.js | 226 + pyload/webui/themes/default/js/static/purr.js | 309 + pyload/webui/themes/default/js/static/purr.min.js | 1 + pyload/webui/themes/default/js/static/tinytab.js | 43 + .../webui/themes/default/js/static/tinytab.min.js | 1 + pyload/webui/themes/default/tml/admin.html | 98 + pyload/webui/themes/default/tml/base.html | 180 + pyload/webui/themes/default/tml/captcha.html | 42 + pyload/webui/themes/default/tml/downloads.html | 29 + pyload/webui/themes/default/tml/filemanager.html | 78 + pyload/webui/themes/default/tml/folder.html | 15 + pyload/webui/themes/default/tml/home.html | 266 + pyload/webui/themes/default/tml/info.html | 81 + pyload/webui/themes/default/tml/login.html | 36 + pyload/webui/themes/default/tml/logout.html | 9 + pyload/webui/themes/default/tml/logs.html | 41 + pyload/webui/themes/default/tml/pathchooser.html | 76 + pyload/webui/themes/default/tml/queue.html | 104 + pyload/webui/themes/default/tml/settings.html | 204 + pyload/webui/themes/default/tml/settings_item.html | 48 + pyload/webui/themes/default/tml/window.html | 46 + pyload/webui/themes/flat/css/MooDialog.css | 84 + pyload/webui/themes/flat/css/flat.css | 863 +++ pyload/webui/themes/flat/css/log.css | 72 + pyload/webui/themes/flat/css/pathchooser.css | 68 + pyload/webui/themes/flat/css/window.css | 73 + .../themes/flat/img/MooDialog/dialog-close.png | Bin 0 -> 689 bytes .../themes/flat/img/MooDialog/dialog-error.png | Bin 0 -> 1472 bytes .../themes/flat/img/MooDialog/dialog-question.png | Bin 0 -> 2073 bytes .../themes/flat/img/MooDialog/dialog-warning.png | Bin 0 -> 1651 bytes pyload/webui/themes/flat/img/arrow_refresh.png | Bin 0 -> 119032 bytes pyload/webui/themes/flat/img/arrow_right.png | Bin 0 -> 136967 bytes pyload/webui/themes/flat/img/button.png | Bin 0 -> 569 bytes pyload/webui/themes/flat/img/cog.png | Bin 0 -> 137406 bytes pyload/webui/themes/flat/img/control_add.png | Bin 0 -> 116941 bytes pyload/webui/themes/flat/img/control_add_blue.png | Bin 0 -> 116941 bytes pyload/webui/themes/flat/img/control_cancel.png | Bin 0 -> 116939 bytes .../webui/themes/flat/img/control_cancel_blue.png | Bin 0 -> 116939 bytes pyload/webui/themes/flat/img/control_pause.png | Bin 0 -> 134855 bytes .../webui/themes/flat/img/control_pause_blue.png | Bin 0 -> 134855 bytes pyload/webui/themes/flat/img/control_play.png | Bin 0 -> 134904 bytes pyload/webui/themes/flat/img/control_play_blue.png | Bin 0 -> 134904 bytes pyload/webui/themes/flat/img/control_stop.png | Bin 0 -> 134835 bytes pyload/webui/themes/flat/img/control_stop_blue.png | Bin 0 -> 134835 bytes .../webui/themes/flat/img/default/add_folder.png | Bin 0 -> 571 bytes .../webui/themes/flat/img/default/ajax-loader.gif | Bin 0 -> 404 bytes .../webui/themes/flat/img/default/big_button.gif | Bin 0 -> 1905 bytes .../themes/flat/img/default/big_button_over.gif | Bin 0 -> 728 bytes pyload/webui/themes/flat/img/default/body.png | Bin 0 -> 402 bytes pyload/webui/themes/flat/img/default/closebtn.gif | Bin 0 -> 254 bytes .../webui/themes/flat/img/default/drag_corner.gif | Bin 0 -> 76 bytes pyload/webui/themes/flat/img/default/full.png | Bin 0 -> 3543 bytes .../themes/flat/img/default/head-menu-recent.png | Bin 0 -> 932 bytes pyload/webui/themes/flat/img/default/head_bg1.png | Bin 0 -> 125 bytes pyload/webui/themes/flat/img/default/images.png | Bin 0 -> 661 bytes pyload/webui/themes/flat/img/default/parseUri.png | Bin 0 -> 666 bytes .../webui/themes/flat/img/default/pyload-logo.png | Bin 0 -> 8457 bytes .../themes/flat/img/default/tab-background.png | Bin 0 -> 179 bytes .../themes/flat/img/default/tabs-border-bottom.png | Bin 0 -> 163 bytes pyload/webui/themes/flat/img/delete.png | Bin 0 -> 117658 bytes pyload/webui/themes/flat/img/error.png | Bin 0 -> 137673 bytes pyload/webui/themes/flat/img/folder.png | Bin 0 -> 134669 bytes pyload/webui/themes/flat/img/head-login.png | Bin 0 -> 137406 bytes .../webui/themes/flat/img/head-menu-collector.png | Bin 0 -> 134985 bytes pyload/webui/themes/flat/img/head-menu-config.png | Bin 0 -> 137664 bytes .../themes/flat/img/head-menu-development.png | Bin 0 -> 135818 bytes .../webui/themes/flat/img/head-menu-download.png | Bin 0 -> 137664 bytes pyload/webui/themes/flat/img/head-menu-home.png | Bin 0 -> 139387 bytes pyload/webui/themes/flat/img/head-menu-index.png | Bin 0 -> 136511 bytes pyload/webui/themes/flat/img/head-menu-news.png | Bin 0 -> 136511 bytes pyload/webui/themes/flat/img/head-menu-queue.png | Bin 0 -> 136269 bytes pyload/webui/themes/flat/img/head-menu-wiki.png | Bin 0 -> 137217 bytes .../webui/themes/flat/img/head-search-noshadow.png | Bin 0 -> 137217 bytes pyload/webui/themes/flat/img/notice.png | Bin 0 -> 3061 bytes pyload/webui/themes/flat/img/package_go.png | Bin 0 -> 136299 bytes .../webui/themes/flat/img/page-tools-backlinks.png | Bin 0 -> 138112 bytes pyload/webui/themes/flat/img/page-tools-edit.png | Bin 0 -> 138112 bytes .../webui/themes/flat/img/page-tools-revisions.png | Bin 0 -> 138112 bytes pyload/webui/themes/flat/img/pencil.png | Bin 0 -> 138112 bytes pyload/webui/themes/flat/img/reconnect.png | Bin 0 -> 3063 bytes pyload/webui/themes/flat/img/status_None.png | Bin 0 -> 138112 bytes .../webui/themes/flat/img/status_downloading.png | Bin 0 -> 3061 bytes pyload/webui/themes/flat/img/status_failed.png | Bin 0 -> 137673 bytes pyload/webui/themes/flat/img/status_finished.png | Bin 0 -> 117658 bytes pyload/webui/themes/flat/img/status_offline.png | Bin 0 -> 137673 bytes pyload/webui/themes/flat/img/status_proc.png | Bin 0 -> 137406 bytes pyload/webui/themes/flat/img/status_queue.png | Bin 0 -> 138112 bytes pyload/webui/themes/flat/img/status_waiting.png | Bin 0 -> 138112 bytes pyload/webui/themes/flat/img/success.png | Bin 0 -> 117658 bytes .../webui/themes/flat/img/user-actions-logout.png | Bin 0 -> 138112 bytes .../webui/themes/flat/img/user-actions-profile.png | Bin 0 -> 138112 bytes pyload/webui/themes/flat/img/user-info.png | Bin 0 -> 3080 bytes pyload/webui/themes/flat/js/render/admin.coffee | 58 + pyload/webui/themes/flat/js/render/admin.min.js | 3 + pyload/webui/themes/flat/js/render/base.coffee | 177 + pyload/webui/themes/flat/js/render/base.min.js | 3 + pyload/webui/themes/flat/js/render/package.js | 376 ++ pyload/webui/themes/flat/js/render/settings.coffee | 107 + pyload/webui/themes/flat/js/render/settings.min.js | 3 + pyload/webui/themes/flat/js/static/MooDialog.js | 140 + .../webui/themes/flat/js/static/MooDialog.min.js | 1 + pyload/webui/themes/flat/js/static/MooDropMenu.js | 86 + .../webui/themes/flat/js/static/MooDropMenu.min.js | 1 + .../webui/themes/flat/js/static/mootools-core.js | 5977 ++++++++++++++++++++ .../themes/flat/js/static/mootools-core.min.js | 491 ++ .../webui/themes/flat/js/static/mootools-more.js | 2856 ++++++++++ .../themes/flat/js/static/mootools-more.min.js | 226 + pyload/webui/themes/flat/js/static/purr.js | 309 + pyload/webui/themes/flat/js/static/purr.min.js | 1 + pyload/webui/themes/flat/js/static/tinytab.js | 43 + pyload/webui/themes/flat/js/static/tinytab.min.js | 1 + pyload/webui/themes/flat/tml/admin.html | 98 + pyload/webui/themes/flat/tml/base.html | 177 + pyload/webui/themes/flat/tml/captcha.html | 42 + pyload/webui/themes/flat/tml/downloads.html | 29 + pyload/webui/themes/flat/tml/folder.html | 15 + pyload/webui/themes/flat/tml/home.html | 263 + pyload/webui/themes/flat/tml/info.html | 81 + pyload/webui/themes/flat/tml/login.html | 36 + pyload/webui/themes/flat/tml/logout.html | 9 + pyload/webui/themes/flat/tml/logs.html | 41 + pyload/webui/themes/flat/tml/pathchooser.html | 76 + pyload/webui/themes/flat/tml/queue.html | 104 + pyload/webui/themes/flat/tml/settings.html | 204 + pyload/webui/themes/flat/tml/settings_item.html | 48 + pyload/webui/themes/flat/tml/window.html | 46 + scripts/clonedigger.sh | 2 +- scripts/code_analysis.sh | 2 +- 1968 files changed, 150514 insertions(+), 150517 deletions(-) delete mode 100644 module/Api.py delete mode 100644 module/CaptchaManager.py delete mode 100644 module/ConfigParser.py delete mode 100644 module/Core.py delete mode 100644 module/HookManager.py delete mode 100644 module/InitHomeDir.py delete mode 100644 module/PullEvents.py delete mode 100644 module/PyFile.py delete mode 100644 module/PyPackage.py delete mode 100644 module/Scheduler.py delete mode 100644 module/ThreadManager.py delete mode 100644 module/__init__.py delete mode 100644 module/cli/AddPackage.py delete mode 100644 module/cli/Cli.py delete mode 100644 module/cli/Handler.py delete mode 100644 module/cli/ManageFiles.py delete mode 100644 module/cli/__init__.py delete mode 100644 module/cli/printer.py delete mode 100644 module/common/APIExerciser.py delete mode 100644 module/common/ImportDebugger.py delete mode 100644 module/common/JsEngine.py delete mode 100644 module/common/__init__.py delete mode 100644 module/common/json_layer.py delete mode 100644 module/common/packagetools.py delete mode 100644 module/common/pavement.py delete mode 100644 module/common/pylgettext.py delete mode 100644 module/common/test_api.py delete mode 100644 module/common/test_json.py delete mode 100644 module/config/default.conf delete mode 100644 module/database/DatabaseBackend.py delete mode 100644 module/database/FileDatabase.py delete mode 100644 module/database/StorageDatabase.py delete mode 100644 module/database/UserDatabase.py delete mode 100644 module/database/__init__.py delete mode 100644 module/debug.py delete mode 100644 module/forwarder.py delete mode 100644 module/lib/BeautifulSoup.py delete mode 100644 module/lib/Getch.py delete mode 100644 module/lib/MultipartPostHandler.py delete mode 100644 module/lib/SafeEval.py delete mode 100644 module/lib/__init__.py delete mode 100644 module/lib/beaker/__init__.py delete mode 100644 module/lib/beaker/cache.py delete mode 100644 module/lib/beaker/container.py delete mode 100644 module/lib/beaker/converters.py delete mode 100644 module/lib/beaker/crypto/__init__.py delete mode 100644 module/lib/beaker/crypto/jcecrypto.py delete mode 100644 module/lib/beaker/crypto/nsscrypto.py delete mode 100644 module/lib/beaker/crypto/pbkdf2.py delete mode 100644 module/lib/beaker/crypto/pycrypto.py delete mode 100644 module/lib/beaker/crypto/util.py delete mode 100644 module/lib/beaker/exceptions.py delete mode 100644 module/lib/beaker/ext/__init__.py delete mode 100644 module/lib/beaker/ext/database.py delete mode 100644 module/lib/beaker/ext/google.py delete mode 100644 module/lib/beaker/ext/memcached.py delete mode 100644 module/lib/beaker/ext/sqla.py delete mode 100644 module/lib/beaker/middleware.py delete mode 100644 module/lib/beaker/session.py delete mode 100644 module/lib/beaker/synchronization.py delete mode 100644 module/lib/beaker/util.py delete mode 100644 module/lib/bottle.py delete mode 100644 module/lib/feedparser.py delete mode 100644 module/lib/jinja2/__init__.py delete mode 100644 module/lib/jinja2/_compat.py delete mode 100644 module/lib/jinja2/_stringdefs.py delete mode 100644 module/lib/jinja2/bccache.py delete mode 100644 module/lib/jinja2/compiler.py delete mode 100644 module/lib/jinja2/constants.py delete mode 100644 module/lib/jinja2/debug.py delete mode 100644 module/lib/jinja2/defaults.py delete mode 100644 module/lib/jinja2/environment.py delete mode 100644 module/lib/jinja2/exceptions.py delete mode 100644 module/lib/jinja2/ext.py delete mode 100644 module/lib/jinja2/filters.py delete mode 100644 module/lib/jinja2/lexer.py delete mode 100644 module/lib/jinja2/loaders.py delete mode 100644 module/lib/jinja2/meta.py delete mode 100644 module/lib/jinja2/nodes.py delete mode 100644 module/lib/jinja2/optimizer.py delete mode 100644 module/lib/jinja2/parser.py delete mode 100644 module/lib/jinja2/runtime.py delete mode 100644 module/lib/jinja2/sandbox.py delete mode 100644 module/lib/jinja2/tests.py delete mode 100644 module/lib/jinja2/testsuite/__init__.py delete mode 100644 module/lib/jinja2/testsuite/api.py delete mode 100644 module/lib/jinja2/testsuite/bytecode_cache.py delete mode 100644 module/lib/jinja2/testsuite/core_tags.py delete mode 100644 module/lib/jinja2/testsuite/debug.py delete mode 100644 module/lib/jinja2/testsuite/doctests.py delete mode 100644 module/lib/jinja2/testsuite/ext.py delete mode 100644 module/lib/jinja2/testsuite/filters.py delete mode 100644 module/lib/jinja2/testsuite/imports.py delete mode 100644 module/lib/jinja2/testsuite/inheritance.py delete mode 100644 module/lib/jinja2/testsuite/lexnparse.py delete mode 100644 module/lib/jinja2/testsuite/loader.py delete mode 100644 module/lib/jinja2/testsuite/regression.py delete mode 100644 module/lib/jinja2/testsuite/res/__init__.py delete mode 100644 module/lib/jinja2/testsuite/res/templates/broken.html delete mode 100644 module/lib/jinja2/testsuite/res/templates/foo/test.html delete mode 100644 module/lib/jinja2/testsuite/res/templates/syntaxerror.html delete mode 100644 module/lib/jinja2/testsuite/res/templates/test.html delete mode 100644 module/lib/jinja2/testsuite/security.py delete mode 100644 module/lib/jinja2/testsuite/tests.py delete mode 100644 module/lib/jinja2/testsuite/utils.py delete mode 100644 module/lib/jinja2/utils.py delete mode 100644 module/lib/jinja2/visitor.py delete mode 100644 module/lib/markupsafe/__init__.py delete mode 100644 module/lib/markupsafe/_compat.py delete mode 100644 module/lib/markupsafe/_constants.py delete mode 100644 module/lib/markupsafe/_native.py delete mode 100644 module/lib/markupsafe/_speedups.c delete mode 100644 module/lib/markupsafe/tests.py delete mode 100644 module/lib/rename_process.py delete mode 100644 module/lib/simplejson/__init__.py delete mode 100644 module/lib/simplejson/compat.py delete mode 100644 module/lib/simplejson/decoder.py delete mode 100644 module/lib/simplejson/encoder.py delete mode 100644 module/lib/simplejson/ordered_dict.py delete mode 100644 module/lib/simplejson/scanner.py delete mode 100644 module/lib/simplejson/tool.py delete mode 100644 module/lib/thrift/TSCons.py delete mode 100644 module/lib/thrift/TSerialization.py delete mode 100644 module/lib/thrift/TTornado.py delete mode 100644 module/lib/thrift/Thrift.py delete mode 100644 module/lib/thrift/__init__.py delete mode 100644 module/lib/thrift/protocol/TBase.py delete mode 100644 module/lib/thrift/protocol/TBinaryProtocol.py delete mode 100644 module/lib/thrift/protocol/TCompactProtocol.py delete mode 100644 module/lib/thrift/protocol/TJSONProtocol.py delete mode 100644 module/lib/thrift/protocol/TProtocol.py delete mode 100644 module/lib/thrift/protocol/__init__.py delete mode 100644 module/lib/thrift/protocol/fastbinary.c delete mode 100644 module/lib/thrift/server/THttpServer.py delete mode 100644 module/lib/thrift/server/TNonblockingServer.py delete mode 100644 module/lib/thrift/server/TProcessPoolServer.py delete mode 100644 module/lib/thrift/server/TServer.py delete mode 100644 module/lib/thrift/server/__init__.py delete mode 100644 module/lib/thrift/transport/THttpClient.py delete mode 100644 module/lib/thrift/transport/TSSLSocket.py delete mode 100644 module/lib/thrift/transport/TSocket.py delete mode 100644 module/lib/thrift/transport/TTransport.py delete mode 100644 module/lib/thrift/transport/TTwisted.py delete mode 100644 module/lib/thrift/transport/TZlibTransport.py delete mode 100644 module/lib/thrift/transport/__init__.py delete mode 100644 module/lib/wsgiserver/LICENSE.txt delete mode 100644 module/lib/wsgiserver/__init__.py delete mode 100644 module/network/Browser.py delete mode 100644 module/network/Bucket.py delete mode 100644 module/network/CookieJar.py delete mode 100644 module/network/HTTPChunk.py delete mode 100644 module/network/HTTPDownload.py delete mode 100644 module/network/HTTPRequest.py delete mode 100644 module/network/RequestFactory.py delete mode 100644 module/network/XDCCRequest.py delete mode 100644 module/network/__init__.py delete mode 100644 module/plugins/Account.py delete mode 100644 module/plugins/AccountManager.py delete mode 100644 module/plugins/Container.py delete mode 100644 module/plugins/Crypter.py delete mode 100644 module/plugins/Hook.py delete mode 100644 module/plugins/Hoster.py delete mode 100644 module/plugins/OCR.py delete mode 100644 module/plugins/Plugin.py delete mode 100644 module/plugins/PluginManager.py delete mode 100644 module/plugins/README.md delete mode 100644 module/plugins/__init__.py delete mode 100644 module/plugins/accounts/AlldebridCom.py delete mode 100644 module/plugins/accounts/BayfilesCom.py delete mode 100644 module/plugins/accounts/BitshareCom.py delete mode 100644 module/plugins/accounts/CramitIn.py delete mode 100644 module/plugins/accounts/CyberlockerCh.py delete mode 100644 module/plugins/accounts/CzshareCom.py delete mode 100644 module/plugins/accounts/DebridItaliaCom.py delete mode 100644 module/plugins/accounts/DepositfilesCom.py delete mode 100644 module/plugins/accounts/EasybytezCom.py delete mode 100644 module/plugins/accounts/EgoFilesCom.py delete mode 100644 module/plugins/accounts/EuroshareEu.py delete mode 100644 module/plugins/accounts/FastixRu.py delete mode 100644 module/plugins/accounts/FastshareCz.py delete mode 100644 module/plugins/accounts/File4safeCom.py delete mode 100644 module/plugins/accounts/FilecloudIo.py delete mode 100644 module/plugins/accounts/FilefactoryCom.py delete mode 100644 module/plugins/accounts/FilejungleCom.py delete mode 100644 module/plugins/accounts/FilerNet.py delete mode 100644 module/plugins/accounts/FilerioCom.py delete mode 100644 module/plugins/accounts/FilesMailRu.py delete mode 100644 module/plugins/accounts/FileserveCom.py delete mode 100644 module/plugins/accounts/FourSharedCom.py delete mode 100644 module/plugins/accounts/FreakshareCom.py delete mode 100644 module/plugins/accounts/FreeWayMe.py delete mode 100644 module/plugins/accounts/FshareVn.py delete mode 100644 module/plugins/accounts/Ftp.py delete mode 100644 module/plugins/accounts/HellshareCz.py delete mode 100644 module/plugins/accounts/HotfileCom.py delete mode 100644 module/plugins/accounts/Http.py delete mode 100644 module/plugins/accounts/LetitbitNet.py delete mode 100644 module/plugins/accounts/LinksnappyCom.py delete mode 100644 module/plugins/accounts/MegaDebridEu.py delete mode 100644 module/plugins/accounts/MegasharesCom.py delete mode 100644 module/plugins/accounts/MovReelCom.py delete mode 100644 module/plugins/accounts/MultiDebridCom.py delete mode 100644 module/plugins/accounts/MultishareCz.py delete mode 100755 module/plugins/accounts/NetloadIn.py delete mode 100644 module/plugins/accounts/OboomCom.py delete mode 100644 module/plugins/accounts/OneFichierCom.py delete mode 100644 module/plugins/accounts/OverLoadMe.py delete mode 100644 module/plugins/accounts/Premium4Me.py delete mode 100644 module/plugins/accounts/PremiumizeMe.py delete mode 100644 module/plugins/accounts/QuickshareCz.py delete mode 100644 module/plugins/accounts/RPNetBiz.py delete mode 100644 module/plugins/accounts/RapidgatorNet.py delete mode 100644 module/plugins/accounts/RapidshareCom.py delete mode 100644 module/plugins/accounts/RarefileNet.py delete mode 100644 module/plugins/accounts/RealdebridCom.py delete mode 100644 module/plugins/accounts/RehostTo.py delete mode 100644 module/plugins/accounts/RyushareCom.py delete mode 100644 module/plugins/accounts/ShareRapidCom.py delete mode 100644 module/plugins/accounts/ShareonlineBiz.py delete mode 100644 module/plugins/accounts/SimplyPremiumCom.py delete mode 100644 module/plugins/accounts/SimplydebridCom.py delete mode 100644 module/plugins/accounts/StahnuTo.py delete mode 100644 module/plugins/accounts/TurbobitNet.py delete mode 100644 module/plugins/accounts/UlozTo.py delete mode 100644 module/plugins/accounts/UnrestrictLi.py delete mode 100644 module/plugins/accounts/UploadedTo.py delete mode 100644 module/plugins/accounts/UploadheroCom.py delete mode 100644 module/plugins/accounts/UploadingCom.py delete mode 100644 module/plugins/accounts/UptoboxCom.py delete mode 100644 module/plugins/accounts/YibaishiwuCom.py delete mode 100644 module/plugins/accounts/ZeveraCom.py delete mode 100644 module/plugins/accounts/__init__.py delete mode 100644 module/plugins/container/CCF.py delete mode 100644 module/plugins/container/DLC_25.pyc delete mode 100644 module/plugins/container/DLC_26.pyc delete mode 100644 module/plugins/container/DLC_27.pyc delete mode 100644 module/plugins/container/LinkList.py delete mode 100644 module/plugins/container/RSDF.py delete mode 100644 module/plugins/container/__init__.py delete mode 100644 module/plugins/crypter/BitshareComFolder.py delete mode 100644 module/plugins/crypter/C1neonCom.py delete mode 100644 module/plugins/crypter/ChipDe.py delete mode 100644 module/plugins/crypter/CrockoComFolder.py delete mode 100644 module/plugins/crypter/CryptItCom.py delete mode 100644 module/plugins/crypter/CzshareComFolder.py delete mode 100644 module/plugins/crypter/DDLMusicOrg.py delete mode 100644 module/plugins/crypter/DailymotionBatch.py delete mode 100644 module/plugins/crypter/DataHuFolder.py delete mode 100644 module/plugins/crypter/DdlstorageComFolder.py delete mode 100644 module/plugins/crypter/DepositfilesComFolder.py delete mode 100644 module/plugins/crypter/Dereferer.py delete mode 100644 module/plugins/crypter/DlProtectCom.py delete mode 100644 module/plugins/crypter/DontKnowMe.py delete mode 100644 module/plugins/crypter/DuckCryptInfo.py delete mode 100644 module/plugins/crypter/DuploadOrgFolder.py delete mode 100644 module/plugins/crypter/EasybytezComFolder.py delete mode 100644 module/plugins/crypter/EmbeduploadCom.py delete mode 100644 module/plugins/crypter/FilebeerInfoFolder.py delete mode 100644 module/plugins/crypter/FilecloudIoFolder.py delete mode 100644 module/plugins/crypter/FilefactoryComFolder.py delete mode 100644 module/plugins/crypter/FilerNetFolder.py delete mode 100644 module/plugins/crypter/FileserveComFolder.py delete mode 100644 module/plugins/crypter/FilestubeCom.py delete mode 100644 module/plugins/crypter/FiletramCom.py delete mode 100644 module/plugins/crypter/FiredriveComFolder.py delete mode 100644 module/plugins/crypter/FourChanOrg.py delete mode 100644 module/plugins/crypter/FreakhareComFolder.py delete mode 100644 module/plugins/crypter/FreetexthostCom.py delete mode 100644 module/plugins/crypter/FshareVnFolder.py delete mode 100644 module/plugins/crypter/GooGl.py delete mode 100644 module/plugins/crypter/HoerbuchIn.py delete mode 100644 module/plugins/crypter/HotfileFolderCom.py delete mode 100644 module/plugins/crypter/ILoadTo.py delete mode 100644 module/plugins/crypter/ImgurComAlbum.py delete mode 100644 module/plugins/crypter/LetitbitNetFolder.py delete mode 100644 module/plugins/crypter/LinkSaveIn.py delete mode 100644 module/plugins/crypter/LinkdecrypterCom.py delete mode 100644 module/plugins/crypter/LixIn.py delete mode 100644 module/plugins/crypter/LofCc.py delete mode 100644 module/plugins/crypter/MBLinkInfo.py delete mode 100644 module/plugins/crypter/MediafireComFolder.py delete mode 100644 module/plugins/crypter/Movie2kTo.py delete mode 100644 module/plugins/crypter/MultiUpOrg.py delete mode 100644 module/plugins/crypter/MultiloadCz.py delete mode 100644 module/plugins/crypter/MultiuploadCom.py delete mode 100644 module/plugins/crypter/NCryptIn.py delete mode 100644 module/plugins/crypter/NetfolderIn.py delete mode 100644 module/plugins/crypter/NosvideoCom.py delete mode 100644 module/plugins/crypter/OneKhDe.py delete mode 100755 module/plugins/crypter/OronComFolder.py delete mode 100644 module/plugins/crypter/PastebinCom.py delete mode 100644 module/plugins/crypter/QuickshareCzFolder.py delete mode 100644 module/plugins/crypter/RSLayerCom.py delete mode 100644 module/plugins/crypter/RelinkUs.py delete mode 100644 module/plugins/crypter/SafelinkingNet.py delete mode 100644 module/plugins/crypter/SecuredIn.py delete mode 100644 module/plugins/crypter/SerienjunkiesOrg.py delete mode 100644 module/plugins/crypter/ShareLinksBiz.py delete mode 100644 module/plugins/crypter/ShareRapidComFolder.py delete mode 100644 module/plugins/crypter/SpeedLoadOrgFolder.py delete mode 100644 module/plugins/crypter/StealthTo.py delete mode 100644 module/plugins/crypter/TnyCz.py delete mode 100644 module/plugins/crypter/TrailerzoneInfo.py delete mode 100644 module/plugins/crypter/TurbobitNetFolder.py delete mode 100644 module/plugins/crypter/TusfilesNetFolder.py delete mode 100644 module/plugins/crypter/UlozToFolder.py delete mode 100644 module/plugins/crypter/UploadableChFolder.py delete mode 100644 module/plugins/crypter/UploadedToFolder.py delete mode 100644 module/plugins/crypter/WiiReloadedOrg.py delete mode 100644 module/plugins/crypter/XupPl.py delete mode 100644 module/plugins/crypter/YoutubeBatch.py delete mode 100644 module/plugins/crypter/__init__.py delete mode 100644 module/plugins/hooks/AlldebridCom.py delete mode 100644 module/plugins/hooks/BypassCaptcha.py delete mode 100755 module/plugins/hooks/Captcha9kw.py delete mode 100644 module/plugins/hooks/CaptchaBrotherhood.py delete mode 100644 module/plugins/hooks/Checksum.py delete mode 100644 module/plugins/hooks/ClickAndLoad.py delete mode 100644 module/plugins/hooks/DeathByCaptcha.py delete mode 100644 module/plugins/hooks/DebridItaliaCom.py delete mode 100644 module/plugins/hooks/DeleteFinished.py delete mode 100644 module/plugins/hooks/DownloadScheduler.py delete mode 100644 module/plugins/hooks/EasybytezCom.py delete mode 100644 module/plugins/hooks/Ev0InFetcher.py delete mode 100644 module/plugins/hooks/ExpertDecoders.py delete mode 100644 module/plugins/hooks/ExternalScripts.py delete mode 100644 module/plugins/hooks/ExtractArchive.py delete mode 100644 module/plugins/hooks/FastixRu.py delete mode 100644 module/plugins/hooks/FreeWayMe.py delete mode 100644 module/plugins/hooks/HotFolder.py delete mode 100644 module/plugins/hooks/IRCInterface.py delete mode 100644 module/plugins/hooks/ImageTyperz.py delete mode 100644 module/plugins/hooks/LinkdecrypterCom.py delete mode 100644 module/plugins/hooks/LinksnappyCom.py delete mode 100644 module/plugins/hooks/MegaDebridEu.py delete mode 100644 module/plugins/hooks/MergeFiles.py delete mode 100644 module/plugins/hooks/MultiDebridCom.py delete mode 100644 module/plugins/hooks/MultiHome.py delete mode 100644 module/plugins/hooks/MultishareCz.py delete mode 100644 module/plugins/hooks/OverLoadMe.py delete mode 100644 module/plugins/hooks/Premium4Me.py delete mode 100644 module/plugins/hooks/PremiumizeMe.py delete mode 100644 module/plugins/hooks/RPNetBiz.py delete mode 100644 module/plugins/hooks/RealdebridCom.py delete mode 100644 module/plugins/hooks/RehostTo.py delete mode 100644 module/plugins/hooks/RestartFailed.py delete mode 100644 module/plugins/hooks/SimplyPremiumCom.py delete mode 100644 module/plugins/hooks/SimplydebridCom.py delete mode 100644 module/plugins/hooks/UnSkipOnFail.py delete mode 100644 module/plugins/hooks/UnrestrictLi.py delete mode 100644 module/plugins/hooks/UpdateManager.py delete mode 100644 module/plugins/hooks/WindowsPhoneToastNotify.py delete mode 100644 module/plugins/hooks/XFileSharingPro.py delete mode 100644 module/plugins/hooks/XMPPInterface.py delete mode 100644 module/plugins/hooks/ZeveraCom.py delete mode 100644 module/plugins/hooks/__init__.py delete mode 100644 module/plugins/hoster/AlldebridCom.py delete mode 100644 module/plugins/hoster/BasePlugin.py delete mode 100644 module/plugins/hoster/BayfilesCom.py delete mode 100644 module/plugins/hoster/BezvadataCz.py delete mode 100644 module/plugins/hoster/BillionuploadsCom.py delete mode 100644 module/plugins/hoster/BitshareCom.py delete mode 100644 module/plugins/hoster/BoltsharingCom.py delete mode 100644 module/plugins/hoster/CatShareNet.py delete mode 100644 module/plugins/hoster/CloudzerNet.py delete mode 100644 module/plugins/hoster/CramitIn.py delete mode 100644 module/plugins/hoster/CrockoCom.py delete mode 100644 module/plugins/hoster/CyberlockerCh.py delete mode 100644 module/plugins/hoster/CzshareCom.py delete mode 100644 module/plugins/hoster/DailymotionCom.py delete mode 100644 module/plugins/hoster/DataHu.py delete mode 100644 module/plugins/hoster/DataportCz.py delete mode 100644 module/plugins/hoster/DateiTo.py delete mode 100644 module/plugins/hoster/DdlstorageCom.py delete mode 100644 module/plugins/hoster/DebridItaliaCom.py delete mode 100644 module/plugins/hoster/DepositfilesCom.py delete mode 100644 module/plugins/hoster/DlFreeFr.py delete mode 100644 module/plugins/hoster/DuploadOrg.py delete mode 100644 module/plugins/hoster/EasybytezCom.py delete mode 100644 module/plugins/hoster/EdiskCz.py delete mode 100644 module/plugins/hoster/EgoFilesCom.py delete mode 100644 module/plugins/hoster/EpicShareNet.py delete mode 100644 module/plugins/hoster/EuroshareEu.py delete mode 100644 module/plugins/hoster/ExtabitCom.py delete mode 100644 module/plugins/hoster/FastixRu.py delete mode 100644 module/plugins/hoster/FastshareCz.py delete mode 100644 module/plugins/hoster/File4safeCom.py delete mode 100644 module/plugins/hoster/FileApeCom.py delete mode 100644 module/plugins/hoster/FileParadoxIn.py delete mode 100644 module/plugins/hoster/FileStoreTo.py delete mode 100644 module/plugins/hoster/FilebeerInfo.py delete mode 100644 module/plugins/hoster/FilecloudIo.py delete mode 100644 module/plugins/hoster/FilefactoryCom.py delete mode 100644 module/plugins/hoster/FilejungleCom.py delete mode 100644 module/plugins/hoster/FileomCom.py delete mode 100644 module/plugins/hoster/FilepostCom.py delete mode 100644 module/plugins/hoster/FilerNet.py delete mode 100644 module/plugins/hoster/FilerioCom.py delete mode 100644 module/plugins/hoster/FilesMailRu.py delete mode 100644 module/plugins/hoster/FileserveCom.py delete mode 100644 module/plugins/hoster/FileshareInUa.py delete mode 100644 module/plugins/hoster/FilezyNet.py delete mode 100644 module/plugins/hoster/FiredriveCom.py delete mode 100644 module/plugins/hoster/FlyFilesNet.py delete mode 100644 module/plugins/hoster/FourSharedCom.py delete mode 100644 module/plugins/hoster/FreakshareCom.py delete mode 100644 module/plugins/hoster/FreeWayMe.py delete mode 100644 module/plugins/hoster/FreevideoCz.py delete mode 100644 module/plugins/hoster/FshareVn.py delete mode 100644 module/plugins/hoster/Ftp.py delete mode 100644 module/plugins/hoster/GamefrontCom.py delete mode 100644 module/plugins/hoster/GigapetaCom.py delete mode 100644 module/plugins/hoster/GooIm.py delete mode 100644 module/plugins/hoster/HellshareCz.py delete mode 100644 module/plugins/hoster/HellspyCz.py delete mode 100644 module/plugins/hoster/HotfileCom.py delete mode 100644 module/plugins/hoster/HugefilesNet.py delete mode 100644 module/plugins/hoster/HundredEightyUploadCom.py delete mode 100644 module/plugins/hoster/IFileWs.py delete mode 100644 module/plugins/hoster/IcyFilesCom.py delete mode 100644 module/plugins/hoster/IfileIt.py delete mode 100644 module/plugins/hoster/IfolderRu.py delete mode 100644 module/plugins/hoster/JumbofilesCom.py delete mode 100644 module/plugins/hoster/Keep2shareCC.py delete mode 100644 module/plugins/hoster/LemUploadsCom.py delete mode 100644 module/plugins/hoster/LetitbitNet.py delete mode 100644 module/plugins/hoster/LinksnappyCom.py delete mode 100644 module/plugins/hoster/LoadTo.py delete mode 100644 module/plugins/hoster/LomafileCom.py delete mode 100644 module/plugins/hoster/LuckyShareNet.py delete mode 100644 module/plugins/hoster/MediafireCom.py delete mode 100644 module/plugins/hoster/MegaDebridEu.py delete mode 100644 module/plugins/hoster/MegaFilesSe.py delete mode 100644 module/plugins/hoster/MegaNz.py delete mode 100644 module/plugins/hoster/MegacrypterCom.py delete mode 100644 module/plugins/hoster/MegareleaseOrg.py delete mode 100644 module/plugins/hoster/MegasharesCom.py delete mode 100644 module/plugins/hoster/MovReelCom.py delete mode 100644 module/plugins/hoster/MultiDebridCom.py delete mode 100644 module/plugins/hoster/MultishareCz.py delete mode 100644 module/plugins/hoster/MyvideoDe.py delete mode 100644 module/plugins/hoster/NarodRu.py delete mode 100644 module/plugins/hoster/NetloadIn.py delete mode 100644 module/plugins/hoster/NosuploadCom.py delete mode 100644 module/plugins/hoster/NovafileCom.py delete mode 100644 module/plugins/hoster/NowDownloadEu.py delete mode 100644 module/plugins/hoster/OboomCom.py delete mode 100644 module/plugins/hoster/OneFichierCom.py delete mode 100644 module/plugins/hoster/OverLoadMe.py delete mode 100644 module/plugins/hoster/PandaPlanet.py delete mode 100644 module/plugins/hoster/PornhostCom.py delete mode 100644 module/plugins/hoster/PornhubCom.py delete mode 100644 module/plugins/hoster/PotloadCom.py delete mode 100644 module/plugins/hoster/Premium4Me.py delete mode 100644 module/plugins/hoster/PremiumizeMe.py delete mode 100644 module/plugins/hoster/PromptfileCom.py delete mode 100644 module/plugins/hoster/QuickshareCz.py delete mode 100644 module/plugins/hoster/RPNetBiz.py delete mode 100644 module/plugins/hoster/RapidgatorNet.py delete mode 100644 module/plugins/hoster/RapidshareCom.py delete mode 100644 module/plugins/hoster/RarefileNet.py delete mode 100644 module/plugins/hoster/RealdebridCom.py delete mode 100644 module/plugins/hoster/RedtubeCom.py delete mode 100644 module/plugins/hoster/RehostTo.py delete mode 100644 module/plugins/hoster/RemixshareCom.py delete mode 100644 module/plugins/hoster/RgHostNet.py delete mode 100644 module/plugins/hoster/RyushareCom.py delete mode 100644 module/plugins/hoster/SecureUploadEu.py delete mode 100644 module/plugins/hoster/SendmywayCom.py delete mode 100644 module/plugins/hoster/SendspaceCom.py delete mode 100644 module/plugins/hoster/Share4webCom.py delete mode 100644 module/plugins/hoster/Share76Com.py delete mode 100644 module/plugins/hoster/ShareFilesCo.py delete mode 100644 module/plugins/hoster/ShareRapidCom.py delete mode 100644 module/plugins/hoster/SharebeesCom.py delete mode 100644 module/plugins/hoster/ShareonlineBiz.py delete mode 100644 module/plugins/hoster/ShareplaceCom.py delete mode 100644 module/plugins/hoster/ShragleCom.py delete mode 100644 module/plugins/hoster/SimplyPremiumCom.py delete mode 100644 module/plugins/hoster/SimplydebridCom.py delete mode 100644 module/plugins/hoster/SockshareCom.py delete mode 100644 module/plugins/hoster/SoundcloudCom.py delete mode 100644 module/plugins/hoster/SpeedLoadOrg.py delete mode 100644 module/plugins/hoster/SpeedfileCz.py delete mode 100644 module/plugins/hoster/SpeedyshareCom.py delete mode 100644 module/plugins/hoster/StreamCz.py delete mode 100644 module/plugins/hoster/StreamcloudEu.py delete mode 100644 module/plugins/hoster/TurbobitNet.py delete mode 100644 module/plugins/hoster/TurbouploadCom.py delete mode 100644 module/plugins/hoster/TusfilesNet.py delete mode 100644 module/plugins/hoster/TwoSharedCom.py delete mode 100644 module/plugins/hoster/UlozTo.py delete mode 100644 module/plugins/hoster/UloziskoSk.py delete mode 100644 module/plugins/hoster/UnibytesCom.py delete mode 100644 module/plugins/hoster/UnrestrictLi.py delete mode 100644 module/plugins/hoster/UploadStationCom.py delete mode 100644 module/plugins/hoster/UploadedTo.py delete mode 100644 module/plugins/hoster/UploadheroCom.py delete mode 100644 module/plugins/hoster/UploadingCom.py delete mode 100644 module/plugins/hoster/UpstoreNet.py delete mode 100644 module/plugins/hoster/UptoboxCom.py delete mode 100644 module/plugins/hoster/VeehdCom.py delete mode 100644 module/plugins/hoster/VeohCom.py delete mode 100644 module/plugins/hoster/VidPlayNet.py delete mode 100644 module/plugins/hoster/VimeoCom.py delete mode 100644 module/plugins/hoster/Vipleech4uCom.py delete mode 100644 module/plugins/hoster/WarserverCz.py delete mode 100644 module/plugins/hoster/WebshareCz.py delete mode 100644 module/plugins/hoster/WrzucTo.py delete mode 100644 module/plugins/hoster/WuploadCom.py delete mode 100644 module/plugins/hoster/X7To.py delete mode 100644 module/plugins/hoster/XFileSharingPro.py delete mode 100644 module/plugins/hoster/XHamsterCom.py delete mode 100644 module/plugins/hoster/XVideosCom.py delete mode 100644 module/plugins/hoster/Xdcc.py delete mode 100644 module/plugins/hoster/YibaishiwuCom.py delete mode 100644 module/plugins/hoster/YoupornCom.py delete mode 100644 module/plugins/hoster/YourfilesTo.py delete mode 100644 module/plugins/hoster/YoutubeCom.py delete mode 100644 module/plugins/hoster/ZDF.py delete mode 100644 module/plugins/hoster/ZeveraCom.py delete mode 100644 module/plugins/hoster/ZippyshareCom.py delete mode 100644 module/plugins/hoster/__init__.py delete mode 100644 module/plugins/internal/AbstractExtractor.py delete mode 100644 module/plugins/internal/CaptchaService.py delete mode 100644 module/plugins/internal/DeadCrypter.py delete mode 100644 module/plugins/internal/DeadHoster.py delete mode 100644 module/plugins/internal/MultiHoster.py delete mode 100644 module/plugins/internal/SimpleCrypter.py delete mode 100644 module/plugins/internal/SimpleHoster.py delete mode 100644 module/plugins/internal/UnRar.py delete mode 100644 module/plugins/internal/UnZip.py delete mode 100644 module/plugins/internal/XFSPAccount.py delete mode 100644 module/plugins/internal/__init__.py delete mode 100644 module/plugins/ocr/GigasizeCom.py delete mode 100644 module/plugins/ocr/LinksaveIn.py delete mode 100644 module/plugins/ocr/NetloadIn.py delete mode 100644 module/plugins/ocr/ShareonlineBiz.py delete mode 100644 module/plugins/ocr/__init__.py delete mode 100644 module/remote/ClickAndLoadBackend.py delete mode 100644 module/remote/RemoteManager.py delete mode 100644 module/remote/SocketBackend.py delete mode 100644 module/remote/ThriftBackend.py delete mode 100644 module/remote/__init__.py delete mode 100644 module/remote/socketbackend/__init__.py delete mode 100644 module/remote/socketbackend/create_ttypes.py delete mode 100644 module/remote/socketbackend/ttypes.py delete mode 100644 module/remote/thriftbackend/Processor.py delete mode 100644 module/remote/thriftbackend/Protocol.py delete mode 100644 module/remote/thriftbackend/Socket.py delete mode 100644 module/remote/thriftbackend/ThriftClient.py delete mode 100644 module/remote/thriftbackend/ThriftTest.py delete mode 100644 module/remote/thriftbackend/Transport.py delete mode 100644 module/remote/thriftbackend/__init__.py delete mode 100644 module/remote/thriftbackend/pyload.thrift delete mode 100644 module/remote/thriftbackend/thriftgen/__init__.py delete mode 100755 module/remote/thriftbackend/thriftgen/pyload/Pyload-remote delete mode 100644 module/remote/thriftbackend/thriftgen/pyload/Pyload.py delete mode 100644 module/remote/thriftbackend/thriftgen/pyload/__init__.py delete mode 100644 module/remote/thriftbackend/thriftgen/pyload/constants.py delete mode 100644 module/remote/thriftbackend/thriftgen/pyload/ttypes.py delete mode 100644 module/setup.py delete mode 100644 module/threads/PluginThread.py delete mode 100644 module/threads/ServerThread.py delete mode 100644 module/threads/__init__.py delete mode 100644 module/unescape.py delete mode 100644 module/utils.py delete mode 100644 module/webui/__init__.py delete mode 100644 module/webui/app/__init__.py delete mode 100644 module/webui/app/api.py delete mode 100644 module/webui/app/cnl.py delete mode 100644 module/webui/app/json.py delete mode 100644 module/webui/app/pyload.py delete mode 100644 module/webui/app/utils.py delete mode 100644 module/webui/filters.py delete mode 100644 module/webui/middlewares.py delete mode 100644 module/webui/servers/lighttpd_default.conf delete mode 100644 module/webui/servers/nginx_default.conf delete mode 100644 module/webui/themes/dark/css/MooDialog.css delete mode 100644 module/webui/themes/dark/css/dark.css delete mode 100644 module/webui/themes/dark/css/log.css delete mode 100644 module/webui/themes/dark/css/pathchooser.css delete mode 100644 module/webui/themes/dark/css/window.css delete mode 100644 module/webui/themes/dark/img/MooDialog/dialog-close.png delete mode 100644 module/webui/themes/dark/img/MooDialog/dialog-error.png delete mode 100644 module/webui/themes/dark/img/MooDialog/dialog-question.png delete mode 100644 module/webui/themes/dark/img/MooDialog/dialog-warning.png delete mode 100644 module/webui/themes/dark/img/button.png delete mode 100644 module/webui/themes/dark/img/dark-bg.jpg delete mode 100644 module/webui/themes/dark/img/default/add_folder.png delete mode 100644 module/webui/themes/dark/img/default/ajax-loader.gif delete mode 100644 module/webui/themes/dark/img/default/arrow_refresh.png delete mode 100644 module/webui/themes/dark/img/default/arrow_right.png delete mode 100644 module/webui/themes/dark/img/default/big_button.gif delete mode 100644 module/webui/themes/dark/img/default/big_button_over.gif delete mode 100644 module/webui/themes/dark/img/default/body.png delete mode 100644 module/webui/themes/dark/img/default/closebtn.gif delete mode 100644 module/webui/themes/dark/img/default/cog.png delete mode 100644 module/webui/themes/dark/img/default/control_add.png delete mode 100644 module/webui/themes/dark/img/default/control_add_blue.png delete mode 100644 module/webui/themes/dark/img/default/control_cancel.png delete mode 100644 module/webui/themes/dark/img/default/control_cancel_blue.png delete mode 100644 module/webui/themes/dark/img/default/control_pause.png delete mode 100644 module/webui/themes/dark/img/default/control_pause_blue.png delete mode 100644 module/webui/themes/dark/img/default/control_play.png delete mode 100644 module/webui/themes/dark/img/default/control_play_blue.png delete mode 100644 module/webui/themes/dark/img/default/control_stop.png delete mode 100644 module/webui/themes/dark/img/default/control_stop_blue.png delete mode 100644 module/webui/themes/dark/img/default/delete.png delete mode 100644 module/webui/themes/dark/img/default/drag_corner.gif delete mode 100644 module/webui/themes/dark/img/default/error.png delete mode 100644 module/webui/themes/dark/img/default/folder.png delete mode 100644 module/webui/themes/dark/img/default/full.png delete mode 100644 module/webui/themes/dark/img/default/head-login.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-collector.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-config.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-development.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-download.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-home.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-index.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-news.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-queue.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-recent.png delete mode 100644 module/webui/themes/dark/img/default/head-menu-wiki.png delete mode 100644 module/webui/themes/dark/img/default/head-search-noshadow.png delete mode 100644 module/webui/themes/dark/img/default/head_bg1.png delete mode 100644 module/webui/themes/dark/img/default/images.png delete mode 100644 module/webui/themes/dark/img/default/notice.png delete mode 100644 module/webui/themes/dark/img/default/package_go.png delete mode 100644 module/webui/themes/dark/img/default/page-tools-backlinks.png delete mode 100644 module/webui/themes/dark/img/default/page-tools-edit.png delete mode 100644 module/webui/themes/dark/img/default/page-tools-revisions.png delete mode 100644 module/webui/themes/dark/img/default/parseUri.png delete mode 100644 module/webui/themes/dark/img/default/pencil.png delete mode 100644 module/webui/themes/dark/img/default/reconnect.png delete mode 100644 module/webui/themes/dark/img/default/status_None.png delete mode 100644 module/webui/themes/dark/img/default/status_downloading.png delete mode 100644 module/webui/themes/dark/img/default/status_failed.png delete mode 100644 module/webui/themes/dark/img/default/status_finished.png delete mode 100644 module/webui/themes/dark/img/default/status_offline.png delete mode 100644 module/webui/themes/dark/img/default/status_proc.png delete mode 100644 module/webui/themes/dark/img/default/status_queue.png delete mode 100644 module/webui/themes/dark/img/default/status_waiting.png delete mode 100644 module/webui/themes/dark/img/default/success.png delete mode 100644 module/webui/themes/dark/img/default/tabs-border-bottom.png delete mode 100644 module/webui/themes/dark/img/default/user-actions-logout.png delete mode 100644 module/webui/themes/dark/img/default/user-actions-profile.png delete mode 100644 module/webui/themes/dark/img/default/user-info.png delete mode 100644 module/webui/themes/dark/img/pyload-logo.png delete mode 100644 module/webui/themes/dark/img/tab-background.png delete mode 100644 module/webui/themes/dark/js/render/admin.coffee delete mode 100644 module/webui/themes/dark/js/render/admin.min.js delete mode 100644 module/webui/themes/dark/js/render/base.coffee delete mode 100644 module/webui/themes/dark/js/render/base.min.js delete mode 100644 module/webui/themes/dark/js/render/package.js delete mode 100644 module/webui/themes/dark/js/render/settings.coffee delete mode 100644 module/webui/themes/dark/js/render/settings.min.js delete mode 100644 module/webui/themes/dark/js/static/MooDialog.js delete mode 100644 module/webui/themes/dark/js/static/MooDialog.min.js delete mode 100644 module/webui/themes/dark/js/static/MooDropMenu.js delete mode 100644 module/webui/themes/dark/js/static/MooDropMenu.min.js delete mode 100644 module/webui/themes/dark/js/static/mootools-core.js delete mode 100644 module/webui/themes/dark/js/static/mootools-core.min.js delete mode 100644 module/webui/themes/dark/js/static/mootools-more.js delete mode 100644 module/webui/themes/dark/js/static/mootools-more.min.js delete mode 100644 module/webui/themes/dark/js/static/purr.js delete mode 100644 module/webui/themes/dark/js/static/purr.min.js delete mode 100644 module/webui/themes/dark/js/static/tinytab.js delete mode 100644 module/webui/themes/dark/js/static/tinytab.min.js delete mode 100644 module/webui/themes/dark/tml/admin.html delete mode 100644 module/webui/themes/dark/tml/base.html delete mode 100644 module/webui/themes/dark/tml/captcha.html delete mode 100644 module/webui/themes/dark/tml/downloads.html delete mode 100644 module/webui/themes/dark/tml/folder.html delete mode 100644 module/webui/themes/dark/tml/home.html delete mode 100644 module/webui/themes/dark/tml/info.html delete mode 100644 module/webui/themes/dark/tml/login.html delete mode 100644 module/webui/themes/dark/tml/logout.html delete mode 100644 module/webui/themes/dark/tml/logs.html delete mode 100644 module/webui/themes/dark/tml/pathchooser.html delete mode 100644 module/webui/themes/dark/tml/queue.html delete mode 100644 module/webui/themes/dark/tml/settings.html delete mode 100644 module/webui/themes/dark/tml/settings_item.html delete mode 100644 module/webui/themes/dark/tml/window.html delete mode 100644 module/webui/themes/default/css/MooDialog.css delete mode 100644 module/webui/themes/default/css/default.css delete mode 100644 module/webui/themes/default/css/log.css delete mode 100644 module/webui/themes/default/css/pathchooser.css delete mode 100644 module/webui/themes/default/css/window.css delete mode 100644 module/webui/themes/default/img/MooDialog/dialog-close.png delete mode 100644 module/webui/themes/default/img/MooDialog/dialog-error.png delete mode 100644 module/webui/themes/default/img/MooDialog/dialog-question.png delete mode 100644 module/webui/themes/default/img/MooDialog/dialog-warning.png delete mode 100644 module/webui/themes/default/img/add_folder.png delete mode 100644 module/webui/themes/default/img/ajax-loader.gif delete mode 100644 module/webui/themes/default/img/arrow_refresh.png delete mode 100644 module/webui/themes/default/img/arrow_right.png delete mode 100644 module/webui/themes/default/img/big_button.gif delete mode 100644 module/webui/themes/default/img/big_button_over.gif delete mode 100644 module/webui/themes/default/img/body.png delete mode 100644 module/webui/themes/default/img/button.png delete mode 100644 module/webui/themes/default/img/closebtn.gif delete mode 100644 module/webui/themes/default/img/cog.png delete mode 100644 module/webui/themes/default/img/control_add.png delete mode 100644 module/webui/themes/default/img/control_add_blue.png delete mode 100644 module/webui/themes/default/img/control_cancel.png delete mode 100644 module/webui/themes/default/img/control_cancel_blue.png delete mode 100644 module/webui/themes/default/img/control_pause.png delete mode 100644 module/webui/themes/default/img/control_pause_blue.png delete mode 100644 module/webui/themes/default/img/control_play.png delete mode 100644 module/webui/themes/default/img/control_play_blue.png delete mode 100644 module/webui/themes/default/img/control_stop.png delete mode 100644 module/webui/themes/default/img/control_stop_blue.png delete mode 100644 module/webui/themes/default/img/delete.png delete mode 100644 module/webui/themes/default/img/drag_corner.gif delete mode 100644 module/webui/themes/default/img/error.png delete mode 100644 module/webui/themes/default/img/folder.png delete mode 100644 module/webui/themes/default/img/full.png delete mode 100644 module/webui/themes/default/img/head-login.png delete mode 100644 module/webui/themes/default/img/head-menu-collector.png delete mode 100644 module/webui/themes/default/img/head-menu-config.png delete mode 100644 module/webui/themes/default/img/head-menu-development.png delete mode 100644 module/webui/themes/default/img/head-menu-download.png delete mode 100644 module/webui/themes/default/img/head-menu-home.png delete mode 100644 module/webui/themes/default/img/head-menu-index.png delete mode 100644 module/webui/themes/default/img/head-menu-news.png delete mode 100644 module/webui/themes/default/img/head-menu-queue.png delete mode 100644 module/webui/themes/default/img/head-menu-recent.png delete mode 100644 module/webui/themes/default/img/head-menu-wiki.png delete mode 100644 module/webui/themes/default/img/head-search-noshadow.png delete mode 100644 module/webui/themes/default/img/head_bg1.png delete mode 100644 module/webui/themes/default/img/images.png delete mode 100644 module/webui/themes/default/img/notice.png delete mode 100644 module/webui/themes/default/img/package_go.png delete mode 100644 module/webui/themes/default/img/page-tools-backlinks.png delete mode 100644 module/webui/themes/default/img/page-tools-edit.png delete mode 100644 module/webui/themes/default/img/page-tools-revisions.png delete mode 100644 module/webui/themes/default/img/parseUri.png delete mode 100644 module/webui/themes/default/img/pencil.png delete mode 100644 module/webui/themes/default/img/pyload-logo.png delete mode 100644 module/webui/themes/default/img/reconnect.png delete mode 100644 module/webui/themes/default/img/status_None.png delete mode 100644 module/webui/themes/default/img/status_downloading.png delete mode 100644 module/webui/themes/default/img/status_failed.png delete mode 100644 module/webui/themes/default/img/status_finished.png delete mode 100644 module/webui/themes/default/img/status_offline.png delete mode 100644 module/webui/themes/default/img/status_proc.png delete mode 100644 module/webui/themes/default/img/status_queue.png delete mode 100644 module/webui/themes/default/img/status_waiting.png delete mode 100644 module/webui/themes/default/img/success.png delete mode 100644 module/webui/themes/default/img/tab-background.png delete mode 100644 module/webui/themes/default/img/tabs-border-bottom.png delete mode 100644 module/webui/themes/default/img/user-actions-logout.png delete mode 100644 module/webui/themes/default/img/user-actions-profile.png delete mode 100644 module/webui/themes/default/img/user-info.png delete mode 100644 module/webui/themes/default/js/render/admin.coffee delete mode 100644 module/webui/themes/default/js/render/admin.min.js delete mode 100644 module/webui/themes/default/js/render/base.coffee delete mode 100644 module/webui/themes/default/js/render/base.min.js delete mode 100644 module/webui/themes/default/js/render/filemanager.js delete mode 100644 module/webui/themes/default/js/render/package.js delete mode 100644 module/webui/themes/default/js/render/settings.coffee delete mode 100644 module/webui/themes/default/js/render/settings.min.js delete mode 100644 module/webui/themes/default/js/static/MooDialog.js delete mode 100644 module/webui/themes/default/js/static/MooDialog.min.js delete mode 100644 module/webui/themes/default/js/static/MooDropMenu.js delete mode 100644 module/webui/themes/default/js/static/MooDropMenu.min.js delete mode 100644 module/webui/themes/default/js/static/mootools-core.js delete mode 100644 module/webui/themes/default/js/static/mootools-core.min.js delete mode 100644 module/webui/themes/default/js/static/mootools-more.js delete mode 100644 module/webui/themes/default/js/static/mootools-more.min.js delete mode 100644 module/webui/themes/default/js/static/purr.js delete mode 100644 module/webui/themes/default/js/static/purr.min.js delete mode 100644 module/webui/themes/default/js/static/tinytab.js delete mode 100644 module/webui/themes/default/js/static/tinytab.min.js delete mode 100644 module/webui/themes/default/tml/admin.html delete mode 100644 module/webui/themes/default/tml/base.html delete mode 100644 module/webui/themes/default/tml/captcha.html delete mode 100644 module/webui/themes/default/tml/downloads.html delete mode 100644 module/webui/themes/default/tml/filemanager.html delete mode 100644 module/webui/themes/default/tml/folder.html delete mode 100644 module/webui/themes/default/tml/home.html delete mode 100644 module/webui/themes/default/tml/info.html delete mode 100644 module/webui/themes/default/tml/login.html delete mode 100644 module/webui/themes/default/tml/logout.html delete mode 100644 module/webui/themes/default/tml/logs.html delete mode 100644 module/webui/themes/default/tml/pathchooser.html delete mode 100644 module/webui/themes/default/tml/queue.html delete mode 100644 module/webui/themes/default/tml/settings.html delete mode 100644 module/webui/themes/default/tml/settings_item.html delete mode 100644 module/webui/themes/default/tml/window.html delete mode 100644 module/webui/themes/flat/css/MooDialog.css delete mode 100644 module/webui/themes/flat/css/flat.css delete mode 100644 module/webui/themes/flat/css/log.css delete mode 100644 module/webui/themes/flat/css/pathchooser.css delete mode 100644 module/webui/themes/flat/css/window.css delete mode 100644 module/webui/themes/flat/img/MooDialog/dialog-close.png delete mode 100644 module/webui/themes/flat/img/MooDialog/dialog-error.png delete mode 100644 module/webui/themes/flat/img/MooDialog/dialog-question.png delete mode 100644 module/webui/themes/flat/img/MooDialog/dialog-warning.png delete mode 100644 module/webui/themes/flat/img/arrow_refresh.png delete mode 100644 module/webui/themes/flat/img/arrow_right.png delete mode 100644 module/webui/themes/flat/img/button.png delete mode 100644 module/webui/themes/flat/img/cog.png delete mode 100644 module/webui/themes/flat/img/control_add.png delete mode 100644 module/webui/themes/flat/img/control_add_blue.png delete mode 100644 module/webui/themes/flat/img/control_cancel.png delete mode 100644 module/webui/themes/flat/img/control_cancel_blue.png delete mode 100644 module/webui/themes/flat/img/control_pause.png delete mode 100644 module/webui/themes/flat/img/control_pause_blue.png delete mode 100644 module/webui/themes/flat/img/control_play.png delete mode 100644 module/webui/themes/flat/img/control_play_blue.png delete mode 100644 module/webui/themes/flat/img/control_stop.png delete mode 100644 module/webui/themes/flat/img/control_stop_blue.png delete mode 100644 module/webui/themes/flat/img/default/add_folder.png delete mode 100644 module/webui/themes/flat/img/default/ajax-loader.gif delete mode 100644 module/webui/themes/flat/img/default/big_button.gif delete mode 100644 module/webui/themes/flat/img/default/big_button_over.gif delete mode 100644 module/webui/themes/flat/img/default/body.png delete mode 100644 module/webui/themes/flat/img/default/closebtn.gif delete mode 100644 module/webui/themes/flat/img/default/drag_corner.gif delete mode 100644 module/webui/themes/flat/img/default/full.png delete mode 100644 module/webui/themes/flat/img/default/head-menu-recent.png delete mode 100644 module/webui/themes/flat/img/default/head_bg1.png delete mode 100644 module/webui/themes/flat/img/default/images.png delete mode 100644 module/webui/themes/flat/img/default/parseUri.png delete mode 100644 module/webui/themes/flat/img/default/pyload-logo.png delete mode 100644 module/webui/themes/flat/img/default/tab-background.png delete mode 100644 module/webui/themes/flat/img/default/tabs-border-bottom.png delete mode 100644 module/webui/themes/flat/img/delete.png delete mode 100644 module/webui/themes/flat/img/error.png delete mode 100644 module/webui/themes/flat/img/folder.png delete mode 100644 module/webui/themes/flat/img/head-login.png delete mode 100644 module/webui/themes/flat/img/head-menu-collector.png delete mode 100644 module/webui/themes/flat/img/head-menu-config.png delete mode 100644 module/webui/themes/flat/img/head-menu-development.png delete mode 100644 module/webui/themes/flat/img/head-menu-download.png delete mode 100644 module/webui/themes/flat/img/head-menu-home.png delete mode 100644 module/webui/themes/flat/img/head-menu-index.png delete mode 100644 module/webui/themes/flat/img/head-menu-news.png delete mode 100644 module/webui/themes/flat/img/head-menu-queue.png delete mode 100644 module/webui/themes/flat/img/head-menu-wiki.png delete mode 100644 module/webui/themes/flat/img/head-search-noshadow.png delete mode 100644 module/webui/themes/flat/img/notice.png delete mode 100644 module/webui/themes/flat/img/package_go.png delete mode 100644 module/webui/themes/flat/img/page-tools-backlinks.png delete mode 100644 module/webui/themes/flat/img/page-tools-edit.png delete mode 100644 module/webui/themes/flat/img/page-tools-revisions.png delete mode 100644 module/webui/themes/flat/img/pencil.png delete mode 100644 module/webui/themes/flat/img/reconnect.png delete mode 100644 module/webui/themes/flat/img/status_None.png delete mode 100644 module/webui/themes/flat/img/status_downloading.png delete mode 100644 module/webui/themes/flat/img/status_failed.png delete mode 100644 module/webui/themes/flat/img/status_finished.png delete mode 100644 module/webui/themes/flat/img/status_offline.png delete mode 100644 module/webui/themes/flat/img/status_proc.png delete mode 100644 module/webui/themes/flat/img/status_queue.png delete mode 100644 module/webui/themes/flat/img/status_waiting.png delete mode 100644 module/webui/themes/flat/img/success.png delete mode 100644 module/webui/themes/flat/img/user-actions-logout.png delete mode 100644 module/webui/themes/flat/img/user-actions-profile.png delete mode 100644 module/webui/themes/flat/img/user-info.png delete mode 100644 module/webui/themes/flat/js/render/admin.coffee delete mode 100644 module/webui/themes/flat/js/render/admin.min.js delete mode 100644 module/webui/themes/flat/js/render/base.coffee delete mode 100644 module/webui/themes/flat/js/render/base.min.js delete mode 100644 module/webui/themes/flat/js/render/package.js delete mode 100644 module/webui/themes/flat/js/render/settings.coffee delete mode 100644 module/webui/themes/flat/js/render/settings.min.js delete mode 100644 module/webui/themes/flat/js/static/MooDialog.js delete mode 100644 module/webui/themes/flat/js/static/MooDialog.min.js delete mode 100644 module/webui/themes/flat/js/static/MooDropMenu.js delete mode 100644 module/webui/themes/flat/js/static/MooDropMenu.min.js delete mode 100644 module/webui/themes/flat/js/static/mootools-core.js delete mode 100644 module/webui/themes/flat/js/static/mootools-core.min.js delete mode 100644 module/webui/themes/flat/js/static/mootools-more.js delete mode 100644 module/webui/themes/flat/js/static/mootools-more.min.js delete mode 100644 module/webui/themes/flat/js/static/purr.js delete mode 100644 module/webui/themes/flat/js/static/purr.min.js delete mode 100644 module/webui/themes/flat/js/static/tinytab.js delete mode 100644 module/webui/themes/flat/js/static/tinytab.min.js delete mode 100644 module/webui/themes/flat/tml/admin.html delete mode 100644 module/webui/themes/flat/tml/base.html delete mode 100644 module/webui/themes/flat/tml/captcha.html delete mode 100644 module/webui/themes/flat/tml/downloads.html delete mode 100644 module/webui/themes/flat/tml/folder.html delete mode 100644 module/webui/themes/flat/tml/home.html delete mode 100644 module/webui/themes/flat/tml/info.html delete mode 100644 module/webui/themes/flat/tml/login.html delete mode 100644 module/webui/themes/flat/tml/logout.html delete mode 100644 module/webui/themes/flat/tml/logs.html delete mode 100644 module/webui/themes/flat/tml/pathchooser.html delete mode 100644 module/webui/themes/flat/tml/queue.html delete mode 100644 module/webui/themes/flat/tml/settings.html delete mode 100644 module/webui/themes/flat/tml/settings_item.html delete mode 100644 module/webui/themes/flat/tml/window.html create mode 100644 pyload/Api.py create mode 100644 pyload/CaptchaManager.py create mode 100644 pyload/ConfigParser.py create mode 100644 pyload/Core.py create mode 100644 pyload/HookManager.py create mode 100644 pyload/InitHomeDir.py create mode 100644 pyload/PullEvents.py create mode 100644 pyload/PyFile.py create mode 100644 pyload/PyPackage.py create mode 100644 pyload/Scheduler.py create mode 100644 pyload/ThreadManager.py create mode 100644 pyload/__init__.py create mode 100644 pyload/cli/AddPackage.py create mode 100644 pyload/cli/Cli.py create mode 100644 pyload/cli/Handler.py create mode 100644 pyload/cli/ManageFiles.py create mode 100644 pyload/cli/__init__.py create mode 100644 pyload/cli/printer.py create mode 100644 pyload/common/APIExerciser.py create mode 100644 pyload/common/ImportDebugger.py create mode 100644 pyload/common/JsEngine.py create mode 100644 pyload/common/__init__.py create mode 100644 pyload/common/json_layer.py create mode 100644 pyload/common/packagetools.py create mode 100644 pyload/common/pavement.py create mode 100644 pyload/common/pylgettext.py create mode 100644 pyload/common/test_api.py create mode 100644 pyload/common/test_json.py create mode 100644 pyload/config/default.conf create mode 100644 pyload/database/DatabaseBackend.py create mode 100644 pyload/database/FileDatabase.py create mode 100644 pyload/database/StorageDatabase.py create mode 100644 pyload/database/UserDatabase.py create mode 100644 pyload/database/__init__.py create mode 100644 pyload/debug.py create mode 100644 pyload/forwarder.py create mode 100644 pyload/lib/BeautifulSoup.py create mode 100644 pyload/lib/Getch.py create mode 100644 pyload/lib/MultipartPostHandler.py create mode 100644 pyload/lib/SafeEval.py create mode 100644 pyload/lib/__init__.py create mode 100644 pyload/lib/beaker/__init__.py create mode 100644 pyload/lib/beaker/cache.py create mode 100644 pyload/lib/beaker/container.py create mode 100644 pyload/lib/beaker/converters.py create mode 100644 pyload/lib/beaker/crypto/__init__.py create mode 100644 pyload/lib/beaker/crypto/jcecrypto.py create mode 100644 pyload/lib/beaker/crypto/nsscrypto.py create mode 100644 pyload/lib/beaker/crypto/pbkdf2.py create mode 100644 pyload/lib/beaker/crypto/pycrypto.py create mode 100644 pyload/lib/beaker/crypto/util.py create mode 100644 pyload/lib/beaker/exceptions.py create mode 100644 pyload/lib/beaker/ext/__init__.py create mode 100644 pyload/lib/beaker/ext/database.py create mode 100644 pyload/lib/beaker/ext/google.py create mode 100644 pyload/lib/beaker/ext/memcached.py create mode 100644 pyload/lib/beaker/ext/sqla.py create mode 100644 pyload/lib/beaker/middleware.py create mode 100644 pyload/lib/beaker/session.py create mode 100644 pyload/lib/beaker/synchronization.py create mode 100644 pyload/lib/beaker/util.py create mode 100644 pyload/lib/bottle.py create mode 100644 pyload/lib/feedparser.py create mode 100644 pyload/lib/jinja2/__init__.py create mode 100644 pyload/lib/jinja2/_compat.py create mode 100644 pyload/lib/jinja2/_stringdefs.py create mode 100644 pyload/lib/jinja2/bccache.py create mode 100644 pyload/lib/jinja2/compiler.py create mode 100644 pyload/lib/jinja2/constants.py create mode 100644 pyload/lib/jinja2/debug.py create mode 100644 pyload/lib/jinja2/defaults.py create mode 100644 pyload/lib/jinja2/environment.py create mode 100644 pyload/lib/jinja2/exceptions.py create mode 100644 pyload/lib/jinja2/ext.py create mode 100644 pyload/lib/jinja2/filters.py create mode 100644 pyload/lib/jinja2/lexer.py create mode 100644 pyload/lib/jinja2/loaders.py create mode 100644 pyload/lib/jinja2/meta.py create mode 100644 pyload/lib/jinja2/nodes.py create mode 100644 pyload/lib/jinja2/optimizer.py create mode 100644 pyload/lib/jinja2/parser.py create mode 100644 pyload/lib/jinja2/runtime.py create mode 100644 pyload/lib/jinja2/sandbox.py create mode 100644 pyload/lib/jinja2/tests.py create mode 100644 pyload/lib/jinja2/testsuite/__init__.py create mode 100644 pyload/lib/jinja2/testsuite/api.py create mode 100644 pyload/lib/jinja2/testsuite/bytecode_cache.py create mode 100644 pyload/lib/jinja2/testsuite/core_tags.py create mode 100644 pyload/lib/jinja2/testsuite/debug.py create mode 100644 pyload/lib/jinja2/testsuite/doctests.py create mode 100644 pyload/lib/jinja2/testsuite/ext.py create mode 100644 pyload/lib/jinja2/testsuite/filters.py create mode 100644 pyload/lib/jinja2/testsuite/imports.py create mode 100644 pyload/lib/jinja2/testsuite/inheritance.py create mode 100644 pyload/lib/jinja2/testsuite/lexnparse.py create mode 100644 pyload/lib/jinja2/testsuite/loader.py create mode 100644 pyload/lib/jinja2/testsuite/regression.py create mode 100644 pyload/lib/jinja2/testsuite/res/__init__.py create mode 100644 pyload/lib/jinja2/testsuite/res/templates/broken.html create mode 100644 pyload/lib/jinja2/testsuite/res/templates/foo/test.html create mode 100644 pyload/lib/jinja2/testsuite/res/templates/syntaxerror.html create mode 100644 pyload/lib/jinja2/testsuite/res/templates/test.html create mode 100644 pyload/lib/jinja2/testsuite/security.py create mode 100644 pyload/lib/jinja2/testsuite/tests.py create mode 100644 pyload/lib/jinja2/testsuite/utils.py create mode 100644 pyload/lib/jinja2/utils.py create mode 100644 pyload/lib/jinja2/visitor.py create mode 100644 pyload/lib/markupsafe/__init__.py create mode 100644 pyload/lib/markupsafe/_compat.py create mode 100644 pyload/lib/markupsafe/_constants.py create mode 100644 pyload/lib/markupsafe/_native.py create mode 100644 pyload/lib/markupsafe/_speedups.c create mode 100644 pyload/lib/markupsafe/tests.py create mode 100644 pyload/lib/rename_process.py create mode 100644 pyload/lib/simplejson/__init__.py create mode 100644 pyload/lib/simplejson/compat.py create mode 100644 pyload/lib/simplejson/decoder.py create mode 100644 pyload/lib/simplejson/encoder.py create mode 100644 pyload/lib/simplejson/ordered_dict.py create mode 100644 pyload/lib/simplejson/scanner.py create mode 100644 pyload/lib/simplejson/tool.py create mode 100644 pyload/lib/thrift/TSCons.py create mode 100644 pyload/lib/thrift/TSerialization.py create mode 100644 pyload/lib/thrift/TTornado.py create mode 100644 pyload/lib/thrift/Thrift.py create mode 100644 pyload/lib/thrift/__init__.py create mode 100644 pyload/lib/thrift/protocol/TBase.py create mode 100644 pyload/lib/thrift/protocol/TBinaryProtocol.py create mode 100644 pyload/lib/thrift/protocol/TCompactProtocol.py create mode 100644 pyload/lib/thrift/protocol/TJSONProtocol.py create mode 100644 pyload/lib/thrift/protocol/TProtocol.py create mode 100644 pyload/lib/thrift/protocol/__init__.py create mode 100644 pyload/lib/thrift/protocol/fastbinary.c create mode 100644 pyload/lib/thrift/server/THttpServer.py create mode 100644 pyload/lib/thrift/server/TNonblockingServer.py create mode 100644 pyload/lib/thrift/server/TProcessPoolServer.py create mode 100644 pyload/lib/thrift/server/TServer.py create mode 100644 pyload/lib/thrift/server/__init__.py create mode 100644 pyload/lib/thrift/transport/THttpClient.py create mode 100644 pyload/lib/thrift/transport/TSSLSocket.py create mode 100644 pyload/lib/thrift/transport/TSocket.py create mode 100644 pyload/lib/thrift/transport/TTransport.py create mode 100644 pyload/lib/thrift/transport/TTwisted.py create mode 100644 pyload/lib/thrift/transport/TZlibTransport.py create mode 100644 pyload/lib/thrift/transport/__init__.py create mode 100644 pyload/lib/wsgiserver/LICENSE.txt create mode 100644 pyload/lib/wsgiserver/__init__.py create mode 100644 pyload/network/Browser.py create mode 100644 pyload/network/Bucket.py create mode 100644 pyload/network/CookieJar.py create mode 100644 pyload/network/HTTPChunk.py create mode 100644 pyload/network/HTTPDownload.py create mode 100644 pyload/network/HTTPRequest.py create mode 100644 pyload/network/RequestFactory.py create mode 100644 pyload/network/XDCCRequest.py create mode 100644 pyload/network/__init__.py create mode 100644 pyload/plugins/Account.py create mode 100644 pyload/plugins/AccountManager.py create mode 100644 pyload/plugins/Container.py create mode 100644 pyload/plugins/Crypter.py create mode 100644 pyload/plugins/Hook.py create mode 100644 pyload/plugins/Hoster.py create mode 100644 pyload/plugins/OCR.py create mode 100644 pyload/plugins/Plugin.py create mode 100644 pyload/plugins/PluginManager.py create mode 100644 pyload/plugins/README.md create mode 100644 pyload/plugins/__init__.py create mode 100644 pyload/plugins/accounts/AlldebridCom.py create mode 100644 pyload/plugins/accounts/BayfilesCom.py create mode 100644 pyload/plugins/accounts/BitshareCom.py create mode 100644 pyload/plugins/accounts/CramitIn.py create mode 100644 pyload/plugins/accounts/CyberlockerCh.py create mode 100644 pyload/plugins/accounts/CzshareCom.py create mode 100644 pyload/plugins/accounts/DebridItaliaCom.py create mode 100644 pyload/plugins/accounts/DepositfilesCom.py create mode 100644 pyload/plugins/accounts/EasybytezCom.py create mode 100644 pyload/plugins/accounts/EgoFilesCom.py create mode 100644 pyload/plugins/accounts/EuroshareEu.py create mode 100644 pyload/plugins/accounts/FastixRu.py create mode 100644 pyload/plugins/accounts/FastshareCz.py create mode 100644 pyload/plugins/accounts/File4safeCom.py create mode 100644 pyload/plugins/accounts/FilecloudIo.py create mode 100644 pyload/plugins/accounts/FilefactoryCom.py create mode 100644 pyload/plugins/accounts/FilejungleCom.py create mode 100644 pyload/plugins/accounts/FilerNet.py create mode 100644 pyload/plugins/accounts/FilerioCom.py create mode 100644 pyload/plugins/accounts/FilesMailRu.py create mode 100644 pyload/plugins/accounts/FileserveCom.py create mode 100644 pyload/plugins/accounts/FourSharedCom.py create mode 100644 pyload/plugins/accounts/FreakshareCom.py create mode 100644 pyload/plugins/accounts/FreeWayMe.py create mode 100644 pyload/plugins/accounts/FshareVn.py create mode 100644 pyload/plugins/accounts/Ftp.py create mode 100644 pyload/plugins/accounts/HellshareCz.py create mode 100644 pyload/plugins/accounts/HotfileCom.py create mode 100644 pyload/plugins/accounts/Http.py create mode 100644 pyload/plugins/accounts/LetitbitNet.py create mode 100644 pyload/plugins/accounts/LinksnappyCom.py create mode 100644 pyload/plugins/accounts/MegaDebridEu.py create mode 100644 pyload/plugins/accounts/MegasharesCom.py create mode 100644 pyload/plugins/accounts/MovReelCom.py create mode 100644 pyload/plugins/accounts/MultiDebridCom.py create mode 100644 pyload/plugins/accounts/MultishareCz.py create mode 100644 pyload/plugins/accounts/NetloadIn.py create mode 100644 pyload/plugins/accounts/OboomCom.py create mode 100644 pyload/plugins/accounts/OneFichierCom.py create mode 100644 pyload/plugins/accounts/OverLoadMe.py create mode 100644 pyload/plugins/accounts/Premium4Me.py create mode 100644 pyload/plugins/accounts/PremiumizeMe.py create mode 100644 pyload/plugins/accounts/QuickshareCz.py create mode 100644 pyload/plugins/accounts/RPNetBiz.py create mode 100644 pyload/plugins/accounts/RapidgatorNet.py create mode 100644 pyload/plugins/accounts/RapidshareCom.py create mode 100644 pyload/plugins/accounts/RarefileNet.py create mode 100644 pyload/plugins/accounts/RealdebridCom.py create mode 100644 pyload/plugins/accounts/RehostTo.py create mode 100644 pyload/plugins/accounts/RyushareCom.py create mode 100644 pyload/plugins/accounts/ShareRapidCom.py create mode 100644 pyload/plugins/accounts/ShareonlineBiz.py create mode 100644 pyload/plugins/accounts/SimplyPremiumCom.py create mode 100644 pyload/plugins/accounts/SimplydebridCom.py create mode 100644 pyload/plugins/accounts/StahnuTo.py create mode 100644 pyload/plugins/accounts/TurbobitNet.py create mode 100644 pyload/plugins/accounts/UlozTo.py create mode 100644 pyload/plugins/accounts/UnrestrictLi.py create mode 100644 pyload/plugins/accounts/UploadedTo.py create mode 100644 pyload/plugins/accounts/UploadheroCom.py create mode 100644 pyload/plugins/accounts/UploadingCom.py create mode 100644 pyload/plugins/accounts/UptoboxCom.py create mode 100644 pyload/plugins/accounts/YibaishiwuCom.py create mode 100644 pyload/plugins/accounts/ZeveraCom.py create mode 100644 pyload/plugins/accounts/__init__.py create mode 100644 pyload/plugins/container/CCF.py create mode 100644 pyload/plugins/container/DLC_25.pyc create mode 100644 pyload/plugins/container/DLC_26.pyc create mode 100644 pyload/plugins/container/DLC_27.pyc create mode 100644 pyload/plugins/container/LinkList.py create mode 100644 pyload/plugins/container/RSDF.py create mode 100644 pyload/plugins/container/__init__.py create mode 100644 pyload/plugins/crypter/BitshareComFolder.py create mode 100644 pyload/plugins/crypter/C1neonCom.py create mode 100644 pyload/plugins/crypter/ChipDe.py create mode 100644 pyload/plugins/crypter/CrockoComFolder.py create mode 100644 pyload/plugins/crypter/CryptItCom.py create mode 100644 pyload/plugins/crypter/CzshareComFolder.py create mode 100644 pyload/plugins/crypter/DDLMusicOrg.py create mode 100644 pyload/plugins/crypter/DailymotionBatch.py create mode 100644 pyload/plugins/crypter/DataHuFolder.py create mode 100644 pyload/plugins/crypter/DdlstorageComFolder.py create mode 100644 pyload/plugins/crypter/DepositfilesComFolder.py create mode 100644 pyload/plugins/crypter/Dereferer.py create mode 100644 pyload/plugins/crypter/DlProtectCom.py create mode 100644 pyload/plugins/crypter/DontKnowMe.py create mode 100644 pyload/plugins/crypter/DuckCryptInfo.py create mode 100644 pyload/plugins/crypter/DuploadOrgFolder.py create mode 100644 pyload/plugins/crypter/EasybytezComFolder.py create mode 100644 pyload/plugins/crypter/EmbeduploadCom.py create mode 100644 pyload/plugins/crypter/FilebeerInfoFolder.py create mode 100644 pyload/plugins/crypter/FilecloudIoFolder.py create mode 100644 pyload/plugins/crypter/FilefactoryComFolder.py create mode 100644 pyload/plugins/crypter/FilerNetFolder.py create mode 100644 pyload/plugins/crypter/FileserveComFolder.py create mode 100644 pyload/plugins/crypter/FilestubeCom.py create mode 100644 pyload/plugins/crypter/FiletramCom.py create mode 100644 pyload/plugins/crypter/FiredriveComFolder.py create mode 100644 pyload/plugins/crypter/FourChanOrg.py create mode 100644 pyload/plugins/crypter/FreakhareComFolder.py create mode 100644 pyload/plugins/crypter/FreetexthostCom.py create mode 100644 pyload/plugins/crypter/FshareVnFolder.py create mode 100644 pyload/plugins/crypter/GooGl.py create mode 100644 pyload/plugins/crypter/HoerbuchIn.py create mode 100644 pyload/plugins/crypter/HotfileFolderCom.py create mode 100644 pyload/plugins/crypter/ILoadTo.py create mode 100644 pyload/plugins/crypter/ImgurComAlbum.py create mode 100644 pyload/plugins/crypter/LetitbitNetFolder.py create mode 100644 pyload/plugins/crypter/LinkSaveIn.py create mode 100644 pyload/plugins/crypter/LinkdecrypterCom.py create mode 100644 pyload/plugins/crypter/LixIn.py create mode 100644 pyload/plugins/crypter/LofCc.py create mode 100644 pyload/plugins/crypter/MBLinkInfo.py create mode 100644 pyload/plugins/crypter/MediafireComFolder.py create mode 100644 pyload/plugins/crypter/Movie2kTo.py create mode 100644 pyload/plugins/crypter/MultiUpOrg.py create mode 100644 pyload/plugins/crypter/MultiloadCz.py create mode 100644 pyload/plugins/crypter/MultiuploadCom.py create mode 100644 pyload/plugins/crypter/NCryptIn.py create mode 100644 pyload/plugins/crypter/NetfolderIn.py create mode 100644 pyload/plugins/crypter/NosvideoCom.py create mode 100644 pyload/plugins/crypter/OneKhDe.py create mode 100644 pyload/plugins/crypter/OronComFolder.py create mode 100644 pyload/plugins/crypter/PastebinCom.py create mode 100644 pyload/plugins/crypter/QuickshareCzFolder.py create mode 100644 pyload/plugins/crypter/RSLayerCom.py create mode 100644 pyload/plugins/crypter/RelinkUs.py create mode 100644 pyload/plugins/crypter/SafelinkingNet.py create mode 100644 pyload/plugins/crypter/SecuredIn.py create mode 100644 pyload/plugins/crypter/SerienjunkiesOrg.py create mode 100644 pyload/plugins/crypter/ShareLinksBiz.py create mode 100644 pyload/plugins/crypter/ShareRapidComFolder.py create mode 100644 pyload/plugins/crypter/SpeedLoadOrgFolder.py create mode 100644 pyload/plugins/crypter/StealthTo.py create mode 100644 pyload/plugins/crypter/TnyCz.py create mode 100644 pyload/plugins/crypter/TrailerzoneInfo.py create mode 100644 pyload/plugins/crypter/TurbobitNetFolder.py create mode 100644 pyload/plugins/crypter/TusfilesNetFolder.py create mode 100644 pyload/plugins/crypter/UlozToFolder.py create mode 100644 pyload/plugins/crypter/UploadableChFolder.py create mode 100644 pyload/plugins/crypter/UploadedToFolder.py create mode 100644 pyload/plugins/crypter/WiiReloadedOrg.py create mode 100644 pyload/plugins/crypter/XupPl.py create mode 100644 pyload/plugins/crypter/YoutubeBatch.py create mode 100644 pyload/plugins/crypter/__init__.py create mode 100644 pyload/plugins/hooks/AlldebridCom.py create mode 100644 pyload/plugins/hooks/BypassCaptcha.py create mode 100644 pyload/plugins/hooks/Captcha9kw.py create mode 100644 pyload/plugins/hooks/CaptchaBrotherhood.py create mode 100644 pyload/plugins/hooks/Checksum.py create mode 100644 pyload/plugins/hooks/ClickAndLoad.py create mode 100644 pyload/plugins/hooks/DeathByCaptcha.py create mode 100644 pyload/plugins/hooks/DebridItaliaCom.py create mode 100644 pyload/plugins/hooks/DeleteFinished.py create mode 100644 pyload/plugins/hooks/DownloadScheduler.py create mode 100644 pyload/plugins/hooks/EasybytezCom.py create mode 100644 pyload/plugins/hooks/Ev0InFetcher.py create mode 100644 pyload/plugins/hooks/ExpertDecoders.py create mode 100644 pyload/plugins/hooks/ExternalScripts.py create mode 100644 pyload/plugins/hooks/ExtractArchive.py create mode 100644 pyload/plugins/hooks/FastixRu.py create mode 100644 pyload/plugins/hooks/FreeWayMe.py create mode 100644 pyload/plugins/hooks/HotFolder.py create mode 100644 pyload/plugins/hooks/IRCInterface.py create mode 100644 pyload/plugins/hooks/ImageTyperz.py create mode 100644 pyload/plugins/hooks/LinkdecrypterCom.py create mode 100644 pyload/plugins/hooks/LinksnappyCom.py create mode 100644 pyload/plugins/hooks/MegaDebridEu.py create mode 100644 pyload/plugins/hooks/MergeFiles.py create mode 100644 pyload/plugins/hooks/MultiDebridCom.py create mode 100644 pyload/plugins/hooks/MultiHome.py create mode 100644 pyload/plugins/hooks/MultishareCz.py create mode 100644 pyload/plugins/hooks/OverLoadMe.py create mode 100644 pyload/plugins/hooks/Premium4Me.py create mode 100644 pyload/plugins/hooks/PremiumizeMe.py create mode 100644 pyload/plugins/hooks/RPNetBiz.py create mode 100644 pyload/plugins/hooks/RealdebridCom.py create mode 100644 pyload/plugins/hooks/RehostTo.py create mode 100644 pyload/plugins/hooks/RestartFailed.py create mode 100644 pyload/plugins/hooks/SimplyPremiumCom.py create mode 100644 pyload/plugins/hooks/SimplydebridCom.py create mode 100644 pyload/plugins/hooks/UnSkipOnFail.py create mode 100644 pyload/plugins/hooks/UnrestrictLi.py create mode 100644 pyload/plugins/hooks/UpdateManager.py create mode 100644 pyload/plugins/hooks/WindowsPhoneToastNotify.py create mode 100644 pyload/plugins/hooks/XFileSharingPro.py create mode 100644 pyload/plugins/hooks/XMPPInterface.py create mode 100644 pyload/plugins/hooks/ZeveraCom.py create mode 100644 pyload/plugins/hooks/__init__.py create mode 100644 pyload/plugins/hoster/AlldebridCom.py create mode 100644 pyload/plugins/hoster/BasePlugin.py create mode 100644 pyload/plugins/hoster/BayfilesCom.py create mode 100644 pyload/plugins/hoster/BezvadataCz.py create mode 100644 pyload/plugins/hoster/BillionuploadsCom.py create mode 100644 pyload/plugins/hoster/BitshareCom.py create mode 100644 pyload/plugins/hoster/BoltsharingCom.py create mode 100644 pyload/plugins/hoster/CatShareNet.py create mode 100644 pyload/plugins/hoster/CloudzerNet.py create mode 100644 pyload/plugins/hoster/CramitIn.py create mode 100644 pyload/plugins/hoster/CrockoCom.py create mode 100644 pyload/plugins/hoster/CyberlockerCh.py create mode 100644 pyload/plugins/hoster/CzshareCom.py create mode 100644 pyload/plugins/hoster/DailymotionCom.py create mode 100644 pyload/plugins/hoster/DataHu.py create mode 100644 pyload/plugins/hoster/DataportCz.py create mode 100644 pyload/plugins/hoster/DateiTo.py create mode 100644 pyload/plugins/hoster/DdlstorageCom.py create mode 100644 pyload/plugins/hoster/DebridItaliaCom.py create mode 100644 pyload/plugins/hoster/DepositfilesCom.py create mode 100644 pyload/plugins/hoster/DlFreeFr.py create mode 100644 pyload/plugins/hoster/DuploadOrg.py create mode 100644 pyload/plugins/hoster/EasybytezCom.py create mode 100644 pyload/plugins/hoster/EdiskCz.py create mode 100644 pyload/plugins/hoster/EgoFilesCom.py create mode 100644 pyload/plugins/hoster/EpicShareNet.py create mode 100644 pyload/plugins/hoster/EuroshareEu.py create mode 100644 pyload/plugins/hoster/ExtabitCom.py create mode 100644 pyload/plugins/hoster/FastixRu.py create mode 100644 pyload/plugins/hoster/FastshareCz.py create mode 100644 pyload/plugins/hoster/File4safeCom.py create mode 100644 pyload/plugins/hoster/FileApeCom.py create mode 100644 pyload/plugins/hoster/FileParadoxIn.py create mode 100644 pyload/plugins/hoster/FileStoreTo.py create mode 100644 pyload/plugins/hoster/FilebeerInfo.py create mode 100644 pyload/plugins/hoster/FilecloudIo.py create mode 100644 pyload/plugins/hoster/FilefactoryCom.py create mode 100644 pyload/plugins/hoster/FilejungleCom.py create mode 100644 pyload/plugins/hoster/FileomCom.py create mode 100644 pyload/plugins/hoster/FilepostCom.py create mode 100644 pyload/plugins/hoster/FilerNet.py create mode 100644 pyload/plugins/hoster/FilerioCom.py create mode 100644 pyload/plugins/hoster/FilesMailRu.py create mode 100644 pyload/plugins/hoster/FileserveCom.py create mode 100644 pyload/plugins/hoster/FileshareInUa.py create mode 100644 pyload/plugins/hoster/FilezyNet.py create mode 100644 pyload/plugins/hoster/FiredriveCom.py create mode 100644 pyload/plugins/hoster/FlyFilesNet.py create mode 100644 pyload/plugins/hoster/FourSharedCom.py create mode 100644 pyload/plugins/hoster/FreakshareCom.py create mode 100644 pyload/plugins/hoster/FreeWayMe.py create mode 100644 pyload/plugins/hoster/FreevideoCz.py create mode 100644 pyload/plugins/hoster/FshareVn.py create mode 100644 pyload/plugins/hoster/Ftp.py create mode 100644 pyload/plugins/hoster/GamefrontCom.py create mode 100644 pyload/plugins/hoster/GigapetaCom.py create mode 100644 pyload/plugins/hoster/GooIm.py create mode 100644 pyload/plugins/hoster/HellshareCz.py create mode 100644 pyload/plugins/hoster/HellspyCz.py create mode 100644 pyload/plugins/hoster/HotfileCom.py create mode 100644 pyload/plugins/hoster/HugefilesNet.py create mode 100644 pyload/plugins/hoster/HundredEightyUploadCom.py create mode 100644 pyload/plugins/hoster/IFileWs.py create mode 100644 pyload/plugins/hoster/IcyFilesCom.py create mode 100644 pyload/plugins/hoster/IfileIt.py create mode 100644 pyload/plugins/hoster/IfolderRu.py create mode 100644 pyload/plugins/hoster/JumbofilesCom.py create mode 100644 pyload/plugins/hoster/Keep2shareCC.py create mode 100644 pyload/plugins/hoster/LemUploadsCom.py create mode 100644 pyload/plugins/hoster/LetitbitNet.py create mode 100644 pyload/plugins/hoster/LinksnappyCom.py create mode 100644 pyload/plugins/hoster/LoadTo.py create mode 100644 pyload/plugins/hoster/LomafileCom.py create mode 100644 pyload/plugins/hoster/LuckyShareNet.py create mode 100644 pyload/plugins/hoster/MediafireCom.py create mode 100644 pyload/plugins/hoster/MegaDebridEu.py create mode 100644 pyload/plugins/hoster/MegaFilesSe.py create mode 100644 pyload/plugins/hoster/MegaNz.py create mode 100644 pyload/plugins/hoster/MegacrypterCom.py create mode 100644 pyload/plugins/hoster/MegareleaseOrg.py create mode 100644 pyload/plugins/hoster/MegasharesCom.py create mode 100644 pyload/plugins/hoster/MovReelCom.py create mode 100644 pyload/plugins/hoster/MultiDebridCom.py create mode 100644 pyload/plugins/hoster/MultishareCz.py create mode 100644 pyload/plugins/hoster/MyvideoDe.py create mode 100644 pyload/plugins/hoster/NarodRu.py create mode 100644 pyload/plugins/hoster/NetloadIn.py create mode 100644 pyload/plugins/hoster/NosuploadCom.py create mode 100644 pyload/plugins/hoster/NovafileCom.py create mode 100644 pyload/plugins/hoster/NowDownloadEu.py create mode 100644 pyload/plugins/hoster/OboomCom.py create mode 100644 pyload/plugins/hoster/OneFichierCom.py create mode 100644 pyload/plugins/hoster/OverLoadMe.py create mode 100644 pyload/plugins/hoster/PandaPlanet.py create mode 100644 pyload/plugins/hoster/PornhostCom.py create mode 100644 pyload/plugins/hoster/PornhubCom.py create mode 100644 pyload/plugins/hoster/PotloadCom.py create mode 100644 pyload/plugins/hoster/Premium4Me.py create mode 100644 pyload/plugins/hoster/PremiumizeMe.py create mode 100644 pyload/plugins/hoster/PromptfileCom.py create mode 100644 pyload/plugins/hoster/QuickshareCz.py create mode 100644 pyload/plugins/hoster/RPNetBiz.py create mode 100644 pyload/plugins/hoster/RapidgatorNet.py create mode 100644 pyload/plugins/hoster/RapidshareCom.py create mode 100644 pyload/plugins/hoster/RarefileNet.py create mode 100644 pyload/plugins/hoster/RealdebridCom.py create mode 100644 pyload/plugins/hoster/RedtubeCom.py create mode 100644 pyload/plugins/hoster/RehostTo.py create mode 100644 pyload/plugins/hoster/RemixshareCom.py create mode 100644 pyload/plugins/hoster/RgHostNet.py create mode 100644 pyload/plugins/hoster/RyushareCom.py create mode 100644 pyload/plugins/hoster/SecureUploadEu.py create mode 100644 pyload/plugins/hoster/SendmywayCom.py create mode 100644 pyload/plugins/hoster/SendspaceCom.py create mode 100644 pyload/plugins/hoster/Share4webCom.py create mode 100644 pyload/plugins/hoster/Share76Com.py create mode 100644 pyload/plugins/hoster/ShareFilesCo.py create mode 100644 pyload/plugins/hoster/ShareRapidCom.py create mode 100644 pyload/plugins/hoster/SharebeesCom.py create mode 100644 pyload/plugins/hoster/ShareonlineBiz.py create mode 100644 pyload/plugins/hoster/ShareplaceCom.py create mode 100644 pyload/plugins/hoster/ShragleCom.py create mode 100644 pyload/plugins/hoster/SimplyPremiumCom.py create mode 100644 pyload/plugins/hoster/SimplydebridCom.py create mode 100644 pyload/plugins/hoster/SockshareCom.py create mode 100644 pyload/plugins/hoster/SoundcloudCom.py create mode 100644 pyload/plugins/hoster/SpeedLoadOrg.py create mode 100644 pyload/plugins/hoster/SpeedfileCz.py create mode 100644 pyload/plugins/hoster/SpeedyshareCom.py create mode 100644 pyload/plugins/hoster/StreamCz.py create mode 100644 pyload/plugins/hoster/StreamcloudEu.py create mode 100644 pyload/plugins/hoster/TurbobitNet.py create mode 100644 pyload/plugins/hoster/TurbouploadCom.py create mode 100644 pyload/plugins/hoster/TusfilesNet.py create mode 100644 pyload/plugins/hoster/TwoSharedCom.py create mode 100644 pyload/plugins/hoster/UlozTo.py create mode 100644 pyload/plugins/hoster/UloziskoSk.py create mode 100644 pyload/plugins/hoster/UnibytesCom.py create mode 100644 pyload/plugins/hoster/UnrestrictLi.py create mode 100644 pyload/plugins/hoster/UploadStationCom.py create mode 100644 pyload/plugins/hoster/UploadedTo.py create mode 100644 pyload/plugins/hoster/UploadheroCom.py create mode 100644 pyload/plugins/hoster/UploadingCom.py create mode 100644 pyload/plugins/hoster/UpstoreNet.py create mode 100644 pyload/plugins/hoster/UptoboxCom.py create mode 100644 pyload/plugins/hoster/VeehdCom.py create mode 100644 pyload/plugins/hoster/VeohCom.py create mode 100644 pyload/plugins/hoster/VidPlayNet.py create mode 100644 pyload/plugins/hoster/VimeoCom.py create mode 100644 pyload/plugins/hoster/Vipleech4uCom.py create mode 100644 pyload/plugins/hoster/WarserverCz.py create mode 100644 pyload/plugins/hoster/WebshareCz.py create mode 100644 pyload/plugins/hoster/WrzucTo.py create mode 100644 pyload/plugins/hoster/WuploadCom.py create mode 100644 pyload/plugins/hoster/X7To.py create mode 100644 pyload/plugins/hoster/XFileSharingPro.py create mode 100644 pyload/plugins/hoster/XHamsterCom.py create mode 100644 pyload/plugins/hoster/XVideosCom.py create mode 100644 pyload/plugins/hoster/Xdcc.py create mode 100644 pyload/plugins/hoster/YibaishiwuCom.py create mode 100644 pyload/plugins/hoster/YoupornCom.py create mode 100644 pyload/plugins/hoster/YourfilesTo.py create mode 100644 pyload/plugins/hoster/YoutubeCom.py create mode 100644 pyload/plugins/hoster/ZDF.py create mode 100644 pyload/plugins/hoster/ZeveraCom.py create mode 100644 pyload/plugins/hoster/ZippyshareCom.py create mode 100644 pyload/plugins/hoster/__init__.py create mode 100644 pyload/plugins/internal/AbstractExtractor.py create mode 100644 pyload/plugins/internal/CaptchaService.py create mode 100644 pyload/plugins/internal/DeadCrypter.py create mode 100644 pyload/plugins/internal/DeadHoster.py create mode 100644 pyload/plugins/internal/MultiHoster.py create mode 100644 pyload/plugins/internal/SimpleCrypter.py create mode 100644 pyload/plugins/internal/SimpleHoster.py create mode 100644 pyload/plugins/internal/UnRar.py create mode 100644 pyload/plugins/internal/UnZip.py create mode 100644 pyload/plugins/internal/XFSPAccount.py create mode 100644 pyload/plugins/internal/__init__.py create mode 100644 pyload/plugins/ocr/GigasizeCom.py create mode 100644 pyload/plugins/ocr/LinksaveIn.py create mode 100644 pyload/plugins/ocr/NetloadIn.py create mode 100644 pyload/plugins/ocr/ShareonlineBiz.py create mode 100644 pyload/plugins/ocr/__init__.py create mode 100644 pyload/remote/ClickAndLoadBackend.py create mode 100644 pyload/remote/RemoteManager.py create mode 100644 pyload/remote/SocketBackend.py create mode 100644 pyload/remote/ThriftBackend.py create mode 100644 pyload/remote/__init__.py create mode 100644 pyload/remote/socketbackend/__init__.py create mode 100644 pyload/remote/socketbackend/create_ttypes.py create mode 100644 pyload/remote/socketbackend/ttypes.py create mode 100644 pyload/remote/thriftbackend/Processor.py create mode 100644 pyload/remote/thriftbackend/Protocol.py create mode 100644 pyload/remote/thriftbackend/Socket.py create mode 100644 pyload/remote/thriftbackend/ThriftClient.py create mode 100644 pyload/remote/thriftbackend/ThriftTest.py create mode 100644 pyload/remote/thriftbackend/Transport.py create mode 100644 pyload/remote/thriftbackend/__init__.py create mode 100644 pyload/remote/thriftbackend/pyload.thrift create mode 100644 pyload/remote/thriftbackend/thriftgen/__init__.py create mode 100644 pyload/remote/thriftbackend/thriftgen/pyload/Pyload-remote create mode 100644 pyload/remote/thriftbackend/thriftgen/pyload/Pyload.py create mode 100644 pyload/remote/thriftbackend/thriftgen/pyload/__init__.py create mode 100644 pyload/remote/thriftbackend/thriftgen/pyload/constants.py create mode 100644 pyload/remote/thriftbackend/thriftgen/pyload/ttypes.py create mode 100644 pyload/setup.py create mode 100644 pyload/threads/PluginThread.py create mode 100644 pyload/threads/ServerThread.py create mode 100644 pyload/threads/__init__.py create mode 100644 pyload/unescape.py create mode 100644 pyload/utils.py create mode 100644 pyload/webui/__init__.py create mode 100644 pyload/webui/app/__init__.py create mode 100644 pyload/webui/app/api.py create mode 100644 pyload/webui/app/cnl.py create mode 100644 pyload/webui/app/json.py create mode 100644 pyload/webui/app/pyload.py create mode 100644 pyload/webui/app/utils.py create mode 100644 pyload/webui/filters.py create mode 100644 pyload/webui/middlewares.py create mode 100644 pyload/webui/servers/lighttpd_default.conf create mode 100644 pyload/webui/servers/nginx_default.conf create mode 100644 pyload/webui/themes/dark/css/MooDialog.css create mode 100644 pyload/webui/themes/dark/css/dark.css create mode 100644 pyload/webui/themes/dark/css/log.css create mode 100644 pyload/webui/themes/dark/css/pathchooser.css create mode 100644 pyload/webui/themes/dark/css/window.css create mode 100644 pyload/webui/themes/dark/img/MooDialog/dialog-close.png create mode 100644 pyload/webui/themes/dark/img/MooDialog/dialog-error.png create mode 100644 pyload/webui/themes/dark/img/MooDialog/dialog-question.png create mode 100644 pyload/webui/themes/dark/img/MooDialog/dialog-warning.png create mode 100644 pyload/webui/themes/dark/img/button.png create mode 100644 pyload/webui/themes/dark/img/dark-bg.jpg create mode 100644 pyload/webui/themes/dark/img/default/add_folder.png create mode 100644 pyload/webui/themes/dark/img/default/ajax-loader.gif create mode 100644 pyload/webui/themes/dark/img/default/arrow_refresh.png create mode 100644 pyload/webui/themes/dark/img/default/arrow_right.png create mode 100644 pyload/webui/themes/dark/img/default/big_button.gif create mode 100644 pyload/webui/themes/dark/img/default/big_button_over.gif create mode 100644 pyload/webui/themes/dark/img/default/body.png create mode 100644 pyload/webui/themes/dark/img/default/closebtn.gif create mode 100644 pyload/webui/themes/dark/img/default/cog.png create mode 100644 pyload/webui/themes/dark/img/default/control_add.png create mode 100644 pyload/webui/themes/dark/img/default/control_add_blue.png create mode 100644 pyload/webui/themes/dark/img/default/control_cancel.png create mode 100644 pyload/webui/themes/dark/img/default/control_cancel_blue.png create mode 100644 pyload/webui/themes/dark/img/default/control_pause.png create mode 100644 pyload/webui/themes/dark/img/default/control_pause_blue.png create mode 100644 pyload/webui/themes/dark/img/default/control_play.png create mode 100644 pyload/webui/themes/dark/img/default/control_play_blue.png create mode 100644 pyload/webui/themes/dark/img/default/control_stop.png create mode 100644 pyload/webui/themes/dark/img/default/control_stop_blue.png create mode 100644 pyload/webui/themes/dark/img/default/delete.png create mode 100644 pyload/webui/themes/dark/img/default/drag_corner.gif create mode 100644 pyload/webui/themes/dark/img/default/error.png create mode 100644 pyload/webui/themes/dark/img/default/folder.png create mode 100644 pyload/webui/themes/dark/img/default/full.png create mode 100644 pyload/webui/themes/dark/img/default/head-login.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-collector.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-config.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-development.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-download.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-home.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-index.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-news.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-queue.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-recent.png create mode 100644 pyload/webui/themes/dark/img/default/head-menu-wiki.png create mode 100644 pyload/webui/themes/dark/img/default/head-search-noshadow.png create mode 100644 pyload/webui/themes/dark/img/default/head_bg1.png create mode 100644 pyload/webui/themes/dark/img/default/images.png create mode 100644 pyload/webui/themes/dark/img/default/notice.png create mode 100644 pyload/webui/themes/dark/img/default/package_go.png create mode 100644 pyload/webui/themes/dark/img/default/page-tools-backlinks.png create mode 100644 pyload/webui/themes/dark/img/default/page-tools-edit.png create mode 100644 pyload/webui/themes/dark/img/default/page-tools-revisions.png create mode 100644 pyload/webui/themes/dark/img/default/parseUri.png create mode 100644 pyload/webui/themes/dark/img/default/pencil.png create mode 100644 pyload/webui/themes/dark/img/default/reconnect.png create mode 100644 pyload/webui/themes/dark/img/default/status_None.png create mode 100644 pyload/webui/themes/dark/img/default/status_downloading.png create mode 100644 pyload/webui/themes/dark/img/default/status_failed.png create mode 100644 pyload/webui/themes/dark/img/default/status_finished.png create mode 100644 pyload/webui/themes/dark/img/default/status_offline.png create mode 100644 pyload/webui/themes/dark/img/default/status_proc.png create mode 100644 pyload/webui/themes/dark/img/default/status_queue.png create mode 100644 pyload/webui/themes/dark/img/default/status_waiting.png create mode 100644 pyload/webui/themes/dark/img/default/success.png create mode 100644 pyload/webui/themes/dark/img/default/tabs-border-bottom.png create mode 100644 pyload/webui/themes/dark/img/default/user-actions-logout.png create mode 100644 pyload/webui/themes/dark/img/default/user-actions-profile.png create mode 100644 pyload/webui/themes/dark/img/default/user-info.png create mode 100644 pyload/webui/themes/dark/img/pyload-logo.png create mode 100644 pyload/webui/themes/dark/img/tab-background.png create mode 100644 pyload/webui/themes/dark/js/render/admin.coffee create mode 100644 pyload/webui/themes/dark/js/render/admin.min.js create mode 100644 pyload/webui/themes/dark/js/render/base.coffee create mode 100644 pyload/webui/themes/dark/js/render/base.min.js create mode 100644 pyload/webui/themes/dark/js/render/package.js create mode 100644 pyload/webui/themes/dark/js/render/settings.coffee create mode 100644 pyload/webui/themes/dark/js/render/settings.min.js create mode 100644 pyload/webui/themes/dark/js/static/MooDialog.js create mode 100644 pyload/webui/themes/dark/js/static/MooDialog.min.js create mode 100644 pyload/webui/themes/dark/js/static/MooDropMenu.js create mode 100644 pyload/webui/themes/dark/js/static/MooDropMenu.min.js create mode 100644 pyload/webui/themes/dark/js/static/mootools-core.js create mode 100644 pyload/webui/themes/dark/js/static/mootools-core.min.js create mode 100644 pyload/webui/themes/dark/js/static/mootools-more.js create mode 100644 pyload/webui/themes/dark/js/static/mootools-more.min.js create mode 100644 pyload/webui/themes/dark/js/static/purr.js create mode 100644 pyload/webui/themes/dark/js/static/purr.min.js create mode 100644 pyload/webui/themes/dark/js/static/tinytab.js create mode 100644 pyload/webui/themes/dark/js/static/tinytab.min.js create mode 100644 pyload/webui/themes/dark/tml/admin.html create mode 100644 pyload/webui/themes/dark/tml/base.html create mode 100644 pyload/webui/themes/dark/tml/captcha.html create mode 100644 pyload/webui/themes/dark/tml/downloads.html create mode 100644 pyload/webui/themes/dark/tml/folder.html create mode 100644 pyload/webui/themes/dark/tml/home.html create mode 100644 pyload/webui/themes/dark/tml/info.html create mode 100644 pyload/webui/themes/dark/tml/login.html create mode 100644 pyload/webui/themes/dark/tml/logout.html create mode 100644 pyload/webui/themes/dark/tml/logs.html create mode 100644 pyload/webui/themes/dark/tml/pathchooser.html create mode 100644 pyload/webui/themes/dark/tml/queue.html create mode 100644 pyload/webui/themes/dark/tml/settings.html create mode 100644 pyload/webui/themes/dark/tml/settings_item.html create mode 100644 pyload/webui/themes/dark/tml/window.html create mode 100644 pyload/webui/themes/default/css/MooDialog.css create mode 100644 pyload/webui/themes/default/css/default.css create mode 100644 pyload/webui/themes/default/css/log.css create mode 100644 pyload/webui/themes/default/css/pathchooser.css create mode 100644 pyload/webui/themes/default/css/window.css create mode 100644 pyload/webui/themes/default/img/MooDialog/dialog-close.png create mode 100644 pyload/webui/themes/default/img/MooDialog/dialog-error.png create mode 100644 pyload/webui/themes/default/img/MooDialog/dialog-question.png create mode 100644 pyload/webui/themes/default/img/MooDialog/dialog-warning.png create mode 100644 pyload/webui/themes/default/img/add_folder.png create mode 100644 pyload/webui/themes/default/img/ajax-loader.gif create mode 100644 pyload/webui/themes/default/img/arrow_refresh.png create mode 100644 pyload/webui/themes/default/img/arrow_right.png create mode 100644 pyload/webui/themes/default/img/big_button.gif create mode 100644 pyload/webui/themes/default/img/big_button_over.gif create mode 100644 pyload/webui/themes/default/img/body.png create mode 100644 pyload/webui/themes/default/img/button.png create mode 100644 pyload/webui/themes/default/img/closebtn.gif create mode 100644 pyload/webui/themes/default/img/cog.png create mode 100644 pyload/webui/themes/default/img/control_add.png create mode 100644 pyload/webui/themes/default/img/control_add_blue.png create mode 100644 pyload/webui/themes/default/img/control_cancel.png create mode 100644 pyload/webui/themes/default/img/control_cancel_blue.png create mode 100644 pyload/webui/themes/default/img/control_pause.png create mode 100644 pyload/webui/themes/default/img/control_pause_blue.png create mode 100644 pyload/webui/themes/default/img/control_play.png create mode 100644 pyload/webui/themes/default/img/control_play_blue.png create mode 100644 pyload/webui/themes/default/img/control_stop.png create mode 100644 pyload/webui/themes/default/img/control_stop_blue.png create mode 100644 pyload/webui/themes/default/img/delete.png create mode 100644 pyload/webui/themes/default/img/drag_corner.gif create mode 100644 pyload/webui/themes/default/img/error.png create mode 100644 pyload/webui/themes/default/img/folder.png create mode 100644 pyload/webui/themes/default/img/full.png create mode 100644 pyload/webui/themes/default/img/head-login.png create mode 100644 pyload/webui/themes/default/img/head-menu-collector.png create mode 100644 pyload/webui/themes/default/img/head-menu-config.png create mode 100644 pyload/webui/themes/default/img/head-menu-development.png create mode 100644 pyload/webui/themes/default/img/head-menu-download.png create mode 100644 pyload/webui/themes/default/img/head-menu-home.png create mode 100644 pyload/webui/themes/default/img/head-menu-index.png create mode 100644 pyload/webui/themes/default/img/head-menu-news.png create mode 100644 pyload/webui/themes/default/img/head-menu-queue.png create mode 100644 pyload/webui/themes/default/img/head-menu-recent.png create mode 100644 pyload/webui/themes/default/img/head-menu-wiki.png create mode 100644 pyload/webui/themes/default/img/head-search-noshadow.png create mode 100644 pyload/webui/themes/default/img/head_bg1.png create mode 100644 pyload/webui/themes/default/img/images.png create mode 100644 pyload/webui/themes/default/img/notice.png create mode 100644 pyload/webui/themes/default/img/package_go.png create mode 100644 pyload/webui/themes/default/img/page-tools-backlinks.png create mode 100644 pyload/webui/themes/default/img/page-tools-edit.png create mode 100644 pyload/webui/themes/default/img/page-tools-revisions.png create mode 100644 pyload/webui/themes/default/img/parseUri.png create mode 100644 pyload/webui/themes/default/img/pencil.png create mode 100644 pyload/webui/themes/default/img/pyload-logo.png create mode 100644 pyload/webui/themes/default/img/reconnect.png create mode 100644 pyload/webui/themes/default/img/status_None.png create mode 100644 pyload/webui/themes/default/img/status_downloading.png create mode 100644 pyload/webui/themes/default/img/status_failed.png create mode 100644 pyload/webui/themes/default/img/status_finished.png create mode 100644 pyload/webui/themes/default/img/status_offline.png create mode 100644 pyload/webui/themes/default/img/status_proc.png create mode 100644 pyload/webui/themes/default/img/status_queue.png create mode 100644 pyload/webui/themes/default/img/status_waiting.png create mode 100644 pyload/webui/themes/default/img/success.png create mode 100644 pyload/webui/themes/default/img/tab-background.png create mode 100644 pyload/webui/themes/default/img/tabs-border-bottom.png create mode 100644 pyload/webui/themes/default/img/user-actions-logout.png create mode 100644 pyload/webui/themes/default/img/user-actions-profile.png create mode 100644 pyload/webui/themes/default/img/user-info.png create mode 100644 pyload/webui/themes/default/js/render/admin.coffee create mode 100644 pyload/webui/themes/default/js/render/admin.min.js create mode 100644 pyload/webui/themes/default/js/render/base.coffee create mode 100644 pyload/webui/themes/default/js/render/base.min.js create mode 100644 pyload/webui/themes/default/js/render/filemanager.js create mode 100644 pyload/webui/themes/default/js/render/package.js create mode 100644 pyload/webui/themes/default/js/render/settings.coffee create mode 100644 pyload/webui/themes/default/js/render/settings.min.js create mode 100644 pyload/webui/themes/default/js/static/MooDialog.js create mode 100644 pyload/webui/themes/default/js/static/MooDialog.min.js create mode 100644 pyload/webui/themes/default/js/static/MooDropMenu.js create mode 100644 pyload/webui/themes/default/js/static/MooDropMenu.min.js create mode 100644 pyload/webui/themes/default/js/static/mootools-core.js create mode 100644 pyload/webui/themes/default/js/static/mootools-core.min.js create mode 100644 pyload/webui/themes/default/js/static/mootools-more.js create mode 100644 pyload/webui/themes/default/js/static/mootools-more.min.js create mode 100644 pyload/webui/themes/default/js/static/purr.js create mode 100644 pyload/webui/themes/default/js/static/purr.min.js create mode 100644 pyload/webui/themes/default/js/static/tinytab.js create mode 100644 pyload/webui/themes/default/js/static/tinytab.min.js create mode 100644 pyload/webui/themes/default/tml/admin.html create mode 100644 pyload/webui/themes/default/tml/base.html create mode 100644 pyload/webui/themes/default/tml/captcha.html create mode 100644 pyload/webui/themes/default/tml/downloads.html create mode 100644 pyload/webui/themes/default/tml/filemanager.html create mode 100644 pyload/webui/themes/default/tml/folder.html create mode 100644 pyload/webui/themes/default/tml/home.html create mode 100644 pyload/webui/themes/default/tml/info.html create mode 100644 pyload/webui/themes/default/tml/login.html create mode 100644 pyload/webui/themes/default/tml/logout.html create mode 100644 pyload/webui/themes/default/tml/logs.html create mode 100644 pyload/webui/themes/default/tml/pathchooser.html create mode 100644 pyload/webui/themes/default/tml/queue.html create mode 100644 pyload/webui/themes/default/tml/settings.html create mode 100644 pyload/webui/themes/default/tml/settings_item.html create mode 100644 pyload/webui/themes/default/tml/window.html create mode 100644 pyload/webui/themes/flat/css/MooDialog.css create mode 100644 pyload/webui/themes/flat/css/flat.css create mode 100644 pyload/webui/themes/flat/css/log.css create mode 100644 pyload/webui/themes/flat/css/pathchooser.css create mode 100644 pyload/webui/themes/flat/css/window.css create mode 100644 pyload/webui/themes/flat/img/MooDialog/dialog-close.png create mode 100644 pyload/webui/themes/flat/img/MooDialog/dialog-error.png create mode 100644 pyload/webui/themes/flat/img/MooDialog/dialog-question.png create mode 100644 pyload/webui/themes/flat/img/MooDialog/dialog-warning.png create mode 100644 pyload/webui/themes/flat/img/arrow_refresh.png create mode 100644 pyload/webui/themes/flat/img/arrow_right.png create mode 100644 pyload/webui/themes/flat/img/button.png create mode 100644 pyload/webui/themes/flat/img/cog.png create mode 100644 pyload/webui/themes/flat/img/control_add.png create mode 100644 pyload/webui/themes/flat/img/control_add_blue.png create mode 100644 pyload/webui/themes/flat/img/control_cancel.png create mode 100644 pyload/webui/themes/flat/img/control_cancel_blue.png create mode 100644 pyload/webui/themes/flat/img/control_pause.png create mode 100644 pyload/webui/themes/flat/img/control_pause_blue.png create mode 100644 pyload/webui/themes/flat/img/control_play.png create mode 100644 pyload/webui/themes/flat/img/control_play_blue.png create mode 100644 pyload/webui/themes/flat/img/control_stop.png create mode 100644 pyload/webui/themes/flat/img/control_stop_blue.png create mode 100644 pyload/webui/themes/flat/img/default/add_folder.png create mode 100644 pyload/webui/themes/flat/img/default/ajax-loader.gif create mode 100644 pyload/webui/themes/flat/img/default/big_button.gif create mode 100644 pyload/webui/themes/flat/img/default/big_button_over.gif create mode 100644 pyload/webui/themes/flat/img/default/body.png create mode 100644 pyload/webui/themes/flat/img/default/closebtn.gif create mode 100644 pyload/webui/themes/flat/img/default/drag_corner.gif create mode 100644 pyload/webui/themes/flat/img/default/full.png create mode 100644 pyload/webui/themes/flat/img/default/head-menu-recent.png create mode 100644 pyload/webui/themes/flat/img/default/head_bg1.png create mode 100644 pyload/webui/themes/flat/img/default/images.png create mode 100644 pyload/webui/themes/flat/img/default/parseUri.png create mode 100644 pyload/webui/themes/flat/img/default/pyload-logo.png create mode 100644 pyload/webui/themes/flat/img/default/tab-background.png create mode 100644 pyload/webui/themes/flat/img/default/tabs-border-bottom.png create mode 100644 pyload/webui/themes/flat/img/delete.png create mode 100644 pyload/webui/themes/flat/img/error.png create mode 100644 pyload/webui/themes/flat/img/folder.png create mode 100644 pyload/webui/themes/flat/img/head-login.png create mode 100644 pyload/webui/themes/flat/img/head-menu-collector.png create mode 100644 pyload/webui/themes/flat/img/head-menu-config.png create mode 100644 pyload/webui/themes/flat/img/head-menu-development.png create mode 100644 pyload/webui/themes/flat/img/head-menu-download.png create mode 100644 pyload/webui/themes/flat/img/head-menu-home.png create mode 100644 pyload/webui/themes/flat/img/head-menu-index.png create mode 100644 pyload/webui/themes/flat/img/head-menu-news.png create mode 100644 pyload/webui/themes/flat/img/head-menu-queue.png create mode 100644 pyload/webui/themes/flat/img/head-menu-wiki.png create mode 100644 pyload/webui/themes/flat/img/head-search-noshadow.png create mode 100644 pyload/webui/themes/flat/img/notice.png create mode 100644 pyload/webui/themes/flat/img/package_go.png create mode 100644 pyload/webui/themes/flat/img/page-tools-backlinks.png create mode 100644 pyload/webui/themes/flat/img/page-tools-edit.png create mode 100644 pyload/webui/themes/flat/img/page-tools-revisions.png create mode 100644 pyload/webui/themes/flat/img/pencil.png create mode 100644 pyload/webui/themes/flat/img/reconnect.png create mode 100644 pyload/webui/themes/flat/img/status_None.png create mode 100644 pyload/webui/themes/flat/img/status_downloading.png create mode 100644 pyload/webui/themes/flat/img/status_failed.png create mode 100644 pyload/webui/themes/flat/img/status_finished.png create mode 100644 pyload/webui/themes/flat/img/status_offline.png create mode 100644 pyload/webui/themes/flat/img/status_proc.png create mode 100644 pyload/webui/themes/flat/img/status_queue.png create mode 100644 pyload/webui/themes/flat/img/status_waiting.png create mode 100644 pyload/webui/themes/flat/img/success.png create mode 100644 pyload/webui/themes/flat/img/user-actions-logout.png create mode 100644 pyload/webui/themes/flat/img/user-actions-profile.png create mode 100644 pyload/webui/themes/flat/img/user-info.png create mode 100644 pyload/webui/themes/flat/js/render/admin.coffee create mode 100644 pyload/webui/themes/flat/js/render/admin.min.js create mode 100644 pyload/webui/themes/flat/js/render/base.coffee create mode 100644 pyload/webui/themes/flat/js/render/base.min.js create mode 100644 pyload/webui/themes/flat/js/render/package.js create mode 100644 pyload/webui/themes/flat/js/render/settings.coffee create mode 100644 pyload/webui/themes/flat/js/render/settings.min.js create mode 100644 pyload/webui/themes/flat/js/static/MooDialog.js create mode 100644 pyload/webui/themes/flat/js/static/MooDialog.min.js create mode 100644 pyload/webui/themes/flat/js/static/MooDropMenu.js create mode 100644 pyload/webui/themes/flat/js/static/MooDropMenu.min.js create mode 100644 pyload/webui/themes/flat/js/static/mootools-core.js create mode 100644 pyload/webui/themes/flat/js/static/mootools-core.min.js create mode 100644 pyload/webui/themes/flat/js/static/mootools-more.js create mode 100644 pyload/webui/themes/flat/js/static/mootools-more.min.js create mode 100644 pyload/webui/themes/flat/js/static/purr.js create mode 100644 pyload/webui/themes/flat/js/static/purr.min.js create mode 100644 pyload/webui/themes/flat/js/static/tinytab.js create mode 100644 pyload/webui/themes/flat/js/static/tinytab.min.js create mode 100644 pyload/webui/themes/flat/tml/admin.html create mode 100644 pyload/webui/themes/flat/tml/base.html create mode 100644 pyload/webui/themes/flat/tml/captcha.html create mode 100644 pyload/webui/themes/flat/tml/downloads.html create mode 100644 pyload/webui/themes/flat/tml/folder.html create mode 100644 pyload/webui/themes/flat/tml/home.html create mode 100644 pyload/webui/themes/flat/tml/info.html create mode 100644 pyload/webui/themes/flat/tml/login.html create mode 100644 pyload/webui/themes/flat/tml/logout.html create mode 100644 pyload/webui/themes/flat/tml/logs.html create mode 100644 pyload/webui/themes/flat/tml/pathchooser.html create mode 100644 pyload/webui/themes/flat/tml/queue.html create mode 100644 pyload/webui/themes/flat/tml/settings.html create mode 100644 pyload/webui/themes/flat/tml/settings_item.html create mode 100644 pyload/webui/themes/flat/tml/window.html diff --git a/.gitignore b/.gitignore index 061269bbd..e035516d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,15 @@ # Common packaging directories -/bin/ -/build/ -/dist/ -/env/ -/lib/ -/lib64/ -/parts/ -/sdist/ -/var/ -/temp/ +bin/ +build/ +dist/ +env/ +lib/ +lib64/ +parts/ +sdist/ +var/ +temp/ +!/pyload/lib/ # Common directories .*/ @@ -27,8 +28,8 @@ userplugins/ /*.txt /*.xml /*.zip -/module/config/core.xml -/module/config/plugin.xml +/pyload/config/core.xml +/pyload/config/plugin.xml # Common MacOS & Windows files *.DS_Store @@ -78,7 +79,7 @@ eggs *.project *.pydevproject *.rej -/docs/_build/ -/pyload/ +_build/ +/module/ DLC_*.py paver-minilib.zip diff --git a/docs/access_api.rst b/docs/access_api.rst index ce78364b9..d83698aa3 100644 --- a/docs/access_api.rst +++ b/docs/access_api.rst @@ -13,12 +13,12 @@ First of all, you need to know what you can do with our API. It lets you do all retrieving download status, manage queue, manage accounts, modify config and so on. This document is not intended to explain every function in detail, for a complete listing -see :class:`Api `. +see :class:`Api `. Of course its possible to access the ``core.api`` attribute in plugins and hooks, but much more interesting is the possibillity to call function from different programs written in many different languages. -pyLoad uses thrift as backend and provides its :class:`Api ` as service. +pyLoad uses thrift as backend and provides its :class:`Api ` as service. More information about thrift can be found here http://wiki.apache.org/thrift/. @@ -26,7 +26,7 @@ Using Thrift ------------ Every thrift service has to define all data structures and declare every method which should be usable via rpc. -This file is located :file:`module/remote/thriftbackend/pyload.thrift`, its very helpful to inform about +This file is located :file:`pyload/remote/thriftbackend/pyload.thrift`, its very helpful to inform about arguments and detailed structure of return types. However it does not contain any information about what the functions does. Assuming you want to use the API in any other language than python than check if it is @@ -48,7 +48,7 @@ In case you want to use python, pyload has already all files included to access A basic script that prints out some information: :: - from module.remote.thriftbackend.ThriftClient import ThriftClient, WrongLogin + from pyload.remote.thriftbackend.ThriftClient import ThriftClient, WrongLogin try: client = ThriftClient(host="127.0.0.1", port=7227, user="User", password="yourpw") @@ -92,14 +92,14 @@ so pyLoad can authenticate you. Calling Methods =============== -In general you can use any method listed at the :class:`Api ` documentation, which is also available to +In general you can use any method listed at the :class:`Api ` documentation, which is also available to the thriftbackend. Access works simply via ``http://pyload-core/api/methodName``, where ``pyload-core`` is the ip address or hostname including the webinterface port. By default on local access this would be `localhost:8000`. The return value will be formatted in JSON, complex data types as dictionaries. -As mentionted above for a documentation about the return types look at the thrift specification file :file:`module/remote/thriftbackend/pyload.thrift`. +As mentionted above for a documentation about the return types look at the thrift specification file :file:`pyload/remote/thriftbackend/pyload.thrift`. ================== Passing parameters @@ -107,7 +107,7 @@ Passing parameters To pass arguments you have two choices. Either use positional arguments, eg ``http://pyload-core/api/getFileData/1``, where 1 is the FileID, or use keyword arguments -supplied via GET or POST ``http://pyload-core/api/getFileData?fid=1``. You can find the argument names in the :class:`Api ` +supplied via GET or POST ``http://pyload-core/api/getFileData?fid=1``. You can find the argument names in the :class:`Api ` documentation. It is important that *all* arguments are in JSON format. So ``http://pyload-core/api/getFileData/1`` is valid because diff --git a/docs/conf.py b/docs/conf.py index b5976d2fc..62ad33bb7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,7 +16,7 @@ from os.path import dirname, join, abspath dir_name = join(dirname(abspath(""))) sys.path.append(dir_name) -sys.path.append(join(dir_name, "module", "lib")) +sys.path.append(join(dir_name, "pyload", "lib")) # If extensions (or modules to document with autodoc) are in another directory, @@ -128,7 +128,7 @@ html_theme = 'default' # The name of an image file (relative to this directory) to place at the top # of the sidebar. -html_logo = join(dir_name, "module", "web", "media", "default", "img", "pyload-logo-edited3.5-new-font-small.png") +html_logo = join(dir_name, "pyload", "web", "media", "default", "img", "pyload-logo-edited3.5-new-font-small.png") # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 diff --git a/docs/docs.conf b/docs/docs.conf index 0f30ab89e..fd2987784 100644 --- a/docs/docs.conf +++ b/docs/docs.conf @@ -3,12 +3,12 @@ [epydoc] -modules: pyload.py, pyload-cli.py, module +modules: pyload.py, pyload-cli.py, pyload output: html target: docs docformat: restructuredtext -exclude: module\.lib|module\.remote\.thriftbackend\.thriftgen|\.pyc|\.pyo|module\.plugins\.(accounts|container|crypter|hooks|hoster|internal|ocr) +exclude: pyload\.lib|pyload\.remote\.thriftbackend\.thriftgen|\.pyc|\.pyo|pyload\.plugins\.(accounts|container|crypter|hooks|hoster|internal|ocr) name: pyLoad Documentation url: http://docs.pyload.org diff --git a/docs/index.rst b/docs/index.rst index 757fd7537..ff40ff3cb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -20,7 +20,7 @@ Contents: extend_pyload.rst module_overview.rst -.. currentmodule:: module +.. currentmodule:: pyload ================== diff --git a/docs/module_overview.rst b/docs/module_overview.rst index d51202c88..8cea3874b 100644 --- a/docs/module_overview.rst +++ b/docs/module_overview.rst @@ -4,14 +4,14 @@ Module Overview You can find an overview of some important classes here: .. autosummary:: - :toctree: module + :toctree: pyload - module.Api.Api - module.plugins.Plugin.Base - module.plugins.Plugin.Plugin - module.plugins.Crypter.Crypter - module.plugins.Account.Account - module.plugins.Hook.Hook - module.HookManager.HookManager - module.PyFile.PyFile - module.PyPackage.PyPackage + pyload.Api.Api + pyload.plugins.Plugin.Base + pyload.plugins.Plugin.Plugin + pyload.plugins.Crypter.Crypter + pyload.plugins.Account.Account + pyload.plugins.Hook.Hook + pyload.HookManager.HookManager + pyload.PyFile.PyFile + pyload.PyPackage.PyPackage diff --git a/docs/write_hooks.rst b/docs/write_hooks.rst index a088a3ed3..5508f5a0c 100644 --- a/docs/write_hooks.rst +++ b/docs/write_hooks.rst @@ -3,20 +3,20 @@ Hooks ===== -A Hook is a python file which is located at :file:`module/plugins/hooks`. -The :class:`HookManager ` will load it automatically on startup. Only one instance exists -over the complete lifetime of pyload. Your hook can interact on various events called by the :class:`HookManager `, -do something complete autonomic and has full access to the :class:`Api ` and every detail of pyLoad. +A Hook is a python file which is located at :file:`pyload/plugins/hooks`. +The :class:`HookManager ` will load it automatically on startup. Only one instance exists +over the complete lifetime of pyload. Your hook can interact on various events called by the :class:`HookManager `, +do something complete autonomic and has full access to the :class:`Api ` and every detail of pyLoad. The UpdateManager, CaptchaTrader, UnRar and many more are realised as hooks. Hook header ----------- -Your hook needs to subclass :class:`Hook ` and will inherit all of its method, make sure to check its documentation! +Your hook needs to subclass :class:`Hook ` and will inherit all of its method, make sure to check its documentation! All Hooks should start with something like this: :: - from module.plugins.Hook import Hook + from pyload.plugins.Hook import Hook class YourHook(Hook): __name__ = "YourHook" @@ -42,16 +42,16 @@ Interacting on Events The next step is to think about where your Hook action takes places. -The easiest way is to overwrite specific methods defined by the :class:`Hook ` base class. +The easiest way is to overwrite specific methods defined by the :class:`Hook ` base class. The name is indicating when the function gets called. -See :class:`Hook ` page for a complete listing. +See :class:`Hook ` page for a complete listing. -You should be aware of the arguments the Hooks are called with, whether its a :class:`PyFile ` -or :class:`PyPackage ` you should read its related documentation to know how to access her great power and manipulate them. +You should be aware of the arguments the Hooks are called with, whether its a :class:`PyFile ` +or :class:`PyPackage ` you should read its related documentation to know how to access her great power and manipulate them. A basic excerpt would look like: :: - from module.plugins.Hook import Hook + from pyload.plugins.Hook import Hook class YourHook(Hook): """ @@ -66,12 +66,12 @@ A basic excerpt would look like: :: Another and more flexible and powerful way is to use event listener. All hook methods exists as event and very useful additional events are dispatched by the core. For a little overview look -at :class:`HookManager `. Keep in mind that you can define own events and other people may listen on them. +at :class:`HookManager `. Keep in mind that you can define own events and other people may listen on them. For your convenience it's possible to register listeners automatical via the ``event_map`` attribute. It requires a `dict` that maps event names to function names or a `list` of function names. It's important that all names are strings :: - from module.plugins.Hook import Hook + from pyload.plugins.Hook import Hook class YourHook(Hook): """ @@ -92,7 +92,7 @@ It requires a `dict` that maps event names to function names or a `list` of func An advantage of the event listener is that you are able to register and remove the listeners at runtime. Use `self.manager.addEvent("name", function)`, `self.manager.removeEvent("name", function)` and see doc for -:class:`HookManager `. Contrary to ``event_map``, ``function`` has to be a reference +:class:`HookManager `. Contrary to ``event_map``, ``function`` has to be a reference and **not** a `string`. We introduced events because it scales better if there a a huge amount of events and hooks. So all future interaction will be exclusive @@ -102,12 +102,12 @@ available as event and not accessible through overwriting hook methods. However Providing RPC services ---------------------- -You may noticed that pyLoad has an :class:`Api `, which can be used internal or called by clients via RPC. +You may noticed that pyLoad has an :class:`Api `, which can be used internal or called by clients via RPC. So probably clients want to be able to interact with your hook to request it's state or invoke some action. Sounds complicated but is very easy to do. Just use the ``Expose`` decorator: :: - from module.plugins.Hook import Hook, Expose + from pyload.plugins.Hook import Hook, Expose class YourHook(Hook): """ @@ -118,7 +118,7 @@ Sounds complicated but is very easy to do. Just use the ``Expose`` decorator: :: def invoke(self, arg): print "Invoked with", arg -Thats all, it's available via the :class:`Api ` now. If you want to use it read :ref:`access_api`. +Thats all, it's available via the :class:`Api ` now. If you want to use it read :ref:`access_api`. Here is a basic example: :: #Assuming client is a ThriftClient or Api object @@ -128,11 +128,11 @@ Here is a basic example: :: Providing status information ---------------------------- -Your hook can store information in a ``dict`` that can easily be retrievied via the :class:`Api `. +Your hook can store information in a ``dict`` that can easily be retrievied via the :class:`Api `. Just store everything in ``self.info``. :: - from module.plugins.Hook import Hook + from pyload.plugins.Hook import Hook class YourHook(Hook): """ @@ -155,4 +155,4 @@ Example ------- Sorry but you won't find an example here ;-) - Look at :file:`module/plugins/hooks` and you will find plenty examples there. + Look at :file:`pyload/plugins/hooks` and you will find plenty examples there. diff --git a/docs/write_plugins.rst b/docs/write_plugins.rst index ff3be66d0..c2b25a934 100644 --- a/docs/write_plugins.rst +++ b/docs/write_plugins.rst @@ -3,11 +3,11 @@ Plugins ======= -A Plugin is a python file located at one of the subfolders in :file:`module/plugins/`. Either :file:`hoster`, :file:`crypter` +A Plugin is a python file located at one of the subfolders in :file:`pyload/plugins/`. Either :file:`hoster`, :file:`crypter` or :file:`container`, depending of it's type. There are three kinds of different plugins: **Hoster**, **Crypter**, **Container**. -All kind of plugins inherit from the base :class:`Plugin `. You should know its +All kind of plugins inherit from the base :class:`Plugin `. You should know its convenient methods, they make your work easier ;-) Every plugin defines a ``__pattern__`` and when the user adds urls, every url is matched against the pattern defined in @@ -19,7 +19,7 @@ Plugin header How basic hoster plugin header could look like: :: - from module.plugin.Hoster import Hoster + from pyload.plugin.Hoster import Hoster class MyFileHoster(Hoster): __name__ = "MyFileHoster" @@ -41,7 +41,7 @@ We head to the next important section, the ``process`` method of your plugin. In fact the ``process`` method is the only functionality your plugin has to provide, but its always a good idea to split up tasks to not produce spaghetti code. An example ``process`` function could look like this :: - from module.plugin.Hoster import Hoster + from pyload.plugin.Hoster import Hoster class MyFileHoster(Hoster): """ @@ -58,7 +58,7 @@ An example ``process`` function could look like this :: # download the file, destination is determined by pyLoad self.download(parsed_url) -You need to know about the :class:`PyFile ` class, since an instance of it is given as parameter to every pyfile. +You need to know about the :class:`PyFile ` class, since an instance of it is given as parameter to every pyfile. Some tasks your plugin should handle: proof if file is online, get filename, wait if needed, download the file, etc.. Wait times @@ -71,7 +71,7 @@ Captcha decrypting __________________ To handle captcha input just use ``self.decryptCaptcha(url, ...)``, it will be send to clients -or handled by :class:`Hook ` plugins +or handled by :class:`Hook ` plugins Crypter ------- @@ -81,7 +81,7 @@ Well, they work nearly the same, only that the function they have to provide is Example: :: - from module.plugin.Crypter import Crypter + from pyload.plugin.Crypter import Crypter class MyFileCrypter(Crypter): """ @@ -93,11 +93,11 @@ Example: :: self.packages.append(("pyLoad packages", urls, "pyLoad packages")) # urls list of urls -They can access all the methods from :class:`Plugin `, but the important thing is they +They can access all the methods from :class:`Plugin `, but the important thing is they have to append all packages they parsed to the `self.packages` list. Simply append tuples with `(name, urls, folder)`, where urls is the list of urls contained in the packages. Thats all of your work, pyLoad will know what to do with them. Examples -------- -Best examples are already existing plugins in :file:`module/plugins/`. +Best examples are already existing plugins in :file:`pyload/plugins/`. diff --git a/locale/af/LC_MESSAGES/django.po b/locale/af/LC_MESSAGES/django.po index f847c8fcf..e6f126a57 100644 --- a/locale/af/LC_MESSAGES/django.po +++ b/locale/af/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/af/LC_MESSAGES/pyLoad.po b/locale/af/LC_MESSAGES/pyLoad.po index ae1eec95b..d29dad5d0 100644 --- a/locale/af/LC_MESSAGES/pyLoad.po +++ b/locale/af/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/af/LC_MESSAGES/pyLoadCli.po b/locale/af/LC_MESSAGES/pyLoadCli.po index 1b0d1172a..6760512f1 100644 --- a/locale/af/LC_MESSAGES/pyLoadCli.po +++ b/locale/af/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/af/LC_MESSAGES/setup.po b/locale/af/LC_MESSAGES/setup.po index 8aae41ce1..a66cfd176 100644 --- a/locale/af/LC_MESSAGES/setup.po +++ b/locale/af/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index 6e67693ed..875577bad 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "طُلِبت كابتشا جديدة" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "فضلاً اقرأ النصّ الموجود في الكابتشا." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "أعيد تشغيل pyLoad" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "ايقاف" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "نجح" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "تشغيل" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "أمتأكد من أنك تريد الخروج من pyLoad ؟" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "أعد بدء الرابط" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "احذف الرابط" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "أدخل اسماً للحزمة." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "فضلاً اضغط على الموقع الصحيح للكابتشا." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "حدث خطأ." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "المجلد فارغ" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "فشل" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "لا تتوفر كابتشا لأقرأها." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "لم تتطابق كلمتا المرور." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "حُفِظَت الإعدادات" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "مجلد جديد" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "أمتأكد من أنك تريد إعادة تشغيل pyLoad؟" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "انتظار %" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "التنزيلات النشطة" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "المنزل" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "قائمة الإنتظار" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "جامع الروابط" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "التنزيلات" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "السجلات" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "الضبط" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "اسم" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "الحالة" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "معلومات" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "الحجم" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "التقدم" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "تسجيل الدخول" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "اسم المستخدم" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "كلمة المرور" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "لم يتطابق اسم المستخدم وكلمة المرور الّذان أدخلتهما. رجاءً حاول مجدّداً." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "لإعادة ضبط بيانات الولوج أو إضافة مستخدم نفّذ:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "تمّ الحذف" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "فشلت إعادة التشغيل" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "المجلد:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "كلمة السر:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "حرّر الحزمة" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "حرّر تفاصيل الحزمة أدناه." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "اسم الحزمة." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "مجلد" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "اسم المجلّد الفرعيّ لهذه التنزيلات." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "قائمة كلمات السر المستخدمة لفكّ ضغط rar" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "اقترح" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "امحُ" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "لقد خرجت بنجاح." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "المسار" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "مُطلَق" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "نسبي" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "الاسم" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "الحجم" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "النوع" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "آخر تغيير" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "المجلد الأب" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "لا محتوى" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "عام" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "الملحقات" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "الحسابات" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "اختر قِسماً من القائمة" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "الاضافات" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "صالحة حتى" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "الوقت" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "أقصى عدد للتنزيلات المتزامنة" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "حذف؟" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "صالحة" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "غير صالح" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "نعم" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "لا" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "إضافة" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "إضافة حساب" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "أضف معلومات حسابك لتستخدم مزايا الحساب المتقدّم" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "اسم حسابك." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "كلمة السرّ لهذا الحساب." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "نوع" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "اختر المضيف لحسابك." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "ابدأ" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "السابق" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "التالي" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "انتهى" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "أخبار" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "الدعم" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "النظام" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "بايثون:" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "نظام التشغيل:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "إصدار pyLoad:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "مجلد التثبيت:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "مجلد الإعدادات:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "مجلد التنزيلات:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "المساحة الحرّة:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "اللُّغة:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "منفذ واجهة الشنكبوتية:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "منفذ الواجهة البعيدة:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "برنامج الإعداد" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "مدير الملفات" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "أضف حزمة" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "الصق رابطأ أو ارفع حاوياً. " -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "اسم الحزمة الجديدة." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "روابط" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "الصق الروابط أو أيّ نصّ هنا ثم اضغط زرّ استخراج الروابط." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "رشّح الروابط" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "كلمة سر أرشيفات RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "ملف" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "ارفع حاوياً." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "الوجهة" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "النص" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "إغلاق" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "واجهة الشنكبوتية" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "يتوفّر تحديث للبرنامج!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "تمّ تحديث الإضافة، يرجى إعادة تشغيل البرنامج!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "كابتشا تنتظر" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "اخرج" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "أدِر" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "المعلومات" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "يرجى الولوج!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "توقّف" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "الغاء" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "التنزيل:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "إعادة الاتصال:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "السرعة:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "النشط:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "أعد تحميل الصفحة" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "يحمّل" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "العودة لأعلى" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "اخرج من pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "أعد تشغيل pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "لإضافة مستخدم أو تغيير كلمات مرور استخدم:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "هامّ: حساب المدير Admin له دائماً الصلاحيات الكاملة!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "غيّر كلمة السرّ" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "المشرف" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "الأذون" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "غيّر" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "أدخل كلمة السرّ الحاليّة والجديدة." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "المستخدم" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "كلمة السرّ الحالية" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "كلمة سرّ جديدة" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "كلمة السرّ الجديدة." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "كلمة السرّ الجديدة (إعادة)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "فضلاً أعد إدخال كلمة السرّ." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "لا يوجد لديك صلاحيات للوصول لهذه الصفحه" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "مجلد التحميلات غير موجود" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "غير محدود" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "غير متوفر" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "قم بتشغيل pyload.py -s لتبداء التثبيت" diff --git a/locale/ar/LC_MESSAGES/pyLoad.po b/locale/ar/LC_MESSAGES/pyLoad.po index 7acb978f5..2f37f4a1b 100644 --- a/locale/ar/LC_MESSAGES/pyLoad.po +++ b/locale/ar/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "تم استقبال اشارة انهاء" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "باي لود يعمل حاليا بمعرف العملية %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "فشل في تغيير المجموعه: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "فشل في تغيير المستخدم: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "مجلد للتقارير" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "بدء" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "استخدام مجلد المنزل: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "مجلد للملفات المؤقتة" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "مجلد للتحميلات" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL لاتصال امن" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "نقل اعدادت المستخدم القديم الى قاعدة البيانات" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "يرجى التاكد من بيانات الدخول بستخدام ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "تم مسح جميع الروابط" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "وقت التحميل: %" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "المساحه الحره: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "تفعيل الحسابات..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "تفعيل الاضافات..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "باي ولد محدث و يعمل" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "اعادة تشغيل باي لود" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "اغلاق باي لود" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "التثبيت %" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "لا يمكن ايجاد %(وصف): %(اسم)" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "لا يمكن انشاء %(وصف): %(اسم)" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "جاري ايقاف التشغيل..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "خطاء اثناء ايقاف التشغيل " -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "انهاء باي لود من الطرفيه" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "تم الانتهاء" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "غير متصل" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "متصل" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "في قائمة الانتظار" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "تخطي" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "انتظار" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "مؤقت. غير متصل" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "البدء" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "فشل" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "الغاء" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "فك تشفير" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "مخصص" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "جاري التنزيل" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "تجهيز" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "غير معروف" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "انتهت الحزمه: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "خطاء في الواجهة الخلفيه للبرنامج " -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "بدء %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "فشل في تحميل الواجهه الخلفيه للبرنامج %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "انتظار %" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "شهادة SSL غير موجوده." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "نأسف, لقد اوقفنا الدعم للبدئ % مباشره من باي لود " -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "عينات الاعدادات موجودة في المجلد module/webui/servers " +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "عينات الاعدادات موجودة في المجلد pyload/webui/servers " -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "لايمكن استخدام %(خادم), لم يتم تثبيت python-flup!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "تحتاج لتحميل و تثبيت bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "انسخ boern.so الى module/lib او استخدم setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "انسخ boern.so الى pyload/lib او استخدم setup.py install" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "بالطبع يجب ان تكون معتاد على لنكس وتعرف كيف تثبت البرامج" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "هذا المخدم لا يقدم خدمة SSL، يرجى النظر في استخدام بديلاً من ذلك" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "لا يوجد لديك صلاحيات للوصول لهذه الصفحه" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "مجلد التحميلات غير موجود" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "غير محدود" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "غير متوفر" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "قم بتشغيل pyload.py -s لتبداء التثبيت" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "فشل التنزيل على اجزاء, العودة الى التنزيل على اتصال واحد | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "بدء التنزيل: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "تم الانتهاء من التنزيل: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "الاضافة %s تفتقد الى وظيفة." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "تم الغاء التنزيل: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "تم اعادة تشغيل التنزيل: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "التنزيل غير متصل: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "التنزيل غير متصل مؤقتا: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "فشل التنزيل: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "لايمكن الوصول الى الخادم او اعادة الاتصال, الانتظار 1 دقيقة و اعادة المحاولة." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "تم تخطي التنزيل: %(name)s بسبب %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "فشل جلب المعلومات ل %(name)s | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "فشل التفعيل %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "الاضافات المفعلة: %" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "الاضافات المعطلة: %" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "فشل في اعادة الاتصال: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "البرنامج النصي لاعادة الاتصال غير متوفر!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "بدء اعادة الاتصال" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "فشل في تنفيذ البرنامج النصي لاعادة الاتصال!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "تمت اعادة الاتصال, IP جديد: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "لم يتبقى مساحة كافية على الجهاز" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "لا يمكن تسجيل الدخول بهذا الحساب %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "كلمة مرور خاطئة" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "الحساب %s ليس فية كمية بيانات كافية, اعد التحقق خلال 30 دقيقة" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "انتهت مدة الحساب %s, تحقق مرة اخرى في 1 ساعة" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "لقد وصلت الى الحد الاقصى للتنزيل" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "خطأ في استيراد %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "لا مستضيف محمل" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "قم بتفعيل التحميل المباشر في حساب Bitshare لديك" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "مطلوب تصريح (اسم مستخدم: كلمة مرور)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "الرجاء إدخال حسابك في %s أو إلغاء تنشيط هذة الاضافة" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "هناك رمز HTML في الملفات اللتي تم تنزيلها (%s)...خطاء اعادة توجية؟سوف يتم اعادة تشغيل التنزيل." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "الملف غير متوفر مؤقتا" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "ضغط الشبكة: الانتظار بين التنزيلات %d." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "ضغط الشبكة: الانتظار من اجل كلمة التحقق%d." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "الملف اللذي تم تنزيلة فارغ" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "مفتاح واحهة برمجة التطبيقات غير صالح" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: لم يتبقى لديك بيانات كافية" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "تم تجاوز البيانات المتوفرة" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: بيانات المشاركة (تحميل مباشر)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "جاري التحميل من عنوان الانترنت هذا, انتظر ل 60 ثانية" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "رمز تاكيد غير صالح, سوف يتم اعادة التنزيل" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: لا يوجد مساحات فارغة" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "تحناج لحساب مدفوع من اجل هذا الملف" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "تم الابلاغ عن اسم الملف غير صالح" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "خطاء تنزيلات متوازية, الان انتظر 60 ثانية." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "لم يتم تسجيل الدخول." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "فشل في فك التشفير" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "لا يوجد مفتاح ملف مقدم في عنوان الانترنت" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "رمز خطاء:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** تم تحديث الاضافات, يرجى اعادة تشغيل باي لود ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "تم تحديث الاضافات و اعادة تشغيلها" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "لا يوجد تحديثات للاضافات" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "لايوجد تحديثات ل باي لود" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** نسخه جديده %s من باي لود متوفره ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** احصل عليها من هنا: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "غير قادر على الاتصال بالخادم من اجل التحديث" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "نسخه جديدة من %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "حصل خطاء عند التحديث %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "نسخة غير متطابقة" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "انتهى التنزيل: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "طلب كلمة تحقق جديد: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "اجب ب 'c %s نص على كلمة التحقق'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "اضافه %s من HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "لا %s مثبت" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "لا يمكن تفعيل %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "تم التفعيل" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "لا اضافات استخراج مفعلة" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "الحزمه %s في قائمة الانتظار للاستخراج لاحقا" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "تفحص الحزم %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "استخراج الى %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "لم يتم العثور على ملفات للاستخراج" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "فك الظغط" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "محمي بكلمة مرور" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "كلمة مرور خاطئة" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "حذف %s الملفات" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "تم الانتهاء من الاستخراج" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "خطأ في الأرشيف" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC غير متطابق" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "خطاء غير معروف" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "فشل في تحديد المستخدم و المجموعة" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "ضغط و تحميل: منفذ 9666 قيد الاستخدام" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%sرصيد متبقي" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "لايمكن ارسال رد." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "حسابك في CaptchaTrader لا يحتوي رصيد كافي" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "لم يتم العثور على قائمة Crypter" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "قائمة Crypter فارغة" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "انتهى التحميل: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "هوية تحقق جديدة من upload: %s :%s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "حسابك للتحقق 9kw.eu لا يحتوي على رصيد كافي" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "سكربت مثبت ل %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "سكربت غير قابل للتنفيذ:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "خطاء في %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "لم يتبقى لديك رصيد كافي في حساب ExpertDecoders لديك" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "يرجى اضافة حساب rehost.to اولا ثم اعاده تشغيل باي لود" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d رصيد متبقي" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "pil و tesseract غير مثبت ولايوجد عميل متصل لفك كلمة التحقق" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "فشل في اعداد المستخدم و المجموعه: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "لايوجد عميل متصل لفك تشفير الكاباتشا" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "حزم مضافه %(اسم) تحتوي %(عدد) روابط" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "مضافه %(عدد) روابط الى الحزمه #%(حزم)" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "لم يتم العثور على محرك js, يرجى تثبيت Spidermonkey, ossp-js, pyv8 او rhino" diff --git a/locale/ar/LC_MESSAGES/pyLoadCli.po b/locale/ar/LC_MESSAGES/pyLoadCli.po index 68d792617..fabbb0d85 100644 --- a/locale/ar/LC_MESSAGES/pyLoadCli.po +++ b/locale/ar/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " واجهة سطر الأوامر" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s التنزيلات:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " السرعة: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " الحجم: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " الانتهاء في: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " معرف: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "في انتظار: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "الحالة:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "تم إيقاف مؤقتاً" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "تشغيل" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "السرعة الإجمالية" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "الملفات الموجودة في قائمة الانتظار" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "المجموع" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "القائمة:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " اضافة روابط" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " إدارة قائمة الانتظار" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " إدارة جامع الروابط" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " (عدم) ايقاف مؤقت للخادم" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " قتل الخادم" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " إنهاء" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "الرجاء استخدام بناء الجملة التالي: إضافة ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "التحقق %d من الروابط:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "الملف غير موجود." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "تم انهاء باي لود" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "اطبع حالة الخادم" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "اكتب التنزيلات اللتي في قائمة الانتظار" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "اكتب التنزيلات اللتي في جامع الروابط" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "اضافة حزمة الى قائمة الانتظار" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "اضافة حزمة إلى جامع الروابط" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "حذف الملفات من قائمة الانتظار/جامع الروابط" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "حذف حزم من قائمة الانتظار/جامع الروابط" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "نقل الحزم من قائمة الانتظار إلى جامع الروابط أو العكس بالعكس" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "إعادة تشغيل الملفات" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "إعادة تشغيل الحزم" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "تحقق من حالة الاتصال، يعمل مع المحتوى المحلي" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "التحقق من حالة الاتصال من الملف المحتوى" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "إيقاف الخادم مؤقتا" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "متابعة التنزيلات" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "تبديل إيقاف/عدم ايقاف الإيقاف المؤقت" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "قتل الخادم" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "قائمة الأوامر:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "لا يمكن كتابة ملف اعدادات المستخدم" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "العنوان: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "المنفذ: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "اسم المستخدم: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "كلمة المرور: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "بيانات تسجيل الدخول خاطئة." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "لا يمكن انشاء اتصال %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "أنت بحاجة إلى py-openssl للاتصال بهذا الاساس من باي لود." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "الوضع التبادلي تم تجاهله حيث انك مررت بعض الاوامر." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "إضافة حزمة:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "أدخل اسماً للحزمة الجديدة" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "الحزمة: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "تحليل الروابط التي تريد إضافتها." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "اكتب %s عند الانتهاء." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "تم اضافة الروابط: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " العودة إلى القائمة الرئيسية" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "إدارة الحزم:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "إدارة الروابط:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "ما اللذي تريد نقلة ؟" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "ما اللذي تريد حذفة ؟" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "ما اللذي تريد اعادة تشغيلة ؟" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "حذف" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "نقل" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "إعادة تشغيل" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " -السابقة" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " -التالي" diff --git a/locale/ar/LC_MESSAGES/setup.po b/locale/ar/LC_MESSAGES/setup.po index b9b466981..00bfae831 100644 --- a/locale/ar/LC_MESSAGES/setup.po +++ b/locale/ar/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "مرحبا بكم في مساعد اعداد باي لود ." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "سوف يتم فحص نظامك وعمل تثبيت اولي من اجل تشغيل باي لود." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "القيمة الموجودة في الأقواس [] هي دائماً القيمة الافتراضية،" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "في حال كنت لا ترغب في تغييرها أو كنت غير متأكد من ما تختار، فقط اضغط أدخال." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "لا تنسى: يمكنك دائماً إعادة تشغيل هذا المساعد بستخدام--setup أو-s المعلمة، عند بدء تشغيل pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "للانهاء، وعدم السماح له البدئ مع pyload.py تلقائياً بعد الآن." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "عندما تكون على استعداد للتحقق من النظام، اضغط مفتاح الادخال." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "واجهة الشنكبوتية" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "الاستمرار في التنصيب؟" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "هل تريد تغير مكان الاعدادات؟ الحالي هو %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "تغيير مسار الاعداد؟" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "هل تريد اعداد الاعدادات الأساسية وبيانات الدخول؟" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "هذا مستحسن من اجل التشغيلة الاولى." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "صنع الاعدادات الاساسية؟" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "هل تريد اعداد ssl؟" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "اعداد ssl؟" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "هل تريد اعداد واحهة الويب؟" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "اعداد واجهة الويب؟" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "تم انهاء التثبيت بنجاح." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "اضغظ مفتاح الادخال للانهاء و اعادة تشغيل باي لود" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "# # الإعداد الأساسي # #" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "بيانات تسجيل الدخول التالية صالحة لواجهة سطر الاوامر, واجهة المستخدم و واجهة الويب." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "اسم المستخدم" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "اللغة" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "العدد الاقصى التنزيلات المتوازيية (التنزيلات في نفس الوقت)" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "استخدام إعادة الاتصال؟" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "موقع البرنامج النصي لاعادة الاتصال" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "# # اعداد واجهة الويب # #" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "تنشيط واجهة الويب؟" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "عنوان الواجهة, اذا قمت بستخدام 127.0.0.1 او localhost, واجهة الويب سوف تكون قابلة للوصول محليا فقط." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "عنوان" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "المنفذ" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "يقدم باي لود خوادم متعددة للواجهة الخلفية، الآن بعد شرحاً موجزاً." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "يمكن استخدامها بواسطة أباتشي، lighttpd، يتطلب منك اعدادهم, وهي ليست مهمة سهلة جداً." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "يمكنك الحصول علية من هنا : https://github.com/jonashaag/bjoern, قم بتجميعة برمجيا" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "انتباه: في بعض الحالات النادرة الخادم المدمج لا يعمل، إذا لاحظت وجود مشاكل مع واجهة الويب" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "عد إلى هنا وقم بتغير الخادم مدمج لذالك المذكور هنا." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "خادم" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "# # إعداد SSL # #" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "تنفيذ هذه الأوامر من مجلد اعداد باي لود لانتاج شهادات ssl:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "اذا انتهيت وكل شيء جرى بشكل صحيح, تستطيع تفعيل ssl الان." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "تفعيل SSL؟" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "حدد الإجراء" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1-إنشاء/تحرير المستخدم" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2-قائمة المستخدمين" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3-إزالة المستخدم" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4-إنهاء" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "المستخدمين" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "اضغط Enter للإنهاء." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "فشل الإعداد مسار التكوين: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "كلمة المرور: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "كلمة المرور قصيرة جداً. استخدام 4 رموز على الاقل." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "كلمة المرور (مرة أخرى): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "لم تتطابق كلمتا المرور." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "نعم" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "صحيح" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "لا" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "خاطئة" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "الإدخال غير صالح" diff --git a/locale/bn/LC_MESSAGES/django.po b/locale/bn/LC_MESSAGES/django.po index 9f320829d..759264ae6 100644 --- a/locale/bn/LC_MESSAGES/django.po +++ b/locale/bn/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/bn/LC_MESSAGES/pyLoad.po b/locale/bn/LC_MESSAGES/pyLoad.po index 002e93ad1..99e491023 100644 --- a/locale/bn/LC_MESSAGES/pyLoad.po +++ b/locale/bn/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/bn/LC_MESSAGES/pyLoadCli.po b/locale/bn/LC_MESSAGES/pyLoadCli.po index 945fc0276..dc7a6deaf 100644 --- a/locale/bn/LC_MESSAGES/pyLoadCli.po +++ b/locale/bn/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/bn/LC_MESSAGES/setup.po b/locale/bn/LC_MESSAGES/setup.po index da42f421a..cc40924e3 100644 --- a/locale/bn/LC_MESSAGES/setup.po +++ b/locale/bn/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/ca/LC_MESSAGES/django.po b/locale/ca/LC_MESSAGES/django.po index 2306240f8..e91b2fe3f 100644 --- a/locale/ca/LC_MESSAGES/django.po +++ b/locale/ca/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Sol·licitud d'un nou Captcha" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Si us plau introdueixi el text que apareix al captcha." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad ha estat reiniciat" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "apagat" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Èxit" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "encès" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Estas segur que vols sortir del pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Reiniciar Enllaç" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Elimina enllaç" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Introdueixi el nom del paquet." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Clica a la posició correcta del captcha." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "S'ha produït un error." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "El directori és buit" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Ha fallat" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "No hi ha captchas per llegir." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Les contrasenyes no coincideixen." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Paràmetres desats." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Nou directori" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Estas segur que vols reiniciar pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "esperant %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Descàrregues actives" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Inici" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Descàrregues" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Registres" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Configuració" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Nom" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Estat" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Informació" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Mida" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Progrés" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Inici de sessió" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Nom d'usuari" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Contrasenya" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "El teu usuari d'usuari i contrasenya no concorden. Torna-ho a provar." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Per reiniciar les teves dades de login o afegir usuari executa:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Eliminar acabat" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Reiniciar fallit" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Carpeta:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Contrasenya:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Editar paquet" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Editar detalls del paquet següent." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Nom del paquet." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Carpeta" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Nom de la subcarpeta per aquestes descàrregues." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Llista de contrasenyes emprades per l'unrar." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Enviar" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Reiniciar" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Has tancat la sessió correctament." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Ruta" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absolut" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relatiu" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "nom" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "mida" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "tipus" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "última modificació" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "directori pare" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "sense contingut" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "General" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Comptes" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Tria una secció del menú" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Connector" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Vàlid fins" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Tràfic restant" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Temps" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Max Paral·lel" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Eliminar?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "vàlid" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "invàlid" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "sí" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Afegir" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Afegir compte" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Introdueix les dades del teu compte per emprar les característiques premium." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "El seu nom d'usuari." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "La contrasenya és per aquest compte." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Tipus" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Tria proveïdor del teu compte." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Començar" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "anterior" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "següent" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Fi" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Notícies" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Suport" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Sistema" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "S.O.:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "versió del pyLoad:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Carpeta de instal·lació:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Carpeta de configuració:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Carpeta de descàrregues:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Espai lliure:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Idioma:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Port de la interfície Web:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Port de la interfície remota:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Configuració" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Gestor de Fitxers" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Afegir paquet" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Aferra els teus enllaços o puja un fitxer contenidor." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Nom del nou paquet." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Enllaços" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Aferra els teus enllaços aquó o qualsevol text i pitja el botó de filtrat." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtra urls" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Contrasenya per l'arxiu RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Fitxer" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Puja un contenidor." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Destinació" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Llegint captcha" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "El captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Introdueix el text del captcha." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Tancar" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Interfície web" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Hi ha una actualització de pyLoad disponible!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Plugins actualitzats, si us plau reinicia!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Esperant captcha" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Sortir" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administrar" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Informació" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Si us plau fes login!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Aturar" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Cancel·lar" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Descàrrega:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Reconnectar:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Velocitat:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Actiu:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Recarregar pàgina" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "carregant" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Tornar a l'inici" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Sortir de pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Reiniciar pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Per afegir usuari o canviar contrasenya emprar:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Important: L'usuari administrador sempre te tots els permisos!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Canviar Contrasenya" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Administrador" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Permisos" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "canviar" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Introdueixi la contrasenya actual i la desitjada." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Usuari" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Contrasenya actual" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Contrasenya nova" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "La nova contrasenya." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Nova contrasenya (repetir)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Siusplau repeteix la nova contrasenya." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "No tens permisos per accedir a aquesta pàgina." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "No s'ha trobat el directori de descàrregues." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "il·limitat" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "no disponible" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Executa pyload.py -s per accedir a l'instal·lació." diff --git a/locale/ca/LC_MESSAGES/pyLoad.po b/locale/ca/LC_MESSAGES/pyLoad.po index 5d58ff375..732ef9ec8 100644 --- a/locale/ca/LC_MESSAGES/pyLoad.po +++ b/locale/ca/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "S'ha rebut la senyal de Sortida" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "ja s'estat executant pyLoad amb el pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Ha fallat el canvi de el grup: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Ha fallat el canvi d'usuari: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "carpeta de registre" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Començant" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Emprant el directori d'inici: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto descodificarà el contenidor de fitxers" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "carpeta per fitxers temporals" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "carpeta de descàrregues" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL per connexions segures" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Movent l'antiga configuració d'usuari a la DB" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Comprova les teves dades de login amb ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Tots els enllaços eliminats" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Temps de descàrrega: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Espai lliure: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Activant Comptes..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Activant Plugins..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad està en funcionament" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "reiniciant pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad està sortint" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Instal·la %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "no s'ha pogut trobar %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "no s'ha pogut crear %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "apagant..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "ha succeït un error mentre s'apagava" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "matat pyLoad des de el Terminal" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "L'arxiu de la base de dades ha estat eliminat per una incompatiblitat de la versió." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "El fitxer de la base de dades NO pot ser convertit." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "La base de dades ha estat convertida de la v2 a la v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "La base de dades ha estat convertida de la v3 a la v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Convertint l'antiga BD de Django" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "finalitzat" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "fora de línia" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "en línia" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "en cua" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "saltat" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "esperant" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "temporalment fora de línia" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "començant" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "fallit" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "avortat" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "desxifrant" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "personalitzat" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "descarregant" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "processant" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "deconegut" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Paquet finalitzat: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Emprant SSL ThriftBackend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Error al backend remot: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Iniciant %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "S'ha fallat la carrega del backend %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "esperant %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "No s'han trobat els certificats SSL." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Ho sent molt, ja no permetem iniciar %s directament emprant pyLoad" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Pots emprar el servidor amb fils que ofereix millor rendiment i ssl," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "per suposat encara pots emprar el teu %s amb el servidor fastcgi de pyLoad" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "les configuracions d'exemple estan al directori module/webui/servers" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "les configuracions d'exemple estan al directori pyload/webui/servers" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "No s'ha pogut emprar %(server)s, python-flup no està instal·lat!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Error important el servidor lleuger: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Has de descarregar i compilar el bjoern. https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Copia el fitxer boern.so a la carpeta module/lib o empra setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Copia el fitxer boern.so a la carpeta pyload/lib o empra setup.py install" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Per suposat hauràs d'estar familiaritzat amb GNU/Linux i sabre com compilar programes" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "El servidor està en mode multi-fil degut als problemes de rendiment a windows." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Aquest servidor no ofereix SSL, si us plau considera l'opció d'emprar el servidor amb fils" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Iniciant el servidor incorporat: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Iniciant el servidor web SSL amb fils: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Iniciant el servidor web amb fils: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Iniciant el servidor fastcgi: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Iniciant el servidor web lleuger (bjoern): %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "No tens permisos per accedir a aquesta pàgina." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "No s'ha trobat el directori de descàrregues." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "il·limitat" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "no disponible" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Executa pyload.py -s per accedir a l'instal·lació." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Descàrrega per trossos fallida, tornant a la connexió única | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Iniciant descàrrega: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Descàrrega finalitzada: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "El plugin %s troba a faltar una funció." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Descàrrega avortada: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Descàrrega reiniciada: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "La descàrrega està fora de línia: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "La descàrrega està temporalment fora de línia: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Descàrrega fallida: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "No s'ha pogut connectar amb el servidor o la connexió s'ha reiniciat, esperant 1 minuts per tornar-ho a provar." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Descàrrega omitida: %(name)s due to %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Desxifrant comença en: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Desxifrat fallit: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Re-intentant %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Obtenint informació per %(name)s failed | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Error executant ganxos: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "L'activació de %(name)s ha fallat" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Plugins activats: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Plugins desactivats: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Reconnexió fallida: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "No s'ha trobat l'script de reconnexió!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Iniciant reconnexió" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "L'execució de l'script de reconnexió ha fallat!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Reconnectat, nova IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "No queda suficient espai lliure al dispositiu" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "No s'ha pogut iniciar sessió amb el compte %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Contrasenya Errònia" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "L'hora %s està en un format incorrecte, empra: 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "El compte %s no te suficient tràfic, es tornarà a comprovar d'aquí 30min" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "El compte %s està caducat, es tornarà a comprovar d'aquí 1h" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Límit de descàrrega assolit" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s té un patró invàlid." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Error important %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "No s'ha carregat cap proveïdor" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Activa la descàrrega directa al teu compte de Bitshare" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "LinkList no pot ser netejat." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Els ajustaments del compte han estat eliminats degut al nou format de la configuració." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Autorització requerida (usuari:contrasenya)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Si us plau, introdueixi el seu compte de %s o desactivar aquest plugin" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Hi havia Codi HTML en el fitxer (%s) descarregat... error de re-direcció? Es re-iniciarà la descàrrega." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Fitxer temporalment no disponible" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: esperant entre descàrregues %d s." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: esperant per captcha %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "El fitxer descarregat estava buit" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "Clau de API invàlida" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: No queda suficient tràfic" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Tràfic excedit" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Tràfic Compartit (descàrrega directa)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Ja s'està descarregant des de aquesta adreça IP, esperant 60 segons" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Codi d'Autenticació invàlid, la descàrrega serà reiniciada" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: No hi ha espais lliures" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Necessites un compte premium per aquest fitxer" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Nom de fitxer informat invàlid" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Error de descàrrega paral·lela, esperant 60s." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "No connectat." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Desxifrat ha fallat" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Cap clau de fitxer proporcionat a la URL" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Codi d'error:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "El fitxer no existeix." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "* * * Plugins s'han actualitzat, si us plau reinicieu pyLoad * * *" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Plugins actualitzats i recarregats" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "No hi ha actualitzacions de plugins disponibles" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "No hi ha actualitzacions del pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** La nova Versió %s de pyLoad està disponible ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Obtengui'l aquí: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "No es pot connectar al servidor per actualitzacions" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Nova versió de %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "S'ha produït un error mentre s'actualitzava %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "La versió no coincideix" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Descàrrega finalitzada: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Nova petició de Captcha: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Constesta amb 'c %s text del captcha'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Si us plau, afegeiu el vostre compte premium.to i torneu a iniciar pyLoad" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Afegit %s des de HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "El %s no està instal·lat" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "No s'ha pogut activar %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Activat" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "No hi han connectors d'extracció activats" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "El paquet %s s'ha posat a la cua per una posterior extracció" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Revisa el paquet %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Extreu a %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "No s'han trobat fitxers per extreure" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "extraient" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Protegit amb contrasenya" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Contrasenya incorrecta" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Eliminant els fitxers %s" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Extracció finalitzada" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Error d'arxiu" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "El CRC no coincideix" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Error desconegut" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Configuració d'usuari i el grup ha fallat" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: El Port 9666 ja s'està en ús" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s crèdits restants" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "No s'ha pogut enviar la resposta." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "El teu compte de CaptchaTrader no te crèdits suficients" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Llista de Crypter no trobada" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "La llista de Crypter està buida" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Descàrrega finalitzada : %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Nou CaptchaID de càrrega: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "El teu compte de 9kw.eu no te crèdits suficients" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Scripts instal·lats per %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Script no executable:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Error en %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "El teu compte de ExpertDecoders no te crèdits suficients" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Si us plau afegir el seu compte de rehost.to primer i reinicieu pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Si us plau afegiu un compte vàlid premiumize.me primer i reinicieu pyLoad." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d crèdits restants" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil i tesseract no estan instal·lats i no hi ha cap Client connectat per desxifrar captchas" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Cap plugin ha pogut obtenir resultats apropiats d'aquest captcha en un temps assignat." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Aplicació d'Usuari i el Grup ha fallat: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "No hi ha cap client connectat per des-encriptar el captcha" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Afegit paquet %(name)s que conté les enllaços %(count)d" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Afegits %(count)d enllaços al paquet #%(package)d " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "No s'ha trobat cap motor js, si us plau instal·la Spidermonkey, ossp-js, pyv8 o rhino" diff --git a/locale/ca/LC_MESSAGES/pyLoadCli.po b/locale/ca/LC_MESSAGES/pyLoadCli.po index 995e05137..da383b6a7 100644 --- a/locale/ca/LC_MESSAGES/pyLoadCli.po +++ b/locale/ca/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Línia de Comandes" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s Baixades:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Velocitat: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Mida: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Acabarà en: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "esperant: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Estat:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "pausat" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "executant" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "velocitat Total" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Fitxers en cua" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Menú:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Afegeix enllaços" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Gestiona Cua" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Gestiona Col·lector" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "Reprèn/Pausa Servidor" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Mata Servidor" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Surt" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Si us plau empreu aquesta sintaxi: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Comprovant %d enllaç(os):" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "El fitxer no existeix." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad ha finalitzat" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Mostra estat del servidor" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Mostra descàrregues en cua" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Mostra descàrreges en el col·lector" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Afegeix paquet a la cua" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Afegeix paquet al col·lector" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Elimina Fitxers de la Cua/Col·lector" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Elimina Paquets de la Cua/Col·lector" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Mou Paquets de la Cua al Col·lector o viceversa" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Reinicia fitxers" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Reinicia paquets" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Comprova l'estat online, funciona amb contenidor local" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Comprova l'estat online d'un fitxer contenidor" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Pausa el servidor" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "continua les descàrregues" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Canvia pausa/reprèn" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "mata servidor" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Llista de comandes:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "No s'ha pogut escriure el fitxer de configuració d'usuari" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Necessites py-openssl per connectar-te al nucli del pyLoad." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Adreça: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Nom d'usuari: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Contrasenya: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Dades d'accés incorrectes." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "No s'ha pogut establir la connexió a %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Necessites py-openssl per connectar-te al nucli del pyLoad." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Mode interactiu ignorat ja que has especificat algunes comandes." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Afegeix Paquet:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Introdueix el nom per el nou paquet" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Paquet: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Analitza dels enllaços que vols introduir." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Introdueix %s en acabar." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Enllaços afegits: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " torna al menú principal" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Gestiona Paquets:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Gestiona Enllaços:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Què vols moure?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Què vols eliminar?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Què vols reiniciar?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Tria el que vols fer o introdueix un número de paquet." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "elimina" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "mou" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "reinicia" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - anterior" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - següent" diff --git a/locale/ca/LC_MESSAGES/setup.po b/locale/ca/LC_MESSAGES/setup.po index 0ad9ba08a..8f6fbeb8c 100644 --- a/locale/ca/LC_MESSAGES/setup.po +++ b/locale/ca/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "s" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Benvingut a l'Assistent de Configuració de pyLoad." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Es comprovarà el teu equip i es farà una configuració bàsica per executar pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "El valor entre claudàtors [] sempre és el valor per defecte," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "en cas de no voler canviar-ho o si estas insegur de que triar simplement pitja enter." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "No oblidis: Sempre pots tornar a l'assistent amb els paràmetres --setup o -s quan inicies el pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Si tens cap problema amb l'assistent pitja Control-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "per avortar i no permetre que s'iniciï automàticament amb pyload.py ." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Quan estiguis llest per la comprovació del sistema pitja enter." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Necessites pycurl, squlit i python 2.5, 2.6 o 2.7 per executar pyLoad." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Si us plau corregeix aixo i torna a executar el pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "L'assistent ara es tancarà." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "La comprovació del sistema ha acabat, pitja enter per veure l'informe de l'estat." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Estat ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "desxifrant contenidor" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "connexió SSL" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "desxifrat automàtic de captcha" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Interfície web" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "extensió Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Funcionalitats disponibles:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Funcionalitats no disponibles: " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "py-crytop no disponible" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Això es necessari si vols desxifrar els contenidors de fitxers." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL no disponible" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Això es necessari si vols establir connexions segures amb el nucli o la interfície web." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Si només voleu accedir a pyLoad localment el SSL no és necessari." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "reconeixedor de Captchas no disponible" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Només necessari per alguns proveïdors com a usuari gratuït." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "GUI no disponible" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "La Interfície Gràfica d'Usuari." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "no s'ha trobat el motor JavaScript" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Es necessari algun d'aquests paquets per els enllaços Click'N'Load. Instal.la Spidermonkey, ossp-js, pyv8 o rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Ara pots avortar la instal·lació i arreglar les dependències, si així ho prefereixes." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Continuar amb la instal·lació?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Vols canviar la ruta de configuració? Actualment és %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Si estas emprant pyLoad en un servidor o en una partició a un dispositiu flash intern és una bona idea canviar-ho." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Canviar la ruta de configuració?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Vols configurar les dades d'accés i la configuració bàsica?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Això és recomanant en la primera execució." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Establir una configuració bàsica?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Vols configurar el SSL?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Configurar SSL?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Vols configurar l'interíicie web?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Configurar interfície web?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Configuració finalitzada satisfactòriament." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Pitja enter i reinicia pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Comprovació del Sistema ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "La teva versió de python és massa nova. Si us plau empra Python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "La teva versió de python és massa antiga. Si us plau empra com a mínim Python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Versió de Python: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "La teva versió %s de jinja2 es massa antiga." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Pots continuar tranquil·lament encara que la interfície web no funcioni," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "si us plau actualitza o desinstal·la-ho, pylLoad ja inclou una biblioteca jinja2." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "Motor JS" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Configuració bàsica ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Les dades d'accés següents són vàlides per CLI, GUI i la interfície web." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Nom d'usuari" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Els clients externs (GUI, CLI i altres) necessiten accés remot a través de la xarxa per funcionar." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "No obstant, si només vos emprar la interfície web pots deshabilitar-lo per estalviar memòria ram." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Activar accés remot" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Idioma" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Directori de descàrregues" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Nombre màxim de descàrregues paral·leles" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Emprar el reconnectar?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Ubicació de l'script de reconnexió" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Configuració de la interfície Web ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Activar interfície web?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Adreça d'escolta, si empres 127.0.0.1 o localhost la interfície web només serà accessible localment." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Adreça" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Port" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad ofereix uns quants backends, ara se'n farà una breu explicació." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "El servidor per defecte es la millor opció si no saps quin triar." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Aquest servidor ofereix SSL i es una bona alternativa a l'integrat." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Pots emprar apache, lighttpd, però requereixen ser configurats i no sempre és una tasca fàcil." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Una alternativa escrita en C, requereix libev i coneixements de GNU/Linux." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Aconsegueix-lo aquí: https://github.com/jonashaag/bjoern, compila'l" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "i copia bjoren.so a module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "i copia bjoren.so a pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Atenció: En alguns casos estranys el servidor integrat no funciona, ho notareu amb problemes a la interfície web" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "torna aquí i canvia el servidor integrat per el servidor amb fils." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Servidor" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Configuració SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Executa aquesta comanada des de la carpeta de configuració de pyLoad per fer els certificats SSL:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Si has acabat i tot ha anat bé ara podràs activar el SSL." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Activar SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Tria una opció" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Crear/editar usuari" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Llistar usuaris" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Eliminar usuari" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Sortir" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Usuaris" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Configurant nova ruta de configuració, la configuració actual no serà transferida!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Ruta de configuració" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Ruta de configuració canviada, la instal·lació es tancarà, si us plau reinicia per continuar." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Pitja enter per sortir." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "L'ajustament de la ruta de configuració ha fallat: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: perdut" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Contrasenya: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "La contrasenya és massa curta. Utilitzeu almenys 4 caràcters." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Contrasenya (altre cop): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Les contrasenyes no coincideixen." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "sí" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "cert" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "c" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "fals" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Entrada invàlida" diff --git a/locale/cli.pot b/locale/cli.pot index e6cd0a1e3..db8033d31 100644 --- a/locale/cli.pot +++ b/locale/cli.pot @@ -17,283 +17,283 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/core.pot b/locale/core.pot index 177ac109c..47550a6aa 100644 --- a/locale/core.pot +++ b/locale/core.pot @@ -17,882 +17,882 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: module/Core.py:181 +#: pyload/Core.py:181 msgid "Received Quit signal" msgstr "" -#: module/Core.py:302 +#: pyload/Core.py:302 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:316 +#: pyload/Core.py:316 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:326 +#: pyload/Core.py:326 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:328 +#: pyload/Core.py:328 msgid "folder for logs" msgstr "" -#: module/Core.py:339 +#: pyload/Core.py:339 msgid "Starting" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:349 +#: pyload/Core.py:349 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:352 +#: pyload/Core.py:352 msgid "folder for temporary files" msgstr "" -#: module/Core.py:357 +#: pyload/Core.py:357 msgid "folder for downloads" msgstr "" -#: module/Core.py:360 +#: pyload/Core.py:360 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:364 +#: pyload/Core.py:364 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:367 +#: pyload/Core.py:367 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:370 +#: pyload/Core.py:370 msgid "All links removed" msgstr "" -#: module/Core.py:401 +#: pyload/Core.py:401 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:411 +#: pyload/Core.py:411 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:431 +#: pyload/Core.py:431 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:437 +#: pyload/Core.py:437 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:440 +#: pyload/Core.py:440 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:459 +#: pyload/Core.py:459 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:463 +#: pyload/Core.py:463 msgid "pyLoad quits" msgstr "" -#: module/Core.py:520 +#: pyload/Core.py:520 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:556 +#: pyload/Core.py:556 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:558 +#: pyload/Core.py:558 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:579 +#: pyload/Core.py:579 msgid "shutting down..." msgstr "" -#: module/Core.py:596 +#: pyload/Core.py:596 msgid "error while shutting down" msgstr "" -#: module/Core.py:660 +#: pyload/Core.py:660 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:36 +#: pyload/threads/ServerThread.py:36 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:42 +#: pyload/threads/ServerThread.py:42 #, python-format msgid "" "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:43 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:43 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:58 +#: pyload/threads/ServerThread.py:58 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "" "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:60 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:60 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:61 +#: pyload/threads/ServerThread.py:61 msgid "" "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:64 +#: pyload/threads/ServerThread.py:64 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:127 +#: pyload/webui/app/pyload.py:127 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:195 +#: pyload/webui/app/pyload.py:195 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:264 module/webui/app/pyload.py:271 +#: pyload/webui/app/pyload.py:264 pyload/webui/app/pyload.py:271 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:509 +#: pyload/webui/app/pyload.py:509 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "" "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:103 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:103 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:90 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:90 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:243 +#: pyload/plugins/Account.py:243 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:269 +#: pyload/plugins/Account.py:269 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:276 +#: pyload/plugins/Account.py:276 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:126 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:126 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:132 +#: pyload/plugins/internal/MultiHoster.py:132 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:38 +#: pyload/plugins/accounts/BitshareCom.py:38 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:64 +#: pyload/plugins/container/LinkList.py:64 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:23 -#: module/plugins/hoster/RealdebridCom.py:40 -#: module/plugins/hoster/FreeWayMe.py:39 module/plugins/hoster/ZeveraCom.py:21 -#: module/plugins/hoster/UnrestrictLi.py:52 -#: module/plugins/hoster/Vipleech4uCom.py:30 -#: module/plugins/hoster/Premium4Me.py:27 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/SimplyPremiumCom.py:52 -#: module/plugins/hoster/MegaDebridEu.py:46 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/LinksnappyCom.py:29 -#: module/plugins/hoster/DebridItaliaCom.py:39 -#: module/plugins/hoster/RPNetBiz.py:28 -#: module/plugins/hoster/MultiDebridCom.py:40 -#: module/plugins/hoster/ReloadCc.py:26 module/plugins/hoster/OverLoadMe.py:38 -#: module/plugins/hoster/RehostTo.py:25 -#: module/plugins/hoster/PremiumizeMe.py:24 -#: module/plugins/hooks/RPNetBiz.py:45 +#: pyload/plugins/hoster/SimplydebridCom.py:23 +#: pyload/plugins/hoster/RealdebridCom.py:40 +#: pyload/plugins/hoster/FreeWayMe.py:39 pyload/plugins/hoster/ZeveraCom.py:21 +#: pyload/plugins/hoster/UnrestrictLi.py:52 +#: pyload/plugins/hoster/Vipleech4uCom.py:30 +#: pyload/plugins/hoster/Premium4Me.py:27 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/SimplyPremiumCom.py:52 +#: pyload/plugins/hoster/MegaDebridEu.py:46 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/LinksnappyCom.py:29 +#: pyload/plugins/hoster/DebridItaliaCom.py:39 +#: pyload/plugins/hoster/RPNetBiz.py:28 +#: pyload/plugins/hoster/MultiDebridCom.py:40 +#: pyload/plugins/hoster/ReloadCc.py:26 pyload/plugins/hoster/OverLoadMe.py:38 +#: pyload/plugins/hoster/RehostTo.py:25 +#: pyload/plugins/hoster/PremiumizeMe.py:24 +#: pyload/plugins/hooks/RPNetBiz.py:45 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:98 +#: pyload/plugins/hoster/FilesMailRu.py:98 #, python-format msgid "" "There was HTML Code in the Downloaded File (%s)...redirect error? The " "Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:145 -#: module/plugins/hoster/NetloadIn.py:169 +#: pyload/plugins/hoster/NetloadIn.py:145 +#: pyload/plugins/hoster/NetloadIn.py:169 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:182 +#: pyload/plugins/hoster/NetloadIn.py:182 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:213 +#: pyload/plugins/hoster/NetloadIn.py:213 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:251 +#: pyload/plugins/hoster/NetloadIn.py:251 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/MegaDebridEu.py:49 +#: pyload/plugins/hoster/MegaDebridEu.py:49 #, python-format msgid "Impossible to connect to %s" msgstr "" -#: module/plugins/hoster/MegaDebridEu.py:89 +#: pyload/plugins/hoster/MegaDebridEu.py:89 #, python-format msgid "Impossible to debrid %s" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:99 +#: pyload/plugins/hoster/RapidshareCom.py:99 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:126 -#: module/plugins/hoster/RapidshareCom.py:193 +#: pyload/plugins/hoster/RapidshareCom.py:126 +#: pyload/plugins/hoster/RapidshareCom.py:193 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:130 +#: pyload/plugins/hoster/RapidshareCom.py:130 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:198 +#: pyload/plugins/hoster/RapidshareCom.py:198 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:201 +#: pyload/plugins/hoster/RapidshareCom.py:201 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:203 +#: pyload/plugins/hoster/RapidshareCom.py:203 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:100 +#: pyload/plugins/hoster/FileserveCom.py:100 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:216 +#: pyload/plugins/hoster/FileserveCom.py:216 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:97 +#: pyload/plugins/hooks/UpdateManager.py:97 msgid "Not able to connect server to get updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:111 +#: pyload/plugins/hooks/UpdateManager.py:111 msgid "No pyLoad version available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:118 +#: pyload/plugins/hooks/UpdateManager.py:118 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:119 +#: pyload/plugins/hooks/UpdateManager.py:119 msgid "*** Get it here: https://github.com/pyload/pyload/releases ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:170 +#: pyload/plugins/hooks/UpdateManager.py:170 #, python-format msgid "New version of [%(type)s] %(name)s (v%(oldver)s -> v%(newver)s)" msgstr "" -#: module/plugins/hooks/UpdateManager.py:180 -#: module/plugins/hooks/UpdateManager.py:185 +#: pyload/plugins/hooks/UpdateManager.py:180 +#: pyload/plugins/hooks/UpdateManager.py:185 #, python-format msgid "Error when updating plugin %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:185 +#: pyload/plugins/hooks/UpdateManager.py:185 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/UpdateManager.py:196 +#: pyload/plugins/hooks/UpdateManager.py:196 #, python-format msgid "Removed blacklisted plugin: [%(type)s] %(name)s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:204 +#: pyload/plugins/hooks/UpdateManager.py:204 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:206 +#: pyload/plugins/hooks/UpdateManager.py:206 msgid "*** Plugins have been updated, pyLoad will be restarted now ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:211 +#: pyload/plugins/hooks/UpdateManager.py:211 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:81 +#: pyload/plugins/hooks/HotFolder.py:81 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:94 +#: pyload/plugins/hooks/ExtractArchive.py:94 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:96 -#: module/plugins/hooks/ExtractArchive.py:101 +#: pyload/plugins/hooks/ExtractArchive.py:96 +#: pyload/plugins/hooks/ExtractArchive.py:101 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:106 +#: pyload/plugins/hooks/ExtractArchive.py:106 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:108 +#: pyload/plugins/hooks/ExtractArchive.py:108 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:120 +#: pyload/plugins/hooks/ExtractArchive.py:120 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:143 +#: pyload/plugins/hooks/ExtractArchive.py:143 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:184 +#: pyload/plugins/hooks/ExtractArchive.py:184 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:199 +#: pyload/plugins/hooks/ExtractArchive.py:199 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:206 +#: pyload/plugins/hooks/ExtractArchive.py:206 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:217 +#: pyload/plugins/hooks/ExtractArchive.py:217 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:238 +#: pyload/plugins/hooks/ExtractArchive.py:238 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:246 +#: pyload/plugins/hooks/ExtractArchive.py:246 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:253 +#: pyload/plugins/hooks/ExtractArchive.py:253 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:259 +#: pyload/plugins/hooks/ExtractArchive.py:259 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:261 +#: pyload/plugins/hooks/ExtractArchive.py:261 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:265 +#: pyload/plugins/hooks/ExtractArchive.py:265 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:317 +#: pyload/plugins/hooks/ExtractArchive.py:317 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:70 -#: module/plugins/hooks/Captcha9kw.py:60 -#: module/plugins/hooks/ExpertDecoders.py:51 +#: pyload/plugins/hooks/CaptchaTrader.py:70 +#: pyload/plugins/hooks/Captcha9kw.py:60 +#: pyload/plugins/hooks/ExpertDecoders.py:51 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:118 +#: pyload/plugins/hooks/CaptchaTrader.py:118 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:136 +#: pyload/plugins/hooks/CaptchaTrader.py:136 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:45 +#: pyload/plugins/hooks/LinkdecrypterCom.py:45 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:59 +#: pyload/plugins/hooks/LinkdecrypterCom.py:59 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:94 +#: pyload/plugins/hooks/Captcha9kw.py:94 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:130 +#: pyload/plugins/hooks/Captcha9kw.py:130 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:96 +#: pyload/plugins/hooks/ExpertDecoders.py:96 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:50 +#: pyload/plugins/hooks/PremiumizeMe.py:50 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:70 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:70 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "" "Pil and tesseract not installed and no Client connected for captcha " "decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "" "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or " "rhino" diff --git a/locale/cs/LC_MESSAGES/django.po b/locale/cs/LC_MESSAGES/django.po index deaf35622..1136362de 100644 --- a/locale/cs/LC_MESSAGES/django.po +++ b/locale/cs/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Nová captcha" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Prosím přečtěte text captchy." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad restartován" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "vypnuto" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Úspěch" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "zapnuto" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Opravdu chcete ukončit pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Restartovat odkaz" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Smazat odkaz" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Prosím zadejte jméno balíčku." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Prosím, klikněte na správnou pozici captchy." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Nastala chyba." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Složka je prázdná" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Selhalo" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Žádné Captchy k přečtení." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Hesla se neshodují." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Nastavení uloženo." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Nová složka" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Opravdu chcete restartovat pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "cekam %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Aktivní Stahování" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Domů" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Stahování" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Logy" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Konfigurace" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Jméno" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Stav" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Informace" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Velikost" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Postup" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Přihlásit se" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Uživatelské jméno" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Heslo" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Vaše uživatelské jméno a heslo se neshodují s údaji v databázi. Prosím zkuste to znovu." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Pro reset vašich přihlašovacích údajů nebo přidání uživatele spusťte:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Smazat dokončené" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Restartovat nezdařené" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Složka:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Heslo:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Upravit Balíček" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Níže upravte vlastnosti balíčku." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Jméno balíčku." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Složka" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Jméno podsložky pro toto stahování." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Seznam hesel použitých pro unrar." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Odeslat" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Byli jste úspěšně odhlášeni." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Cesta" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absolutní" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relativní" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "jméno" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "velikost" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "typ" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "naposledy upraveno" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "nadřazený adresář" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "žádný obsah" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Obecné" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Pluginy" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Účty" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Vyberte sekci z menu" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Doplněk" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Platný do" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Zbývá traffic" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Čas" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Max Současně" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Smazat?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "platný" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "neplatný" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "ano" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "ne" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Přidat" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Přidat Účet" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Pro přístup k prémiovým funkcím vložte vaše přístupová data." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Vaše uživatelské jméno." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Heslo pro tento účet." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Typ" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Vyberte filehosting vašeho účtu." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "předchozí" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "další" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Konec" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Novinky" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Podpora" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Systém" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "pyLoad verze:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Složka instalace:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Složka nastavení:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Složka stahování:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Volné Místo:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Jazyk:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Port Vzdaleneho Rozhrani:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Nastavení" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Souborový Manažer" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Přidat Balíček" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Vložte vaše odkazy nebo uploadněte kontejner." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Jméno nového balíčku." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Odkazy" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Sem vložte vaše odkazy nebo jakýkoli text a stiskněte tlačítko filtrovat." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtrovat URL" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Heslo pro archiv RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Soubor" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Upload kontejneru." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Cíl" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Čtení captchy" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Vložte text captchy." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Zavřít" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Webové rozhraní" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "pyLoad Aktualizace k dispozici!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Pluginy aktualizovány, restartuj pyLoad!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha čeká" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Odhlásit" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administrace" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Informace" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Přihlašte se prosím!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Zastavit" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Zrušit" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Stahování:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Rychlost:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Aktivní:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Obnovit stránku" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "načítám" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Nahoru" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Ukončit pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Restartovat pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Pro přidání uživatele nebo změnu hesla použijte:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Důležité: Admin má vždy plná práva!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Změnit heslo" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Oprávnění" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "změnit" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Zadejte aktuální a požadované heslo." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Uživatel" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Aktuální heslo" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Nové heslo" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Nové heslo." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Nové heslo (znovu)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Prosím zadej nové heslo znovu." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Pro zobrazeni teto stranky nemate opravneni." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Adresar pro stahovani nenalezen." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "neomezený" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "neni k dispozici" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Pro setup spustte pyload.py -s." diff --git a/locale/cs/LC_MESSAGES/pyLoad.po b/locale/cs/LC_MESSAGES/pyLoad.po index 386dfb739..842f2fc6b 100644 --- a/locale/cs/LC_MESSAGES/pyLoad.po +++ b/locale/cs/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Prijat Quit signal" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad je jiz spusten pod pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Zmena skupiny selhala: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Zmena uzivatele selhala: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "slozka pro logy" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Spoustim" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Nastaven domovsky adresar: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto pro dekodovani kontejnerovych souboru" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "slozka pro docasne soubory" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "slozka pro stahovani" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL pro zabezpecene pripojeni" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Presunuji stara nastaveni uzivatele do DB." -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Prosim zkontrolujte sve prihlasovaci udaje pres ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Všechny odkazy odstraněny" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Cas stahovani: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Volne misto: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Aktivuji Ucty..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Aktivuji Pluginy..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad je spusten" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "restartuji pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad se ukonci" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Instalujte %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "nelze najit %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "nelze vytvorit %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "vypinani..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "chyba pri vypinani" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "pyLoad zastaven z terminalu" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "Databaze souboru byla smazana pro nekompatibilni verzi." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "Databáze nemůže být převedena" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "Databaze byla konvertovana z v2 na v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "Databaze byla konvertovana z v3 na v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Konvertuji starou databazi Django" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "hotovo" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "ve fronte" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "preskoceno" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "ceka" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "doc. nedostupne" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "spoustim" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "selhalo" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "zruseno" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "dekoduji" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "vlastni" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "stahuji" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "zpracovavam" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "neznamy" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Balicek dokoncen: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Pouzivam SSL ThriftBackend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Vzdalena chyba systemu: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Zahajuji %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Spousteni backendu %(name)s selhalo | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "cekam %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "Certifikaty SSL nenalezeny." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Omlouvame se, ale spousteni %s v ramci pyLoad jiz neni podporovano" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Je mozne pouzit server podporujici vlakna, ktery nabizi dobry vykon a ssl," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "a samozrejme je take mozne pouzit vas jiz existujici %s se serverem fastcgi pyLoadu" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "vzorove konfiguracni soubory jsou umisteny v adresari module/webui/servers" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "vzorove konfiguracni soubory jsou umisteny v adresari pyload/webui/servers" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Nelze pouzit %(server)s, python-flup neni nainstalovan!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Chyba pri importu lightweight serveru: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Musíte si stáhnout a zkompilovat bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Zkopirujte soubor boern.so do adresare module/lib nebo pouzijte setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Zkopirujte soubor boern.so do adresare pyload/lib nebo pouzijte setup.py install" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Samozrejme budete potrebovat znalost linuxu a kompilace software" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Server nyni pracuje s vlakny i pres zname obtize s vykonem na Windows" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Tento server nenabizi SSL, zvazte pouziti rezimu s vlakny" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Spoustim vestaveny Webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Spoustim SSL webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Spoustim webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Spoustim fastcgi server: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Startuji lightweight server (bjoern): %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Pro zobrazeni teto stranky nemate opravneni." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Adresar pro stahovani nenalezen." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "neomezený" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "neni k dispozici" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Pro setup spustte pyload.py -s." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Stahování částí selhalo, přecházím na jediné připojení | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Zahajuji stahovani: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Stahovani dokonceno: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "V pluginu %s chybi funkce." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Stahovani zruseno: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Stahovani obnoveno: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Zdroj stahovani je offline: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Zdroj stahovani je docasne nedostupny: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Stahovani selhalo: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "K hostiteli se nelze pripojit, nebo bylo pripojeni resetovano, cekam 1 minutu do dalsiho pokusu." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Stahovani preskoceno: %(name)s v dusledku %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Zacina dekodovani: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Dekodovani selhalo: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Zkousim znovu %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Ziskavani informaci pro %(name)s selhalo | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Chyba pri provadeni zaveseni: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Aktivace %(name)s selhala" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Aktivovane pluginy: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Deaktivovat pluginy: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Reconnect selhal: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Skript pro reconnect nenalezen!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Spoustim reconnect" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Provadeni skriptu pro Reconnect selhalo!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Reconnectnuto, nova IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Není dostatek místa na zařízení" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Nezdařílo se přihlášení k účtu %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Špatné heslo" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "Vas cas %s ma nespravny format, pouzijte 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "Účet %s nemá nedostatek trafficu, další kontrola za 30min" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "Účet %s vypršel, další kontrola za 1h" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Dosažen limit pro stahování" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s ma neplatny vzor." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Chyba pri importu %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Nenačten žádný plugin Hoster" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Aktivovat přímé stahování na vašem Bitshare accountu" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "LinkList nemohl byt vyprazdnen." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Pro novy format konfiguracniho souboru bylo nastaveni uctu smazano." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Je vyžadována autorizace (username:password)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Prosím vložte svůj %s účet nebo tento plugin deaktivujte" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Ve staženém souboru (%s) byl nalezen HTML kód... Chyba přesměrování? Stahování bude restartováno." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Soubor není dočasně k dispozici" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: čekání mezi stahováním %d s." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: čekám na captchu %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Stažený soubor byl prázdný" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "Neplatný API klíč" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Nezbývá dostatečný traffic" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Překročen Traffic" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "RapidShare: Traffic Share (přímé stažení)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Z této ip adresy již stahování probíhá, čekám 60 sekund" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Špatný autentizační kód, stahování bude restartováno" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: Žádné volné sloty" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Pro tento soubor potřebujete prémiový účet" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Ohlášeno neplatné jméno souboru" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Chyba souběžného stahování, čekám 60s." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Nejste přihlášeni." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Dešifrování selhalo" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "URL neobsahuje klíč souboru" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Kód chyby:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Soubor neexistuje." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Pluginy byly aktualizovány, prosím restartujte pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Pluginy aktualizovány a znovu načteny" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Žádné aktualizace rozšíření" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Žádné aktualizace pro pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Je dostupná nové verze pyLoad (%s) ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Získejte ji zde: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Nelze se připojit k update serveru" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Nová verze %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Chyba při aktualizaci %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Nesprávná verze" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Stahování dokončeno: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Nový požadavek na Captchu: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Odpovězte \"c %s text z captchy\"" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Nejdříve prosím přidejte váš premium.to účet a restartujte pyLoad" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Přidán %s ze sledované složky" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "%s není nainstalován" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Nelze aktivovat %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Aktivní" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Nejsou aktivovány žádné rozbalovací pluginy" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Balíček %s zařazen do fronty pro pozdější rozbalení" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Kontrola balíčku %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Rozbalit do %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Nenalezeny žádné soubory k rozbalení" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "rozbaluji" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Chráněno heslem" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Chybné heslo" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Mažu %s souborů" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Rozbalení dokončeno" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Chyba archivu" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC nesouhlasí" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Neznámá chyba" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Nastavení Uživatele a Skupiny selhalo" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: Port 9666 se již používá" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s kreditů zbývá" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Nelze odeslat odpověď." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Na vašem CaptchaTrader účtu není dostatek kreditu" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Seznam pluginů Crypter nenalezen" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Seznam pluginů Crypter je prázdný" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Stahování dokončeno: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Nové CaptchaID z uploadu: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Na vašem captcha účtu 9kw.eu není dostatek kreditu" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Nainstalované skripty pro %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Skript není spustitelný:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Chyba v %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Na vašm ExpertDecoders účtu není dostatek kreditu" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Nejdříve prosím přidejte váš rehost.to účet a restartujte pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Nejdříve prosím přidejte váš premiumize.me účet a restartujte pyLoad." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "Zbývá %d kreditů" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil a tesseract nejsou nainstalovány a není připojen žádný klient pro rozpoznávání Captchy" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Zadny plugin nedodal vysledek Captchy v prijatelnem case." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Nastavení uživatele a skupiny se nezdařilo: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Neni pripojen zadny klient pro dekodovani Captchy" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Pridan balicek %(name)s obsahujici %(count)d odkazu" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Do balicku #%(package)d pridano %(count)d odkazu " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Nenalezen zadny js engine, prosim naistalujte Spidermonkey, ossp-js, pyv8 nebo rhino" diff --git a/locale/cs/LC_MESSAGES/pyLoadCli.po b/locale/cs/LC_MESSAGES/pyLoadCli.po index 02483efb5..bd97917d6 100644 --- a/locale/cs/LC_MESSAGES/pyLoadCli.po +++ b/locale/cs/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Příkazová řádka" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s Stahování:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Rychlost: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Velikost: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Dokončeno za: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "čeká: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Stav:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "pozastaveno" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "probíhá" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "celková rychlost" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Souborů ve frontě" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Celkem" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Přidat Odkazy" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Správa fronty" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Správa Sběrače" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " Pozastavit/Spustit server" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Ukončit server" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Konec" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Prosím použijte tuto syntaxi: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Kontroluji %d odkazů:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Soubor neexistuje." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad byl ukončen" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Vypíše stav serveru" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Vypíše stahování ve frontě" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Vypíše stahování ve sběrači" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Přidá balíček do fronty" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Přidá balíček do sběrače" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Smazat soubory z fronty/sběrače" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Smazat balíčky z fronty/sběrače" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Přesun balíčku z fronty do sběrače nebo naopak" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Restart souborů" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Restart balíčků" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Zkontrolovat stav online - funguje s místním zásobníkem" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Zkontroluje online stav souboru ze zásobníku" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Pozastavit server" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "pokracovat ve stahovani" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Prepnout pozastaveni/beh" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "ukoncit server" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Seznam prikazu:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Nemohu zapsat nastavení uživatele" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Pro pripojeni k tomuto jadru pyLoad je vyzadovano py-openssl." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Adresa: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Uzivatelske jmeno: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Heslo: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Prihlasovaci udaje jsou chybne." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Nelze vytvorit pripojeni k %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "K pripojeni na toto pyLoad jadro potrebujete py-openssl." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Byly zadany prikazy, interaktivni mod je ignorovan." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Přidat Balíček:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Zadej název nového balíčku" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Balíček: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Analyzuje odkazy které chcete přidat." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Pokud jste hotovi, napište %s" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Přidáno odkazů: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " zpět do hlavního menu" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Správa balíčků:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr " Spravovat Odkazy:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Co chcete přesunout?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Co chcete smazat?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Co chcete restartovat?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Vyberte si, co chcete dělat, nebo zadejte číslo balíčku." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "smazat" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "přesunout" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "restartovat" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - předchozí" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - další" diff --git a/locale/cs/LC_MESSAGES/setup.po b/locale/cs/LC_MESSAGES/setup.po index 25c99bd7a..f5b2ae040 100644 --- a/locale/cs/LC_MESSAGES/setup.po +++ b/locale/cs/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "a" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Vitejte v konfiguracnim pruvodci programu pyLoad." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Zkontroluje vas system a provede zakladni nastaveni pro spusteni programu pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "Hodnota v zavorkach [] je vzdy vychozi," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "v pripade, ze ji nechcete zmenit nebo si nejste jisti co vybrat, jen stisknete enter." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Nezapomente: Tohoto pruvodce muzete kdykoli sputit znovu pouzitim parametru --setup nebo -s pri startu pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Pokud mate s pruvodcem jakekoli problemy, stisknete CTRL-C" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "pro zruseni a zamezeni jeho automatickeho spusteni pri dalsim startu pyload.py ." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Az budete pripraveni na kontrolu systemu, stisknete enter." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Pro beh pyLoad je potreba pycurl a python verze 2.5, 2.6 nebo 2.7." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Prosim odstrante problem a znovu spustte pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Setup bude nyni ukoncen." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Kontrola systemu ukoncena, stisknete enter pro zobrazeni zpravy o stavu." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Stav ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "dekodovani kontejneru" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "pripojeni ssl" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "automaticke rozpoznavani captchy" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Webové rozhraní" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "rozsirene Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Dostupne funkce:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Chybejici funkce: " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "py-crypto nedostupne" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Toto potrebujede k dekodovani souboru kontejneru." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL nedostupne" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Je potreba k vytvoreni zabezpeceneho pripojeni k jadru nebo webovemu rozhrani." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Pokud budete pyLoad pouzivat pouze lokalne, ssl neni nutne." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "rozpoznavani Caprtchy nedostupne" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Je potreba jen pro nektere filehostingy pro neplaceny pristup." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "Gui nedostupne" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "Graficke Uzivatelske Rozhrani" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "nenalezeno zadne jadro JavaScriptu" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Toto budete potrebovat pro nektere Click'N'Load linky. Naistalujte Spidermonkey, ossp-js, pyv8 nebo rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Pokud chcete, muzete nyni zrusit instalaci a opravit nektere zavislosti." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Pokracovat v instalaci?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Chcete zmenit cestu k nastaveni? Stavajici je %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Pokud pouzivate pyLoad na serveru, nebo je domovsky oddil na vnitrni flash, muze byt dobre ji zmenit." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Zmenit cestu k nastaveni?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Chcete nastavit prihlasovaci udaje a zakladni volby?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Doporuceno pri prvnim spusteni." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Vytvorit zakladni nastaveni?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Prejete si nastavit ssl?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Nastavit ssl?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Prejete si nastavit webove rozhrani?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Nastavit webove rozhrani?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Nastaveni uspesne dokonceno." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Stiknete enter pro ukonceni a restartujte pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Kontrola Systemu ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Vase verze pythonu je prilis nova, prosim pouzijte verzi 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Vase verze pythonu je prilis stara, prosim pouzijte alespon Python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Verze Pythonu: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Vase nainstalovana verze %s jinja2 je prilis stara." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Muzete bezpecne pokracovat, nicmene pokud bude webove rozhani nefunkcni," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "bude treba ji upgradovat nebo odistalovat, pyLoad jiz obsahuje knihovnu jinja2." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "jadro JS" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Zakladni nastaveni ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Nasledujici prihlasovaci udaje jsou platne pro CLI, GUI a webove rozhrani." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Uživatelské jméno" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Externí klientské aplikace (např. GUI a CLI) vyžadují vzdálený přístup pro fungovaní přes síť." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Pokud však chcete používat pouze webové rozhraní, můžete jej zakázat a ušetřit tak paměť." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Povolit vzdálený přístup" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Jazyk" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Slozka pro stahovani" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Max soubeznych stahovani" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Pouzivat Reconnect?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Umisteni skriptu pro Reconnect" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Nastaveni Weboveho rozhrani ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Aktivovat webove rozhrani?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Adresa pro naslouchani, pokud pouzijete 127.0.0.1 nebo localhost, bude webove rozhrani pristupne pouze lokalne." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Adresa" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Port" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad nabizi mnoho vezri administrace, nize kratke vysvetleni." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Vychozi server, nejlepsi volba, pokud nevite, ktery vybrat." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Tento server nabizi SSl a je dobrou alternativou k vestavenemu." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Muze byt pouzit apachem, lighttpd, vyzaduje vsak nastaveni, ktere nemusi byt snadne." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Velmi svizna alternativa napsana v C, vyzaduje znalost linuxu a libev." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Stahnete jej zde: https://github.com/jonashaag/bjoern a zkompilujte" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "a zkopirujte bjoern.so do adresare module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "a zkopirujte bjoern.so do adresare pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Pozor: V nekterych zvlastnich pripadech neni vestaveny server funkcni. Pokud mate problemy s webovym rozhranim," -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "vratte se sem a zmente vestaveny server za server s vlakny." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Server" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Nastaveni SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Pro vytvoreni ssl certifikatu spustte tyto prikazy v konfiguracni slozce pyLoad:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Pokud jste skoncili a vse probehlo v poradku, muzete aktivovat SSL." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Aktivovat SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Zvolte akci" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Vytvorit/Upravit uzivatele" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Seznam uzivatelu" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Odstranit uzivatele" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Konec" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Uzivatele" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Nastavuji novou cestu ke konfiguracnim souborum, stavajici konfigurace nebude prenesena!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Cesta ke konfiguracnim souborum" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Cesta ke konfiguracnim souborum byla zmenena, instalace se nyni ukonci, pro pokracovani ji prosim restartujte." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Stisknete enter pro ukonceni." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Nastaveni cesty ke konfiguracnim souborum selhalo: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: chybi" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Heslo: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Heslo je příliš krátké. Použijte nejméně 4 znaky." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Heslo (znovu): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Hesla se neshodují." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "ano" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "pravda" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "p" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "ne" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "nepravda" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "n" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Neplatne zadani" diff --git a/locale/da/LC_MESSAGES/django.po b/locale/da/LC_MESSAGES/django.po index 786082c8e..b131d9408 100644 --- a/locale/da/LC_MESSAGES/django.po +++ b/locale/da/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Ny Captcha anmodning" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Læs venligst teksten i captcha" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad genstartet" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Succes" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Er du virkelig sikker på du vil lukke pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Genstart Link" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Slet link" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Indtast venligst et pakkenavn" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Tryk venligst på den højre captcha" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Fejl opstod" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Mappen er tom" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Ingen Captcha at læse" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Adgangskoden stemte ikke overens" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Indstillinger gemt." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Ny mappe" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Er du sikker på du vil genstarte pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Aktive hentninger" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Hjem" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Logfiler" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Konfiguration" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Fremskridt" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Dit brugernavn og adgangskode stemte ikke overens. Prøv venligst igen." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "For at nulstille dine logind data eller tilføje en bruger kør:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Slet afsluttede" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Genstart mislykkedes" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Mappe:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Adgangskode:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Redigér pakke" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Redigér pakke detaljerne nedenfor." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Pakkens navn." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Navnet på disse nedhentnigers undermappe." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Liste over adgangskoder brugt til unrar." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Nulstil" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Du er logget ud med succes." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Sti" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absolut" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relativ" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "navn" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "størrelse" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "indtast" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "sidst ændret" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "forrige mappe" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "intet indhold" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Vælg en sektion fra menuen" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Gyldig indtil" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Trafik tilbage" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Tid" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Maks paralelle" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Slet?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "ikke gyldig" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "ja" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "nej" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Indtast dine konto data for at benytte premium egenskaber." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Dit brugernavn." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Adgangskoden til denne konto." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Vælg udbyderen for din konto" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "forrige" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "næste" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Slut" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Nyheder" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Installations mappe:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Konfigurations mappe:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Download mappe:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Fri plads:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Sprog:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Webinterface port:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Fjerninterface port:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "FilManager" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Tilføj pakke:" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Indsæt dine links eller overfør en beholder." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Navnet på den nye pakke" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Indsæt dine links eller hvilkensomhelst tekst her og tryk filtrer knappen." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtrér urls" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Adgangskode for RAR-arkiv" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Fil" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Overfør en beholder." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Captcha læser" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Captcha'en" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Tekst" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Indsæt teksten i captcha'en" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Webbrugerflade" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Tilgængelig pyLoad opdatering!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Plugins blev opdateret, genstart venligst!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha venter" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Log af" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administrér" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "info" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Log venligst ind!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Genstart:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Hastighed:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Aktiv:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Genhent side" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "indlæser" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Tilbage til toppen" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Luk pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Genstart pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "For at tilføje bruger eller ændre adgangskode brug:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Vigtigt: Admin brugere har altid alle rettigheder" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Skift adgangskode" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Rettigheder" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "skift" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Indtast din nuværende og ønskede adgangskode " -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Bruger" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Nuværende adgangskode" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Ny adgangskode" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Den nye adgangskode." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Ny adgangskode (gentag)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Gentag venligst den nye adgangskode." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "ikke tilgængelig" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/da/LC_MESSAGES/pyLoad.po b/locale/da/LC_MESSAGES/pyLoad.po index 84f0e21a3..8b0ccab04 100644 --- a/locale/da/LC_MESSAGES/pyLoad.po +++ b/locale/da/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Starter" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "mappe til midlertidige filer" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL til sikker forbindelse" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Fri plads: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Aktiverer konti..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "genstarter pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad afslutter" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Installér %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "lukker ned..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "fejl ved nedlukning" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "dræbte pyLoad fra terminal" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "Starter" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "ikke tilgængelig" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/da/LC_MESSAGES/pyLoadCli.po b/locale/da/LC_MESSAGES/pyLoadCli.po index 303155034..c87fd85ab 100644 --- a/locale/da/LC_MESSAGES/pyLoadCli.po +++ b/locale/da/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s Hentes:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "Hastighed:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "Størrelse:" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "Færdig om:" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "ID:" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "Venter:" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "Tilføj Links" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "Genoptag/Pause Server" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "Afslut Server" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "Afslut" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Brug venligst denne syntaks: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad var afslutte" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Udskriver server status" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Flyt pakker fra kø til samler og opmvendt" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Genstart filer" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Genstart pakker" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Pause serveren" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "Fortsæt hentning" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Pause/Genoptag" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "Afslut server" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Kommando liste" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Kunne ikke skrive til bruger config filen" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Du mangler py-openssl for at tilslutte til denne pyLoad Kerne" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Adresse:" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Port:" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Brugernavn:" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Kode:" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Login oplysninger er forkerte" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Can ikke etablere forbindelse til %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Du mangler py-openssl for at tilslutte til denne pyLoad Kerne" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Interaktiv tilstand ignoreres da du gik nogle kommandoer." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Indsæt de links du ønsker at tilføje" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Skriv %s når du er færdig." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Links tilføjet:" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "tilbage til hovedmenu" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Håndtér pakker:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Håndtér Links:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Hvad vil du flytte?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Hvad vil du slette?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Hvad vil du genstarte?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "slet" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "flyt" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "genstart" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "- forrige " -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "- næste" diff --git a/locale/da/LC_MESSAGES/setup.po b/locale/da/LC_MESSAGES/setup.po index 8ae55af99..a14bdf05f 100644 --- a/locale/da/LC_MESSAGES/setup.po +++ b/locale/da/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Webbrugerflade" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Kode:" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Adgangskoden stemte ikke overens" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "ja" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "nej" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index cdcf10c1d..f40ad98a7 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Neue CAPTCHA-Anfrage" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Bitte lies den Text auf dem Captcha." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad wurde neu gestartet" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "aus" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Erfolgreich" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "ein" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Bist du sicher, dass du pyLoad beenden möchtest?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Link neu starten" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Link löschen" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Bitte gib einen Paketnamen ein." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Bitte klicke auf die richtige Position im Captcha." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Ein Fehler ist aufgetreten." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Ordner ist leer" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Fehlgeschlagen" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Keine CAPTCHA's verfügbar." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Passwörter stimmen nicht überein." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Einstellungen gespeichert" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Neuer Ordner" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Sicher, dass du pyLoad neustarten willst?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "Warte %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Aktiv" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Start" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "Warteschlange" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "Linksammler" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Downloads" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Log" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Einstellungen" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Name" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Status" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Informationen" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Größe" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Fortschritt" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Anmeldung" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Benutzername" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Passwort" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Dein Benutzername und/oder Passwort sind falsch. Bitte versuche es noch einmal." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Um deine Login-Informationen zu resetten oder un einen Benutzer hinzuzufügen, starte:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Fertige löschen" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Fehlgeschlagene neustarten" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Ordner:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Passwort:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Paket bearbeiten" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Bearbeiten Sie hier die Paketdetails." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Name des Pakets." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Verzeichnis" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Name des Unterordners für diese Downloads." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Liste der Passwörter, welche für das Entpacken genutzt werden." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Übernehmen" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Abbrechen" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Du wurdest erfolgreich abgemeldet." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Pfad" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absolut" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relativ" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "Name" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "Größe" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "Typ" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "zuletzt verändert" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "übergeordnetes Verzeichnis" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "kein Inhalt" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Allgemein" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Zusatzprogramme" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Konten" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Wähle einen Abschnitt aus dem Menü." -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Erweiterung" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "Premium" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Gültig bis:" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Verbleibender Traffic:" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Zeit:" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Max Parallel" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Löschen?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "gültig" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "ungültig" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "ja" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "nein" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Hinzufügen" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Konto hinzufügen" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Gib deine Benutzerdaten ein, um die Premiumfunktionen zu nutzen." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Dein Benutzername." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Das Password für diesen Account." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Typ" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Wähle den Hoster für dein Benutzerkonto." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Starten" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "zurück" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "weiter" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Ende" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Neuigkeiten" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Support" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "System" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "Python:" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "Betriebssystem:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "pyLoad Version:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Installationsordner:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Konfigurationsordner:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Downloadordner:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Freier Speicherplatz:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Sprache:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Webinterface Port:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Remoteinterface Port:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Konfiguration" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Dateimanager" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Paket hinzufügen" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Links einfügen oder Container hochladen." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Name des neuen Pakets." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Links" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Füge deine Links oder einen Text hier ein und drück den 'Filter' Knopf" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Links filtern" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Passwörter für RAR-Dateien" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Datei" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Container hochladen." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Ziel" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Captchas lesen" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "Captcha" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Das Captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Text" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Gib den Text aus dem Captcha ein." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Schließen" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Weboberfläche" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "pyLoad Update verfügbar!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Plugins aktualisiert, bitte pyLoad neustarten!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captchas verfügbar" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Abmelden" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administrieren" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Info" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Bitte anmelden!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Stoppen" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Abbrechen" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Download:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Erneut verbinden:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Geschwindigkeit:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Aktiv:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Aktualisieren" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "lade" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Nach oben" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "pyLoad beenden" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "pyLoad neustarten" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Um Benutzer hinzuzufügen oder Passwörter zu ändern benutze:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Wichtig: Admin User haben immer alle Berechtigungen!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Passwort ändern" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Admin" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Berechtigungen" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "ändern" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Gib dein momentanes und dein neues Passwort ein." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Benutzer" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Momentanes Passwort" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Neues Passwort" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Das neue Passwort." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Neues Passwort (wiederholen)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Bitte wiederhole das neue Passwort." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Sie haben nicht die Berechtigung diese Seite zu besuchen." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Downloadverzeichnis nicht gefunden." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "unbegrenzt" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "nicht verfügbar" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Starte pyload.py -s um auf dieses Setup zuzugreifen." diff --git a/locale/de/LC_MESSAGES/pyLoad.po b/locale/de/LC_MESSAGES/pyLoad.po index 1b402845a..61c5eaa15 100644 --- a/locale/de/LC_MESSAGES/pyLoad.po +++ b/locale/de/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Signal zum Beenden erhalten" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad ist bereits gestartet mit der pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Fehler beim Ändern der Gruppe: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Fehler beim Ändern des Benutzers: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "Ordner für Logs" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "starte" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Benutze Home-Verzeichnis: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pyCrypto um Containerdateien zu öffnen" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "Ordner für temporäre Dateien" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "Downloadordner" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL für eine sichere Verbindung" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Migriere alte Benutzereinstellungen in die Datenbank..." -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Bitte überprüfe deine Login-Informationen mit './pyload.py -u'" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Alle Links entfernt" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Downloadzeit: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Freier Speicher: %sGB" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Aktiviere Konten..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Aktiviere Plugins..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad ist gestartet und läuft" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "starte pyLoad neu" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad wird beendet" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Installiere %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "konnte %(desc)s nicht finden: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "konnte %(desc)s nicht erstellen: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "Beenden..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "Fehler beim Beenden" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "pyLoad vom Terminal beendet" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "Link Datenbank wurde aufgrund inkompatibler Version gelöscht." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "Link Datenbank konnte nicht konvertiert werden." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "Datenbank wurde von v2 nach v3 konvertiert." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "Datenbank wurde von v3 nach v4 konvertiert." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Konvertiere alte Django DB" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "Fertig" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "Offline" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "Online" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "eingereiht" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "übersprungen" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "wartend" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "kurzzeitig offline" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "starte" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "fehlgeschlagen" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "abgebrochen" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "entschlüsseln" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "benutzerdefiniert" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "downloade" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "verarbeite" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "unbekannt" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Paket fertiggestellt: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Nutze SSL Thrift Backend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Fehler beim Fernzugriff: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Starte %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Konnte Backend %(name)s nicht laden | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "Warte %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "SSL Zertifikat nicht gefunden." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Entschuldigung! Wir haben den Support für das Starten von %s direkt in pyLoad eingestellt" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Du kannst den multithreaded-server benutzen, welcher eine gute Performance, SSL und" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "natürlich kannst du weiterhin deine existierende %s mit pyLoads fastcgi server benutzen" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "Beispiel-Konfigurationsdateien befinden sich in dem Verzeichnis 'module/webui/servers'" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "Beispiel-Konfigurationsdateien befinden sich in dem Verzeichnis 'pyload/webui/servers'" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Kann %(server)s nicht benutzen, weil python-flup nicht installiert ist!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Fehler beim Laden vom lightweight Server: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Du musst 'bjoern' herunterladen und kompilieren, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Kopiere 'boern.so' in 'module/lib' oder benutze 'setup.py install'" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Kopiere 'boern.so' in 'pyload/lib' oder benutze 'setup.py install'" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Natürlich musst musst etwas Ahnung von Linux haben und wie man Software kompiliert" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Der 'threaded' Server wird wegen Performance Problemen unter Windows benutzt." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "SSL funktioniert mit diesem Server nicht, benutze bitte alternativ den 'threaded' Server" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Starte den eingebauten Webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Starte den threaded SSL Webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Starte den threaded Webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Starte fastcgi Webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Starte bjoern Webserver: %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Sie haben nicht die Berechtigung diese Seite zu besuchen." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Downloadverzeichnis nicht gefunden." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "unbegrenzt" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "nicht verfügbar" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Starte pyload.py -s um auf dieses Setup zuzugreifen." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Eine Download Verbindung ist fehlggeschlagen, Falle zurück auf eine Verbindung | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Starte Download: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Download fertiggestellt: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Dem Plugin %s fehlt eine Funktion." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Download abgebrochen: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Download erneut gestartet: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Download ist nicht verfügbar: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Download ist vorübergehend nicht verfügbar: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Download fehlgeschlagen: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Verbindungsaufbau zum Host fehlgeschlagen oder die Verbindung wurde zurückgesetzt. Erneuter Versuch in 1 Minute..." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Download %(name)s wegen %(plugin)s übersprungen" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Decrypting startet: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Decrypting fehlgeschlagen: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Wiederhole %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Holen von Informationen für %(name)s fehlgeschlagen | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Fehler beim ausführen des Hook: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Konnte %(name)s nicht aktivieren" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Aktivierte Plugins: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Deaktivierte Plugins: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "erneute Verbindung fehlgeschlagen: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Skript für erneute Verbindung nicht gefunden!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "versuche erneute Verbindung" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Fehler beim Ausführen des Skriptes für die erneute Verbindung!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Verbindung erneut aufgebaut, IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Auf dem Gerät ist nicht mehr genügend Speicherplatz vorhanden" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Fehler beim Anmelden mit Konto %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Falsches Passwort" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "Ihre Zeit %s hat ein falsches Format, nutzen Sie dieses: 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "Konto %s hat nicht genügend Traffic, erneuter Versuch in 30 min" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "Konto %s ist abgelaufen, erneuter Versuch in 1Std" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Downloadlimit erreicht" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s hat ein ungültiges Muster." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Fehler beim Importieren von %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Kein Hoster geladen" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Aktiviere direkten Download in deinem Bitshare Account" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "links.txt konnte nicht geleert werden." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Account-Einstellungen aufgrund neuem Konfigurationsformat gelöscht." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Authorisierung erforderlich (Benutzername:Passwort)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Bitte gib deine %s Kontodaten ein oder deaktiviere dieses Plugin" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Es gab HTML-Code in der heruntergeladen Datei (%s)... Umleitungsfehler? Der Download wird neu gestartet." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Datei zur Zeit nicht verfügbar" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: warte zwischen den Downloads %d s." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: Warte auf Captcha %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Die heruntergeladene Datei ist leer" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "API Schlüssel ungültig" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Nicht genügend Traffic übrig" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Traffic überschritten" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Traffic Share (direkter Download)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Von dieser IP Adresse wird bereits heruntergeladen, warte 60 Sekunden" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Ungültiger Authorization-Code, Download wird neugestartet" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: Keine freien Slots" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Du benötigst ein Premium-Konto für diese Datei" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Dateiname als ungültig gemeldet" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Parallel-Download Fehler, warte 60s." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Nicht eingeloggt." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Entschlüsselung fehlgeschlagen" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Für die Datei wurde kein Schlüssel in der URL übertragen" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Fehler Code:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Datei existiert nicht." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Plugins wurden aktualisiert, bitte starte pyLoad neu ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Plugins aktualisiert und neu geladen" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Keine Plugin-Updates verfügbar" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Keine Updates für pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Neue pyLoad Version %s verfügbar ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Download hier: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Konnte keine Verbindung zum Server herstellen, um auf Updates zu prüfen" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Neue Version von %(type)s | %(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Fehler beim Aktualisieren von %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Versionskonflikt" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Download fertig: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Neue Captcha Anfrage: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Beantworte Captcha mit \"c %s Text\"" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Bitte füge erst dein premium.to Konto hinzu und starte pyLoad neu" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "%s aus HotFolder hinzugefügt" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "Kein %s installiert" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Konnte %s nicht aktivieren" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Aktiviert" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Keine Entpacken-Plugins aktiviert" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Paket %s eingereiht für späteres entpacken" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Überprüfe Paket %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Entpacke nach %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Keine Dateien zum entpacken gefunden" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "entpacke" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Passwortgeschützt" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Falsches Passwort" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Lösche %s Dateien" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Entpacken abgeschlossen" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Archiv-Fehler" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC Fehler" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Unbekannter Fehler" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Setzen von Benutzer und Gruppe fehlgeschlagen" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: Port 9666 wird bereits verwendet" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s Credits verbleibend" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Konnte keine Antwort senden." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Dein CaptchaTrader Konto hat nicht genügend Credits" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Liste von Cryptern nicht gefunden" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Liste von Cryptern ist leer" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Download abgeschlossen: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Neue CaptchaID von Upload: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Dein Captcha 9kw.eu Account hat nicht genügend Credits" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Installierte Skripte für %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Script nicht ausführbar:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Fehler in %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Dein ExpertDecoders Account hat nicht genügend Credits" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Bitte fügen Sie zuerst Ihr rehost.to Konto hinzu und starten Sie pyLoad danach neu" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Bitte füge erst ein gültiges premiumize.me Konto hinzu und starte pyLoad neu." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d Credits verbleibend" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil und Tesseract sind nicht installiert und kein Client ist verbunden für Captcha-Entzifferung" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Es konnte in angemessener zeit kein Captcha-Ergebnis durch dies Plugins ermittelt werden." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Benutzer und Gruppe setzen fehlgeschlagen: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Kein Client verbunden zum eingeben des Captchas" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Paket %(name)s mit %(count)d Links hinzugefügt" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "%(count)d Links wurden zum Paket #%(package)d hinzugefügt " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Keine JS Engine erkannt. Bitte installiere entweder Spidermonkey, ossp-js, pyv8 oder rhino" diff --git a/locale/de/LC_MESSAGES/pyLoadCli.po b/locale/de/LC_MESSAGES/pyLoadCli.po index 86b59213c..2e4bd9056 100644 --- a/locale/de/LC_MESSAGES/pyLoadCli.po +++ b/locale/de/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Kommandozeile" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s Downloads:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Geschwindigkeit: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Größe: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Fertig in: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "wartend: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Status:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "pausiert" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "läuft" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "Gesamtgeschwindigkeit" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Dateien in Warteschlange" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Gesamt" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Menü:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Links hinzufügen" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Warteschlange verwalten" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Linksammler anpassen" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " Server fortsetzen/pausieren" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Server beenden" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Beenden" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Bitte benutze folgende Syntax: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Überprüfe %d Links:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Datei existiert nicht." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad wurde beendet" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Zeigt den Server-Status" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Zeigt die Warteschlange" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Zeigt den Linksammler" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Fügt Paket der Warteschlange hinzu" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Fügt Paket zum Linksammler hinzu" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Löscht Dateien aus der Warteschlange/Linksammler" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Löscht Pakete aus der Warteschlange/Linksammler" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Verschiebt Pakete aus der Warteschlange in den Linksammler oder umgekehrt" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Dateien neustarten" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Pakete neustarten" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Überprüfe Onlinestatus, funktioniert mit lokalen Containern" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Onlinestatus eines Containers prüfen" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "pausiert den Server" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "Downloads fortsetzen" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Pause/Fortsetzen" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "Server beenden" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Liste aller Befehle:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Konnte Benutzer-Konfigurationsdatei nicht schreiben" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Du benötigst py-openssl um dich zu diesem pyLoad Server verbinden zu können." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Adresse: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Port: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Benutzername: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Passwort: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Logindaten sind falsch." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Konnte keine Verbindung zu %(addr)s:%(port)s aufbauen." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Du benötigst py-openssl um dich zu diesem pyLoad Server verbinden zu können." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Befehle im interaktiven Modus werden ignoriert, wenn zusätzliche Befehle übergeben wurden." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Paket hinzufügen:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Gib einen Namen für das neue Paket ein" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Paket: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Kopiere die Links, die du hinzufügen willst." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Drücke %s wenn du fertig bist." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Hinzugefügte Links: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " Zurück zum Menü" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Pakete verwalten:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Links verwalten:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Was möchtest du verschieben?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Was möchtest du löschen?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Was möchtest du neustarten?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Wähle, was du machen möchtest oder gib eine Paketnummer an." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "löschen" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "verschieben" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "neustarten" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - vorige Seite" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - nächste Seite" diff --git a/locale/de/LC_MESSAGES/setup.po b/locale/de/LC_MESSAGES/setup.po index ac026d48c..41992ce3b 100644 --- a/locale/de/LC_MESSAGES/setup.po +++ b/locale/de/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "j" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "n" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Willkommen im pyLoad Konfigurations Assistenten." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Er wird dein System prüfen und einige Grundeinstellungen vornehmen um pyLoad ausführen zu können," -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "Der Wert in Klammern [] ist immer der Standardwert," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "Falls du sie nicht ändern möchtest oder unsicher bist, drücke einfach Enter." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Beachte: Du kannst diesen Assistenten jederzeit wieder mit dem --setup oder -s Parameter starten." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Falls du beenden willst, drücke STRG-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "um abzubrechen und ihn nicht mehr automatisch zu starten." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Wenn du für die Systemüberprüfung bereit bist, drücke Enter." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Du brauchst pycurl, sqlite und python 2.5, 2.6 oder 2.7 um pyLoad zu starten." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Bitte korrigiere das und starte pyLoad neu." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Das Setup wird sich nun beenden." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "System-Check beendet, drücke Enter um deinen Status Bericht zu sehen." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Status ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "Container decrypting" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "SSL Verbindung" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "Automatisches Captcha einlesen" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "GUI" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Weboberfläche" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "erweitertes Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Verfügbare Funktionen:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Fehlende Funktionen: " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "kein py-crypto verfügbar" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Du brauchst es, um Container Dateien zu öffnen." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "Kein SSL verfügbar" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Wird gebraucht falls du eine SSL Verbindung zu Core oder Webinterface einstellen willst." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Falls du nur lokal zugreifen willst, ist SSL überflüssig." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "keine Captcha Erkennung verfügbar" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Wird für einige Hoster als Freeuser benötigt." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "GUI nicht verfügbar" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "Die Grafische Benutzer Oberfläche." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "keine JavaScript Engine gefunden" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Du benötigst das für einige Click'n'Load links. Installiere Spidermonkey, ossp-js, pyv8 oder rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Du kannst das Setup nun abbrechen und Abhängigkeiten fixen, falls du willst." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Mit Setup fortfahren?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Möchtest du den Pfad zu den Konfigurationsdateien ändern? Jetziger ist %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Falls du pyLoad auf einem Server benutzt, oder die home Partition auf einem internen Flashspeicher liegt, wär es eine gute Idee ihn zu ändern." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Konfigurationspfad ändern?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Wollen Sie die Anmeldedaten und Grundeinstellungen festlegen?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Wird für den ersten Start empfohlen." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Grundeinstellungen vornehmen?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Willst du SSL konfigurieren?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "SSL konfigurieren?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Willst du das Webinterface konfigurieren?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Webinterface konfigurieren?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Setup erfolgreich beendet." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Drücke Enter zum beenden und starte pyLoad neu" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## System Check ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Deine python version ist zu neu, benutze python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Deine Python Version ist zu alt, benutze mindestens 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Python Version: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Ihre installierte Version %s von jinja2 scheint veraltet zu sein." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Sie können problemlos fortfahren, sollte jedoch das Webinterface nicht funktionieren," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "sollten Sie es upgrade oder deinstallieren, pyload bringt eine ausreichende jinja2 Bibliothek mit." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "JS engine" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Grundeinstellungen ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Die folgenden Anmeldedaten sind für CLI, GUI und Webinterface gültig." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Benutzername" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Externe Clients (GUI, CLI und andere) benötigen Fernzugriff, um via Netzwerk zugreifen zu können." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Solltest Du jedoch nur das Webinterface nutzen, kannst Du Ihn deaktivieren, um den Speicherverbrauch zu verringern." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Aktiviere Fernzugriff" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Sprache" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Download Ordner" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Maximale parallele Downloads" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Benutze Reconnect?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Reconnect Script Pfad" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Webinterface Setup ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Aktiviere Webinterface?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Adresse des Webservers. Falls du 127.0.0.1 oder localhost einträgst wird das Webinterface nur lokal erreichbar sein." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Adresse" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Port" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad verfügt über verschiedene Webserver, eine kurze Erklärung folgt." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Standardserver, beste Wahl wenn du nicht weißt welchen du wählen sollst." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Dieser Server unterstützt SSL und ist eine gute Alternative zu builtin." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Kann von apache, lighttpd benutzt werden. Muss konfiguriert werden, welches aber nicht sehr einfach ist." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Sehr schnelle Alternative geschrieben in C, benötigt libev und Linux-Kenntnisse." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Downloaden von: https://github.com/jonashaag/bjoern, danach kompilieren." -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "und kopiere die bjoern.so nach module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "und kopiere die bjoern.so nach pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Achtung: In manchen Fällen funktioniert der builtin Server nicht, wenn du Probleme mit dem Webinterface bemerkst." -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "komme zurück und ändere den builtin server zu threaded hier" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Server" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Einstellungen für SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Führen Sie die folgenden Kommandos im pyLoad Konfigurationsordner aus, um ein SSL-Zertifikate zu erstellen:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Falls du fertig bist und alles erfolgreich war, kannst du nun SSL aktivieren." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "SSL aktivieren?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Aktion wählen" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Erstelle/Bearbeite Nutzer" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Liste Nutzer auf" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Entferne Nutzer" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Verlassen" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Benutzer" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Setze neuen Config Pfad, momentane Konfiguration wird nicht übernommen!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Config Pfad" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Config Pfad geändert, Setup wird nun beenden, bitte starte neu um weiterzumachen." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Drücke Enter zum Beenden." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Fehler beim Setzen des Pfades für die Konfiguration: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "%s: OK" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: fehlt" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Passwort: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Passwort zu kurz. Benutze mindestens 4 Zeichen." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Passwort (bestätigen): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Passwörter stimmen nicht überein." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "ja" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "ja" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "j" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "nein" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "nein" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "n" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Ungültige Eingabe" diff --git a/locale/django.pot b/locale/django.pot index 39b39aded..277108e5b 100644 --- a/locale/django.pot +++ b/locale/django.pot @@ -17,673 +17,673 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 #, python-format msgid "New pyLoad version %s available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:127 +#: pyload/webui/app/pyload.py:127 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:195 +#: pyload/webui/app/pyload.py:195 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:264 module/webui/app/pyload.py:271 +#: pyload/webui/app/pyload.py:264 pyload/webui/app/pyload.py:271 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:509 +#: pyload/webui/app/pyload.py:509 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/el/LC_MESSAGES/django.po b/locale/el/LC_MESSAGES/django.po index f292fcb89..c7fc04fc0 100644 --- a/locale/el/LC_MESSAGES/django.po +++ b/locale/el/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Αίτηση για νέο Captcha" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Παρακαλώ διαβάστε το κείμενο στο captcha." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "Έγινε επανεκκίνηση στο pyLoad " -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "ανενεργό" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Επιτυχία" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "ενεργό" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Είστε σίγουροι ότι θέλετε να τερματίσετε το pyLoad ;" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Επανεκκίνηση συνδέσμου" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Διαγραφή συνδέσμου" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Παρακαλώ εισάγετε ένα όνομα για το πακέτο" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Παρακαλώ πατήστε στη σωστή θέση captcha" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Παρουσιάστηκε ένα σφάλμα" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Ο φάκελος είναι άδειος" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Απέτυχαν" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Δεν υπάρχουν Captchas για ανάγνωση." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Οι κωδικοί δεν ταιριάζουν" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Οι ρυθμίσεις αποθηκεύτηκαν" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Νέος φάκελος" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Είσαστε σίγουροι ότι θέλετε να κάνετε επανεκκίνηση στο pyLoad ;" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "αναμονή %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Ενεργές Μεταφορτώσεις " -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Αρχική" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Λήψεις" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Αρχεία καταγραφής" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Ρυθμίσεις" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Όνομα" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Κατάσταση" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Πληροφορία" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Μέγεθος" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Πρόοδος" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Σύνδεση" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Όνομα Χρήστη" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Κωδικός πρόσβασης" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Το όνομα χρήστη και ο κωδικός πρόσβασης δεν ταιριάζουν. Δοκιμάστε ξανά." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Για να επαναφέρετε τα στοιχεία εισόδου ή για να προσθέστε χρήστη τρέξτε: " -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Διαγραφή Τελείωσε" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Επανεκκίνηση Απέτυχε" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Φάκελος:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Κωδικός Πρόσβασης:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Επεξεργασία Πακέτου" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Επεξεργαστείτε λεπτομέρειες του πακέτου παρακάτω. " -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Το όνομα του πακέτου." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Φάκελος" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Όνομα υποφακέλου για αυτές τις μεταφορτώσεις." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Λίστα κωδικών που χρησιμοποιούνται για το unrar." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Υποβολή" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Επαναφορά" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Αποσυνδεθήκατε επιτυχής." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Διαδρομή" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "απόλυτη" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "σχετική" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "όνομα" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "μέγεθος" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "τύπος" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "τελευταία αλλαγή" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "γονικός φάκελος" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "χωρίς περιεχόμενο" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Γενικά" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Πρόσθετα" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Λογαριασμοί" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Επιλέξτε από το menu" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Πρόσθετα" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Έγκυρο εως" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Εναπομείνουσα κίνηση" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Χρόνος" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Μέγιστος αριθμός ταυτόχρονων" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Διαγραφή;" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "έγκυρο" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "άκυρο" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "ναι" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "όχι" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Προσθήκη" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Προσθήκη Λογαριασμού" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Εισάγετε τα στοιχεία του λογαριασμού σας για να χρησιμοποιήσετε τα επιπλέον χαρακτηριστικά." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Το όνομα χρήστη σας." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Ο κωδικός χρήστης για αυτόν το λογαριασμό." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Τύπος" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Χρησιμοποιήστε άλλο hoster για τον λογαριασμό σας. " -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Εκκίνηση" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "προηγ." -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "επόμ." -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Τέλος" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Νέα" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Υποστήριξη" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Σύστημα" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "έκδοση pyLoad: " -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Φάκελος Εγκατάστασης: " -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Φάκελος Ρυθμίσεων: " -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Φάκελος Λήψης: " -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Ελεύθερος Χώρος: " -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Γλώσσα: " -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Θύρα Webinterface: " -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Θύρα Απομακρυσμένης Πρόσβασης: " -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Εγκατάσταση" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Διαχείριση Αρχείων" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Προσθήκη Πακέτου " -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Επικολλήστε συνδέσμους η φορτώστε αρχείο container." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Το όνομα του νέου πακέτου." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Σύνδεσμοι" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Επικολλήστε τους συνδέσμους σας εδώ ή οποιοδήποτε κείμενο και πατήστε το πλήκτρο φίλτρου." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Φιλτράρισμα urls" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Κωδικός για Aρχείο RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Aρχείο" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Ανεβάστε αρχείο container." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Προορισμός" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Ανάλυση Captcha" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Το captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Κείμενο" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Εισάγετε το κείμενο που φαίνεται στο captcha." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Κλείσιμο" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Διεπαφή ιστού" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Υπάρχει διαθέσιμη αναβάθμιση για το pyLoad!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Τα πρόσθετα αναβαθμίστηκαν, παρακαλούμε κάντε επανεκκίνηση!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Περιμένει Captcha" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Αποσύνδεση" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Διαχείριση" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Πληροφορίες" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Παρακαλώ Συνδεθείτε!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Διακοπή" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Ακύρωση" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Λήψη:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Επανασύνδεση:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Ταχύτητα:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Ενεργό:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Επαναφόρτιση σελίδας" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "φορτώνει " -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Επιστροφή στην κορυφή" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Σταμάτημα του pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Επανεκκίνηση του pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Για να προσθέσετε χρήστες ή να αλλάξετε κωδικούς πρόσβασης χρησιμοποιήσετε: " -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Επισήμανση: Ο Διαχειριστής έχει πάντα όλα τα δικαιώματα!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Αλλαγή Κωδικού Πρόσβασης" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Διαχειριστής" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Δικαιώματα" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "αλλαγή" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Εισάγετε το παρόν και το επιθυμητό κωδικό χρήστη." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Όνομα χρήστη" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Παρόν κωδικός χρήστη" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Νέος κωδικός χρήστη" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Ο νέος κωδικός χρήστη." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Νέος κωδικός χρήστη (επανάληψη)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Παρακαλώ επαναλάβετε το νέο κωδικό χρήστη." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Δεν σας επιτρέπετε η πρόσβαση σε αυτή τη σελίδα" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Ο κατάλογος μεταφορτώσεων δεν βρέθηκε" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "απεριόριστο" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "μη διαθέσιμο" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Εκτελέστε την εντολή pyload.py -s για πρόσβαση στην εγκατάσταση." diff --git a/locale/el/LC_MESSAGES/pyLoad.po b/locale/el/LC_MESSAGES/pyLoad.po index c292ac965..cb4826ca9 100644 --- a/locale/el/LC_MESSAGES/pyLoad.po +++ b/locale/el/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Ελήφθη σήμα εγκατάλειψης" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "Το pyLoad εκτελείται ήδη με pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Αποτυχία αλλαγής ομάδας: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Αποτυχία αλλαγής χρήστη: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "φάκελος για αρχεία καταγραφής" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Σε εκκίνηση" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Χρήση γονικού καταλόγου: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "το pycrypto θα αποκωδικοποιήσει τα περιέχοντα αρχεία" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "φάκελος για προσωρινά αρχεία" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "φάκελος για κατεβασμένα" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL για ασφαλή σύνδεση" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Παρακαλώ ελέγξτε τα στοιχεία σύνδεσης με τη χρήση του ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Όλοι οι συνδεσμοι αφαιρέθηκαν" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Χρόνος κατεβάσματος: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Ελέυθερος χώρος στο δίσκο: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Ενεργοποίηση Λογαριασμών..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Ενεργοποίηση Πρόσθετων..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "Το pyLoad είναι ενεργό και εκτελείται " -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "το pyLoad επανεκκινείται" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "το pyLoad σταματάει" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Εγκατάσταση %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "δεν βρεθηκε(καν) %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "δεν διμιουργήθηκε(καν) %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "κλείσιμο..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "σφάλμα κατα το κλείσιμο" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "το pyLoad σταματήθηκε απο το Τερματικο" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "τελείωσε" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "αποσυνδεμένος" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "συνδεμένος" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "στην ουρά" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "προσπεράστηκε" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "σε αναμονή" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "προσωρινά χωρίς σύνδεση" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "ξεκινάει" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "απέτυχε" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "ματαιώθηκε" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "αποκρυπτογραφείται" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "προσαρμοσμένο" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "σε λήψη" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "σε εξέλιξη" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "άγνωστο" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Ολοκλήρωση πακέτου: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Σφάλμα απομακρυσμένου backend: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Γίνεται εκκίνηση %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Απέτυχε η φόρτωση του backend %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "αναμονή %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "Δεν βρέθηκαν πιστοποιητικά SSL." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Μπορείτε να χρησιμοποιήσετε τον threaded server που προσφέρει καλή απόδοση και ssl," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "παραδείγματα αρχείων ρυθμίσεων βρίσκονται μέσα στο φάκελο module/webui/servers" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "παραδείγματα αρχείων ρυθμίσεων βρίσκονται μέσα στο φάκελο pyload/webui/servers" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Αποτυχία χρήσης του %(server)s, δεν είναι εγκατεστημένο το πακέτο python-flup!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Χρειάζεται να κατεβλασετε και να συντάξετε το bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Μα φυσικά και χρειάζετε να είστε οικείος με τα linux και να ξέρετε πως να συντάσσεται λογισμικό" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Ο διακομιστής άλλαξε σε threaded, λόγω κάποιων γνωστών προβλημάτων απόδοσης στα windows." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Αυτός ο διακομιστής δεν προσφέρει SSL, αντί για αυτόν παρακαλώ σκεφτείτε την περίπτωση χρήσης του threaded" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Εκκίνηση του ενσωματωμένου διακομιστή web: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Εκκίνηση του threaded SSL διακομιστή web: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Εκκίνηση του threaded διακομιστή web: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Εκκίνηση του διακομιστή fastcgi: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Δεν σας επιτρέπετε η πρόσβαση σε αυτή τη σελίδα" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Ο κατάλογος μεταφορτώσεων δεν βρέθηκε" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "απεριόριστο" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "μη διαθέσιμο" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Εκτελέστε την εντολή pyload.py -s για πρόσβαση στην εγκατάσταση." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Η λήψη των κομματιών απέτυχε, επιστροφή σε κατάσταση μονής σύνδεσης | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Η λήψη ξεκινά: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Η λήψη ολοκληρώθηκε: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Στο πρόσθετο %s λείπει μια λειτουργία." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Η λήψη ματαιώθηκε: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Η λήψη επανεκκινήθηκε: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Η λήψη είναι εκτός σύνδεσης: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Η λήψη είναι προσωρινά εκτός σύνδεσης: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Η λήψη απέτυχε: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Αποτυχία σύνδεσης με το διακομιστή ή διακοπή σύνδεσης, αναμονή 1 λεπτό πριν γίνει κι άλλη προσπάθεια." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Έγινε παράλειψη στη λήψη: %(name)s εξαιτίας του %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Η ανάκτηση πληροφοριών για το %(name)s απέτυχε | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Αποτυχία ενεργοποίησης %(name)s " -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Ενεργοποιημένα πρόσθετα: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Απενεργοποίηση πρόσθετων: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Επανασύνδεση απέτυχε %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Δεν βρέθηκε αρχείο εντολών για επανασύνδεση!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Ξεκινάει η επανασύνδεση" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Αποτυχία εκτέλεσης αρχείου εντολών επανασύνδεσης!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Επανασυνδέθηκε, νέα διέυθυνση IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Δεν έχει απομείνει αρκετός χώρος στην συσκευή" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Αποτυχία σύνδεσης με τον λογαριασμό %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Λάθος κωδικός" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "Στον λογαριασμό %s δεν έχει απομείνει αρκετή κίνηση δεδομένων, θα γίνει πάλι έλεγχος σε 30 λεπτά" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "Ο λογαριασμός %s έχει λήξει, θα γίνει ξανά έλεγχος σε 1 ώρα" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Φτάσατε στο μέγιστο όριο λήψεων" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Σφάλμα κατά την εισαγωγή %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Δεν φορτώθηκε κάποιος hoster" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Ενεργοποιήστε τις απευθείας λήψεις στον Bitshare λογαριασμό σας" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Απαιτείται πιστοποίηση (όνομα χρήστη:κωδικός)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Παρακαλώ εισάγετε το λογαριασμό σας %s ή απενεργοποιήστε αυτό το πρόσθετο" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Υπήρχε κώδικας HTML στο αρχείο που μεταφορτώθηκε (%s)...πρόβλημα ανακατεύθυνσης ίσως; Η μεταφόρτωση θα επανεκκινήσει." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Το αρχείο είναι προσωρινά μη διαθέσιμο" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: αναμονή μεταξύ των λήψεων %d s." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: αναμονή για captcha %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Το ληφθέν αρχείο ήταν άδειο" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "Το κλειδί API δεν είναι έγκυρο" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Δεν απέμεινε αρκετή κίνηση δεδομένων" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Υπέρβαση ορίου κίνησης δεδομένων" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Traffic Share (απευθείας λήψη)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Κατεβάζετε ήδη από αυτή τη διεύθυνση ΙΡ, αναμονή 60 δευτερολέπτων" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Μη έγκυρος κώδικας , η λήψη θα γίνει επανεκκίνηση" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: Δεν υπάρχουν ελέυθερα slots" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Χρειάζεστε έναν λογαριασμό premium για αυτό το αρχείο" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Το όνομα αρχείου αναφέρθηκε ως μη έγκυρο" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Σφάλμα ταυτόχρονης λήψης, αναμονή 60s." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Δεν έχετε συνδεθεί." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Η αποκρυπτογράφηση απέτυχε" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Η διεύθυνση URL δεν παρείχε κανένα κλειδί αρχείου" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Κωδικός σφάλματος:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Το αρχείο δεν υπάρχει" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Τα πρόσθετα έχουν αναβαθμιστεί, παρακαλώ επανεκκινήστε το pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Τα πρόσθετα αναβαθμίστηκαν και ξαναφορτώθηκαν" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Δεν υπάρχουν αναβαθμίσεις για τα πρόσθετα" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Δεν βρέθηκε αναβάθμιση για το pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Είναι διαθέσιμη μια καινούρια έκδοση (%s) του pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Κατεβάστε απο εδώ: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Αδυναμία σύνδεσης στον κεντρικό διακομιστή για έλεγχο ενημερώσεων" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Νέα έκδοση του%(type)s | %(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Σφάλμα κατά την αναβάθμιση του %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Ασυμφωνία έκδοσης" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Η λήψη ολοκληρώθηκε: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Αίτηση για νέο Captcha: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Απάντηση με 'c %s κείμενο για το captcha'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Παρακαλώ προσθέστε πρώτα τον λογαριαμό σας στο premium.to και επανεκκινήστε το pyLoad" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Προστέθηκε το %s από HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "Δεν έχει εγκατασταθεί το %s" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Αποτυχία ενεργοποίησης του %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Ενεργοποιήθηκε" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Δεν έχουν ενεργοποιηθεί πρόσθετα για αποσυμπίεση" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Το πακέτο %s έχει δρομολογηθεί για αποσυμπίεση αργότερα" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Έλεγχος του πακέτου %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Αποσυμπίεση στο %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Δεν βρέθηκαν αρχεία για αποσυμπίεση" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "αποσυμπιέζεται" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Προστατευμένο με κωδικό" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Λάθος κωδικός" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Διαγραφή %s αρχείων" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Η αποσυμπίεση τελείωσε" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Σφάλμα στο συμπιεσμένο αρχείο" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "Ασυμφωνία CRC" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Άγνωστο Σφάλμα" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Ο ορισμός του Χρήστη και της Ομάδας απέτυχαν" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: Η θύρα 9666 χρησιμοποιείται ήδη" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "απομένουν %s πόντοι" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Αποτυχία αποστολής απάντησης." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Ο λογαρισμός σας CaptchaTrader δεν έχει αρκετούς πόντους" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Η λίστα Crypter δεν βρέθηκε" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Η λίστα Crypter είναι κενή" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Η λήψη ολοκληρώθηκε: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Νέο CaptchaID από τη μεταφόρτωση: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Ο λογαριασμός σας Captcha 9kw.eu δεν έχει αρκετούς πόντους" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Εγκατεστημένα αρχεία εντολών για το %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Το αρχείο εντολών δεν είναι εκτελέσιμο:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Σφάλμα στο %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Ο λογαριασμός στο ExpertDecoders δεν έχει αρκετούς πόντους" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Παρακαλώ προσθέστε πρώτα τον λογαριαμό σας στο rehost.to και επανεκκινήστε το pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Παρακαλώ προσθέστε πρώτα έναν έγκυρο λογαριαμό στο premiumize.me και επανεκκινήστε το pyLoad." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "απομένουν %d πόντοι" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Το PIL και το tesseract δεν είναι εγκαταστημένα και δεν υπάρχει πρόγραμμα-πελάτης συνδεμένος για αποκρυπτογράφηση captcha" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Η ρύθμιση χρηστών και ομάδων απέτυχε: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Προστέθηκαν %(count)d σύνδεσμοι στο πακέτο #%(package)d " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Καμία μηχανή js δεν βρέθηκε, παρακαλώ εγκαταστήσετε μια απο τις παρακάτω Spidermonkey, ossp-js, pyv8, rhino " diff --git a/locale/el/LC_MESSAGES/pyLoadCli.po b/locale/el/LC_MESSAGES/pyLoadCli.po index 52d49be62..bec3abe08 100644 --- a/locale/el/LC_MESSAGES/pyLoadCli.po +++ b/locale/el/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "Διασύνδεση Γραμμής Εντολών" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s Λήψεις:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "Ταχύτητα:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "Μέγεθος:" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "Ολοκλήρωση σε: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "αναμονή: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Κατάσταση:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "σε παύση" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "εκτελείται" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "συνολική ταχύτητα" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Αρχεία στην ουρά" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Σύνολο" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr " Μενού:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Προσθήκη Συνδέσμων" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Διαχείριση Ουράς" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Διαχείριση Συλλέκτη " -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " Ενεργοποίηση/Αδρανοποίηση" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Τερματισμός Διακομιστή" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Έξοδος" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Χρήση με: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Έλεγχος %d συνδέσμων:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Το αρχείο δεν υπάρχει." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "Το pyLoad τερματίστηκε" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Εμφανίζει την κατάσταση του διακομιστή" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Εμφανίζει τις λήψεις σε ουρά" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Εμφανίζει τις λήψεις στο συλλέκτη" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Προσθέτει το πακέτο στην ουρά" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Προσθέτει το πακέτο στο συλλέκτη" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Διαγραφή αρχείου από Ουρά/Συλλεκτη" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Διαγραφή πακέτων από Ουρά/Συλλέκτη" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Μετακίνηση πακέτων από την Ουρά στο Συλλέκτη και αντίστροφα" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Επανεκκίνηση αρχείων" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Επανεκκίνηση πακέτων" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Έλεγχος κατάστασης σύνδεσης. Λειτουργεί με τοπικά container" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Έλεγχος κατάστασης σύνδεσης ενός αρχείου container" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Παύση του διακομιστή" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "συνέχιση λήψεων" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Εναλλαγή παύσης/εκτέλεσης" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "τερματισμός διακομιστή" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Λίστα εντολών:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Αδυναμία εγγραφής του αρχείου ρυθμίσεων του χρήστη" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Απαιτείται το py-openssl για σύνδεση σε αυτόν το pyLoad Core." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Διεύθυνση:" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Θύρα:" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Όνομα χρήστη:" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Κωδικός χρήστη:" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Τα στοιχεία σύνδεσης είναι λάθος." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Αδυναμία σύνδεσης στη διεύθυνση %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Απαιτείται το py-openssl για σύνδεση σε αυτόν τον pyLoad Core." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "H αλληλεπιδραστική λειτουργία αγνοήθηκε εφόσον δώσατε κάποιες εντολές." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Προσθήκη Πακέτου:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Εισάγετε όνομα για το καινούργιο πακέτο" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Πακέτο: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Ανάλυση των συνδέσμων που θέλετε να προσθέσετε. " -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Πληκτρολογείστε %s όταν τελειώσετε. " -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Σύνδεσμοι που προστέθηκαν:" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "επιστροφή στο αρχικό μενού" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Διαχείριση πακέτων:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Διαχείριση Συνδέσμων:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Τι θέλετε να μετακινήσετε;" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Τί θέλετε να διαγράψετε;" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Τί θέλετε να επανεκκινήσετε;" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Επιλέξτε ενέργεια ή πληκτρολογήστε αριθμό πακέτου." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "διαγραφή" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "μετακίνηση" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "επανεκκίνηση" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - προηγούμενο" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - επόμενο" diff --git a/locale/el/LC_MESSAGES/setup.po b/locale/el/LC_MESSAGES/setup.po index 0f9903201..0a5ba97a6 100644 --- a/locale/el/LC_MESSAGES/setup.po +++ b/locale/el/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Καλώς ήλθατε στο Βοηθό Ρύθμισης του pyLoad" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Θα γίνει έλεγχος και βασική ρύθμιση του συστήματός σας, ώστε να εκτελεστεί το pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "Η τιμή στις αγκύλες [] είναι πάντα η προεπιλεγμένη τιμή," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "σε περίπτωση που δεν επιθυμείτε αλλαγή ή αμφιβάλλετε για την επιλογή σας, απλά πατήστε enter. " -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Μην ξεχνάτε: Μπορείτε πάντα να εκτελέσετε ξανά τον Βοηθό, εισάγοντας τη παράμετρο --setup ή -s, κατά την εκτέλεση του pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Αν αντιμετωπίσετε προβλήματα με το Βοηθό, πατήστε CTRL-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "για να εγκαταλείψετε και να αποτρέψετε την αυτόματη εκτέλεσή του." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Όταν είστε έτοιμος για τον έλεγχο του συστήματος, πατήστε enter." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Απαιτούνται τα pycurl, sqlite και python 2.5, 2.6 ή 2.7 για να εκτελέσετε το pyLoad." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Παρακαλώ κάνετε τις διορθώσεις και εκτελέστε ξανά το pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Η εγκατάσταση θα τερματιστεί." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Ο έλεγχος του συστήματος ολοκληρώθηκε, πατήστε το enter για να δείτε τα αποτελέσματα." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Κατάσταση ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "αποκρυπτογράφηση περιεχόμενου" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "σύνδεση ssl" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "αυτόματη αποκρυπτογράφηση captcha" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Διεπαφή ιστού" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Χαρακτηριστικά διαθέσιμα:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Χαρακτηριστικά που λείπουν:" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "δεν είναι διαθέσιμο το py-crypto" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Αυτό απαιτείται αν θέλετε να αποκρυπτογραφήσετε αρχεία container." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "δεν είναι διαθέσιμο το SSL" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Αυτό απαιτείται για την πραγματοποίηση ασφαλής σύνδεσης με τον πυρήνα ή το Webιnterface." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Αν θέλετε να έχετε πρόσβαση μόνο τοπικά στο pyLoad, το ssl δεν είναι χρήσιμο." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "δεν υπάρχει διαθέσιμη αναγνώριση Captcha" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Χρειάζεται μόνο από μερικούς διακομιστές διαμοιρασμού αρχείων και σαν δωρεάν χρήστης." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "Το GUI δεν είναι διαθέσιμο" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "Το Γραφικό Περιβάλλον Χρήστη." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "δεν βρέθηκε μηχανή JavaScript" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Θα το χρειαστείτε για μερικούς συνδέσμους Click'N'Load. Εγκαταστήστε Spidermonkey, ossp-js, pyv8 ή rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Αν θέλετε μπορείτε να ακυρώσετε την εγκατάσταση τώρα και να διορθώσετε κάποιες εξαρτήσεις." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Συνέχιση με την εγκατάσταση;" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Θέλετε να αλλάξετε τη διαδρομή του αρχείου αποθήκευσης των ρυθμίσεων; Η τρέχουσα είναι %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Αν χρησιμοποιήτε το pyLoad σε εξυπηρετητή ή το διαμέρισμα home βρίσκεται σε εσωτερική μνήμη flash, θα ήταν καλή ιδέα να το αλλάξετε." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Αλλαγή διαδρομής αποθήκευσης αρχείου ρυθμίσεων;" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Θέλετε να ορίσετε στοιχεία σύνδεσης και να κάνετε τις βασικές ρυθμίσεις;" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Αυτό συνιστάται για την πρώτη εκτέλεση." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Δημιουργία βασικής ρύθμισης;" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Θέλετε να ρυθμίσετε το SSL;" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Ρύθμιση SSL;" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Θέλετε να ρυθμίσετε το περιβάλλον Web;" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Ρύθμιση του Web Interface;" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Η εγκατάσταση ολοκληρώθηκε με επιτυχία." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Πατήστε Enter για να εξέλθετε και να επανεκκινήσετε το pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Έλεγχος Συστήματος ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Η έκδοση της python που χρησιμοποιείτε είναι πολύ νέα, παρακαλώ χρησιμοποιήστε Python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Η έκδοση της python που χρησιμοποιείτε είναι πολύ παλιά, παρακαλώ χρησιμοποιήστε τουλάχιστον Python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Έκδοση Python: ΟΚ" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Η έκδοση %s του jinja2 που έχετε εγκατεστημένη φαίνεται πολύ παλιά." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Μπορείτε να συνεχίστε, αλλά αν δεν δουλεύει το Web Interface," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "παρακαλώ αναβαθμίστε το ή απεγκαταστήστε το, το pyLoad συμπεριλαμβάνει μια επαρκή βιβλιοθήκη jinja2." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "Μηχανή JS" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Βασική Εγκατάσταση ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Τα ακόλουθα στοιχεία σύνδεσης είναι έγκυρα για τη Γραμμή Εντολών, το GUI και το περιβάλλον Web." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Όνομα Χρήστη" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Οι εξωτερικοί πελάτες (για το GUI, τη Γραμμή εντολών ή άλλο) χρειάζονται απομακρυσμένη πρόσβαση για να λειτουργήσουν μέσω δικτύου." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Όμως, αν θέλετε να να χρησιμοποιήσετε μονο το Web Interface, μπορείτε να το απενεργοποιήσετε για να γλυτώσετε RAM." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Ενεργοποίηση απομακρυσμένης πρόσβασης" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Γλώσσα" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Φάκελος μεταφορτώσεων" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Μέγιστος αριθμός ταυτόχρονων λήψεων" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Χρήση Επανασύνδεσης;" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Τοποθεσία αρχείου εντολών επανασύνδεσης" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Εγκατάσταση Περιβάλλοντος Web ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Ενεργοποίηση περιβάλλοντος Web;" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Διεύθυνση που θα \"ακούει\". Αν χρησιμοποιήσετε 127.0.0.1 ή localhost, το περιβάλλον Web θα είναι προσβάσιμο μόνο τοπικά." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Διεύθυνση" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Θύρα" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "Το pyLoad προσφέρει αρκετoύς διακομιστές υποστήριξης. Ακολουθεί σύντομη επεξήγηση." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Προεπιλεγμένος διακομιστής, η καλύτερη επιλογή αν δεν γνωρίζετε ποιον να διαλέξετε." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Αυτός ο διακομιστής υποστηρίζει SSL και είναι καλή εναλλακτική λύση σε σχέση με τον προεπιλεγμένο." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Μπορεί να χρησιμοποιήθεί από τον apache και το lighttpd, απαιτείται παραμετροποίηση, η οποία δεν είναι πολύ εύκολη." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Πολύ γρήγορη εναλλακτική λύση, γραμμένη σε C, απαιτεί libev και γνώσεις linux." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Κατεβάστε το από εδώ: https://github.com/jonashaag/bjoern, κάντε το compile," -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "και αντιγράψτε το bjoern.so στο module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "και αντιγράψτε το bjoern.so στο pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Προσοχή: Σε σπάνιες περιπτώσεις ο προεπιλεγμένος διακομιστής δεν δουλεύει. Αν παρατηρήσετε προβλήματα με το Web Interface," -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "επιστρέψτε εδώ και αλλάξτε τον με τον threaded." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Διακομιστής" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Εγκατάσταση SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Εκτελέστε αυτές τις εντολές από τον φάκελο παραμετροποίησης του pyLoad για να δημιουργήσετε πιστοποιητικά SSL:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Αν τελειώσατε και όλα πήγαν καλώς, τώρα μπορείτε να ενεργοποιήσετε το SSL." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Ενεργοποίηση SSL;" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Επιλέξτε ενέργεια" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Δημιουργία/Επεξεργασία χρήστη" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Λίστα χρηστών" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Διαγραφή χρήστη" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Τερματισμός" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Χρήστες" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Ορισμός καινούριας διαδρομής ρυθμίσεων, δεν θα μεταφερθούν οι τρέχουσες ρυθμίσεις!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Διαδρομή αρχείου ρυθμίσεων" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Η διαδρομή ρυθμίσεων ορίστηκε, η εγκατάσταση τώρα θα κλείσει, παρακαλώ κάντε επανεκκίνηση για να συνεχίστε." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Πατήστε Enter για έξοδο." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Ο ορισμός της διαδρομής ρυθμίσεων απέτυχε: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: λείπει" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Κωδικός χρήστη:" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Ο κωδικός είναι πολύ μικρός. Χρησιμοποιήστε τουλάχιστον 4 χαρακτήρες." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Κωδικός (ξανά):" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Οι κωδικοί δεν ταιριάζουν" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "ναι" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "σωστό" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "όχι" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "λάθος" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Λανθασμένη εισαγωγή" diff --git a/locale/eo/LC_MESSAGES/django.po b/locale/eo/LC_MESSAGES/django.po index 3758d96c9..beb7646ec 100644 --- a/locale/eo/LC_MESSAGES/django.po +++ b/locale/eo/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/eo/LC_MESSAGES/pyLoad.po b/locale/eo/LC_MESSAGES/pyLoad.po index a4012d712..23f1b78f1 100644 --- a/locale/eo/LC_MESSAGES/pyLoad.po +++ b/locale/eo/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/eo/LC_MESSAGES/pyLoadCli.po b/locale/eo/LC_MESSAGES/pyLoadCli.po index d098a93a2..10d313833 100644 --- a/locale/eo/LC_MESSAGES/pyLoadCli.po +++ b/locale/eo/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/eo/LC_MESSAGES/setup.po b/locale/eo/LC_MESSAGES/setup.po index 259ad8543..6eb3fbddd 100644 --- a/locale/eo/LC_MESSAGES/setup.po +++ b/locale/eo/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index 4c928537a..dd1a7f293 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Solicitud de nuevo Captcha" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Por favor lee el texto en el captcha." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad se reinició" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "apagado" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Éxito" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "encendido" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "¿Estás seguro de que quieres salir de pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Reiniciar enlace" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Borrar enlace" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Por favor, introduce un nombre de paquete." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Por favor, haz clic en la posición del captcha correcto." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Se produjo un error." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "La carpeta está vacía" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Fallidos" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "No hay captchas." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Las contraseñas no coinciden." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Ajustes guardados." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Nueva carpeta" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "¿Estás seguro de que quieres reiniciar pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "esperando a %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Descargas activas" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Inicio" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "Cola" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "Recolector" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Descargas" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Registros" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Configuración" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Nombre" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Estado" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Información" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Tamaño" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Progreso" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Iniciar sesión" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Usuario" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Contraseña" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Tu nombre de usuario y contraseña no coinciden. Por favor inténtalo de nuevo." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Para reiniciar tus datos de inicio de sesión o añadir un usuario ejecuta:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Borrar terminados" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Reiniciar Fallidos" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Carpeta:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Contraseña:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Editar paquete" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Editar los detalles del paquete siguiente." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Nombre del paquete." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Carpeta" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Nombre de la subcarpeta para estas descargas." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Lista de contraseñas usadas para unrar." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Enviar" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Reiniciar" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Se ha cerrado sesión correctamente." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Ruta" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absoluta" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relativa" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "nombre" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "tamaño" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "tipo" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "última modificación" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "directorio padre" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "sin contenido" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "General" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Complementos" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Cuentas" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Elige una sección del menú" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Plugin" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "Premium" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Válido hasta" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Tráfico restante" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Tiempo" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Máx. en Paralelo" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "¿Borrar?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "válido" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "inválido" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "sí" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "no" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Añadir" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Agregar cuenta" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Introduce los datos de tu cuenta para usar características premium." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Tu nombre de usuario." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "La contraseña para esta cuenta." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Tipo" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Elige el proveedor de alojamiento para tu cuenta." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Iniciar" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "anterior" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "siguiente" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Fin" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Novedades" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Soporte" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Sistema" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "Python:" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "S.O.:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "versión de pyLoad:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Carpeta de instalación:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Carpeta de configuración:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Carpeta de descarga:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Espacio Libre:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Idioma:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Puerto de interfaz web:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Puerto de interfaz remota:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Configuración" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Administrador de archivos" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Añadir paquete" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Pega tus enlaces o carga un archivo contenedor." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Nombre del nuevo paquete." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Enlaces" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Pega tus enlaces o cualquier texto aquí y pulsa el botón filtrar." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtrar urls" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Contraseña para el archivo-RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Archivo" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Cargar contenedor." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Destino" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Leyendo captcha" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "Captcha" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "El captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Texto" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Introduzca el texto en el captcha." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Cerrar" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Interfaz web" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "¡Actualización de pyLoad disponible!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Plugins actualizados, ¡por favor reinicia!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Esperando captcha" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Salir" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administrar" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Información" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "¡Por favor, inicie sesión!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Parar" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Cancelar" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Descarga:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Reconectar:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Velocidad:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Activo:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Recargar" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "cargando" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Volver al principio" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Salir de pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Reiniciar pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Para añadir un usuario o cambiar contraseñas usa:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Importante: ¡El usuario Admin tiene siempre todos los permisos!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Cambiar Contraseña" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Admin" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Permisos" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "cambiar" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Introduce tu contraseña actual y la deseada." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Usuario" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Contraseña actual" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Nueva contraseña" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "La nueva contraseña." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Nueva contraseña (repetir)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Por favor, repite la nueva contraseña." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "No tienes permiso para acceder a esta página." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "No se encuentra el directorio de descarga." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "ilimitado" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "no disponible" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Ejecuta pyload.py -s para acceder a la instalación." diff --git a/locale/es/LC_MESSAGES/pyLoad.po b/locale/es/LC_MESSAGES/pyLoad.po index 6f94da4ff..bd029162f 100644 --- a/locale/es/LC_MESSAGES/pyLoad.po +++ b/locale/es/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Señal de salida recibida" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad ya está ejecutándose con pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Cambio de grupo fallido: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Cambio de usuario fallido: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "carpeta para los registros" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Iniciando" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Usando directorio de inicio: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto va a decodificar archivos contenedores" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "carpeta para archivos temporales" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "carpeta de descargas" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL para conexión segura" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Moviendo la configuración antigua de usuario a la BD" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Por favor, comprueba tus datos de inicio de sesión con ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Se han eliminado todos los enlaces" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Tiempo de descarga: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Espacio libre: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Activando Cuentas..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Activando Plugins..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad está funcionando" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "reiniciando pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad se cierra" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Instalar %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "no se pudo encontrar %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "no se pudo crear %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "apagando..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "ha ocurrido un error mientras se apagaba" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "pyload terminado desde el Terminal" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "El archivo de la base de datos fue eliminado por ser de una versión incompatible." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "El archivo de la base de datos NO pudo convertirse." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "La base de datos se convirtió de la v2 a la v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "La base de datos se convirtió de la v3 a la v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Convirtiendo la BD Django antigua" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "Terminado" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "sin conexión" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "en línea" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "en cola" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "omitido" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "esperando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "temp. sin conexión" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "comenzando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "fallido" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "abortado" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "descifrando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "personalizado" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "descargando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "procesando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "desconocido" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Paquete terminado: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Usando SSL ThriftBackend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Error de backend remoto: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Iniciando %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Fallo al cargar servidor %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "esperando a %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "Certificados SSL no encontrados." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Lo sentimos, ya no admitimos iniciar %s directamente en pyLoad" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Puedes utilizar el servidor con hilos que ofrece un buen rendimiento y ssl," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "por supuesto puedes usar aún tu %s existente con el servidor fastcgi de pyLoad" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "las configuraciones de ejemplo se encuentran en el directorio module/webui/servers" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "las configuraciones de ejemplo se encuentran en el directorio pyload/webui/servers" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "¡No puedes usar %(server)s, python-flup no está instalado!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Error importando servidor ligero: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Debes descargar y compilar bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Copia el módulo boern.so a la carpeta module/lib o usa la instalación setup.py" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Copia el módulo boern.so a la carpeta pyload/lib o usa la instalación setup.py" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Por supuesto debes estar familiarizado con linux y saber cómo compilar software" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Servidor en modo threaded, debido a problemas de rendimiento en Windows." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Este servidor no ofrece SSL, considera el usar el servidor con hilos en su lugar" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Iniciando servidor web incorporado: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Iniciando servidor web SSL con hilos : %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Iniciando servidor web con hilos: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Iniciando servidor fastcgi: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Iniciando servidor web ligero (bjoern): %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "No tienes permiso para acceder a esta página." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "No se encuentra el directorio de descarga." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "ilimitado" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "no disponible" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Ejecuta pyload.py -s para acceder a la instalación." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Descarga por trozos fallida, recurro a una única conexión | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Iniciando descarga: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Descarga finalizada: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Plugin %s no encuentra una función." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Descarga abortada: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Descarga reiniciada: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Descarga está fuera de servicio: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "La descarga está temporalmente fuera de servicio: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Descarga fallida: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "No pude conectar al servidor o conexión reiniciada, esperando 1 minuto y reintentando." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Descarga omitida: %(name)s debido a %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Descifrado comienza en: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Descifrado fallido: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Reintentando %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Obtención de información para %(name)s fallida | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Error ejecutando enlaces: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Falló la activación de %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Plugins activos: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Plugins desactivados: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Reconexión Fallida: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "¡Script de reconexión no encontrado!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Iniciando reconexión" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "¡Fallo al ejecutar script de reconexión!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Reconectado, nueva dirección IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "No hay suficiente espacio libre en el dispositivo" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "No pude iniciar sesión con cuenta %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Contraseña Incorrecta" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "La hora %s tiene un formato incorrecto, use: 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "La cuenta %s no tiene tráfico suficiente, se comprobará otra vez en 30min" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "La cuenta %s ha expirado, comprobando de nuevo en 1 hora" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Limite de descargas alcanzado" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s tiene un patrón inválido." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Error importando %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "No se cargó ningún proveedor" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Activa descarga directa en tu cuenta de Bitshare" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "LinkList no puede ser limpiado." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Ajustes de cuenta eliminados, debido al nuevo formato de la configuración." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Autorización requerida (usuario:contraseña)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Por favor, introduce tu cuenta de %s o desactiva este plugin" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Había Código HTML en el archivo Descargado (%s)... ¿error de redireccionamiento? La Descarga se reiniciará." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Archivo no disponible temporalmente" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: esperando entre descargas %d s." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: esperando captcha %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "El archivo descargado estaba vacío" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "Clave de API inválida" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: No hay suficiente tráfico" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Tráfico excedido" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Tráfico compartido (descarga directa)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Ya estás descargando desde esta dirección IP, esperando 60 segundos" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Código de autenticación inválido, la descarga se reiniciará" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: No quedan espacios disponibles" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Necesitas una cuenta premium para este archivo" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Nombre de archivo inválido" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Error con descargas en paralelo, esperando 60s." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "No has iniciado sesión." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Error de descifrado" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "No se proporcionó archivo de clave en la URL" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Código de error:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "El archivo no existe." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Los plugins se han actualizado, por favor reinicie pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Plugins actualizados y cargados de nuevo" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "No hay disponibles actualizaciones de plugins" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "No hay actualizaciones de pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Nueva versión %s de pyLoad disponible ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Descarguela aquí: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "No se puede conectar con el servidor para actualizar" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Nueva versión de %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Error mientras se actualizaba %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "No coincide la versión" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Descarga finalizada: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Nueva Petición de Captcha: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Conteste con 'c %s texto al captcha'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Por favor, añada primero su cuenta premium.to y reinicie pyLoad" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Añadido %s desde HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "%s no instalado" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "No se puede activar %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Activado" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "No se ha activado ningún plugin de extracción" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Paquete %s encolado para su posterior extracción" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Comprobar paquete %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Extraer a %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "No se encontraron archivos para extraer" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "extrayendo" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Protegido con contraseña" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Contraseña errónea" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Borrando archivos %s" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Extracción finalizada" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Error de Archivo" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "El CRC no coincide" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Error Desconocido" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Error de configuración de usuario y grupo" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: Puerto 9666 ya está en uso" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s créditos restantes" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "No se ha podido enviar la respuesta." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Su cuenta de CaptchaTrader no tiene créditos suficientes" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "No se ha encontrado lista de cifradores" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "La lista de cifradores está vacía" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Descarga finalizada: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Nuevo CaptchaID desde carga: %s: %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Su Cuenta Captcha 9kw.eu no tiene suficientes créditos" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Código instalado para %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Código no ejecutable:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Error en %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Su cuenta de ExpertDecoders no suficientes créditos" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Por favor, añada primero su cuenta rehost.to y reinicie pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Por favor, agrega primero una cuenta válida de premiumize.me y reinicia pyLoad." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d créditos restantes" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil y tesseract no están instalados y no hay cliente conectado para descifrar captcha" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "No se obtuvieron resultados para el captcha en el tiempo asignado de ninguno de los plugins." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Configuración de usuario y grupo fallida: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "No hay cliente conectado para descifrar el captcha" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Paquete %(name)s agregado que contiene %(count)d enlaces" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Agregados %(count)d enlaces al paquete #%(package)d " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "No se detectó ningún motor de js, por favor instale Spidermonkey, ossp-js, pyv8 o rhino" diff --git a/locale/es/LC_MESSAGES/pyLoadCli.po b/locale/es/LC_MESSAGES/pyLoadCli.po index 1e9fc0af6..527f03c05 100644 --- a/locale/es/LC_MESSAGES/pyLoadCli.po +++ b/locale/es/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Interfaz de Línea de Comandos" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s Descargas:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Velocidad: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Tamaño: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Finalizado el: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "esperando: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Estado:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "pausado" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "ejecutando" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "Velocidad total" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Ficheros en cola" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Total" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Menú:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Añadir enlaces" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Administrar Cola" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Administrar Recolector" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " Detener/Reanudar Servidor" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Parar servidor" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Salir" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Por favor usa esta sintaxis: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Comprobando %d enlace(s):" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "El archivo no existe." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad ha finalizado" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Muestra el estado del servidor" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Muestra las descargas en cola" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Muestra las descargas en recolector" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Agregar paquetes a la cola" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Agrega un paquete al recolector" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Borrar Archivos de la Cola/Recolector" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Borrar Paquetes de la Cola/Recolector" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Mover Paquetes de la Cola al Recolector o viceversa" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Reiniciar archivos" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Reiniciar paquetes" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Comprobar el estado en-linea, trabaja con el contenedor local" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Comprueba el estado en-linea de un contenedor" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Pausar el servidor" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "continuar descargas" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Alternar detener/reanudar" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "parar servidor" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Lista de comandos:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "No se puede escribir el archivo de configuración del usuario" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Necesitas py-openssl para conectar a este Núcleo pyLoad." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Dirección: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Puerto: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Usuario: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Contraseña: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Los datos de inicio de sesión son incorrectos." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "No se puede establecer la conexión a %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Necesitas py-openssl para conectar a este núcleo pyLoad." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Modo interactivo ignorado ya que pasaste algunas órdenes." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Agregar Paquete:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Introduce un nombre para el paquete nuevo" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Paquete: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Analizar los enlaces que quieres añadir." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Teclea %s cuando acabes." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Enlaces añadidos: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " volver al menú principal" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Administrar Paquetes:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Administrar Enlaces:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "¿Qué quieres mover?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "¿Qué quieres borrar?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "¿Qué quieres reiniciar?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Elige lo que quieres hacer o introduce el número de paquete." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "borrar" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "mover" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "reiniciar" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - anterior" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - siguiente" diff --git a/locale/es/LC_MESSAGES/setup.po b/locale/es/LC_MESSAGES/setup.po index 9595559bb..223755467 100644 --- a/locale/es/LC_MESSAGES/setup.po +++ b/locale/es/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "s" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Bienvenido al Asistente de Configuración de pyLoad." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Se revisará tu sistema y se hará una configuración básica para ejecutar pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "El valor entre corchetes [] siempre es el valor por defecto," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "en caso que no quieras cambiarlo o no estés seguro de que opción elegir, solo presiona entrar." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "No lo olvides: siempre puedes volver a ejecutar este asistente con el parámetro --setup ó -s, cuando inicies pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Si tienes algún problema con el asistente presiona Ctrl-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "para abortar y no permitirle volver a iniciarse automáticamente con pyload.py ." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Cuando estés listo para la revisión del sistema, presiona entrar." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Necesitas pycurl, sqlite y python 2.5, 2.6 ó 2.7 para ejecutar pyLoad." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Por favor corrige esto y vuelve a ejecutar pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "El asistente de la instalación se cerrará." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "La revisión del sistema ha finalizado, presiona entrar para ver el informe de estado." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Estado ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "descifrando contenedor" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "conexión SSL" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "descifrado automático de captcha" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "GUI" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Interfaz web" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "extensión Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Características disponibles:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Características no disponibles: " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "py-crypto no disponible" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Necesario si quieres descifrar archivos contenedores." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL no disponible" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Esto es necesario si quieres establecer una conexión segura con el núcleo o la interfaz web." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "SSL no es útil si solamente quieres acceder a pyLoad localmente." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "reconocimiento de captcha no disponible" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Solo necesario para algunos servidores y como usuario gratuito." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "GUI no disponible" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "El Interfaz de Usuario Gráfica." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "motor de JavaScript no encontrado" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Necesario para algunos enlaces Click'N'Load. Instala Spidermonkey, ossp-js, pyv8 o rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Puedes cancelar el asistente ahora y corregir algunas dependencias si quieres." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "¿Desea continuar con el asistente?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "¿Quiere cambiar la ruta de configuración? Actualmente es %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Si usas pyLoad en un servidor o la partición primaria reside en una memoria flash interna, puede ser buena idea cambiarla." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "¿Cambiar la ruta de configuración?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "¿Quiere configurar los datos de acceso y la configuración básica?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Esto se recomienda en la primera ejecución." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "¿Realizar la configuración básica?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "¿Quiere configurar SSL?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "¿Configurar SSL?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "¿Quiere configurar la interfaz web?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "¿Configurar la interfaz web?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Configuración finalizada con éxito." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Pulse entrar para salir y reiniciar pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Revisión del sistema ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Tu versión de python es demasiado nueva, por favor usa Python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Tu versión de python es demasiado antigua, por favor usa al menos Python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Versión de Python: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Tu versión %s jinja2 instalada parece demasiado antigua." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Puedes continuar de manera segura aunque la interfaz web no funciona," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "por favor actualícela o desinstálela, pyLoad incluye una biblioteca jinja2 suficiente." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "Motor JS" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Configuración básica ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Los siguientes datos de acceso son válidos para CLI, GUI e interfaz web." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Usuario" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Los clientes externos (GUI, CLI u otros) necesitan acceso remoto para trabajar a través de la red." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "No obstante, si sólo quieres utilizar interfaz web puedes deshabilitarlo para ahorrar ram." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Activar acceso remoto" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Idioma" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Directorio de descargas" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Máximas descargas paralelas" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "¿Usar reconectar?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Ubicación del script de reconexión" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Configuración de la Interfaz Web ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "¿Activar interfaz web?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Dirección de escucha, si usas 127.0.0.1 o localhost, la interfaz web solo podrá ser accesible localmente." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Dirección" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Puerto" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "lapyLoad ofrece varios backends de servidor después de una breve explicación." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Servidor por defecto, la mejor opción si no sabes cual elegir." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Este servidor ofrece SSL y es una buena alternativa al integrado." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Puede ser usado por apache, lighttpd, requiere que lo configures, lo cual no es una tarea fácil." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Una alternativa muy rápida escrita en C, requiere libev y conocimientos de linux." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Obtenlo de aquí: https://github.com/jonashaag/bjoern, compílalo" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "y copia bjoern.so a module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "y copia bjoern.so a pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Atención: En algunos casos raros el servidor integrado no funciona, si notas problemas con la interfaz web" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "vuelve aquí y cambia el servidor integrado por el servidor con hilos." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Servidor" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Configuración de SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Ejecuta estos comandos desde la carpeta de configuración pyLoad para crear los certificados ssl:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Si has terminado y todo acabo bien, podrás activar ssl ahora." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "¿Activar SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Elige una acción" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Crear/Editar usuario" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Listado de usuarios" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Eliminar usuario" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Salir" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Usuarios" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Configurando nuevo directorio de configuración, ¡la configuración actual no sera transferida!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Directorio de configuración" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Directorio de configuración cambiado, la instalación se cerrara, por favor reinicia para continuar." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Presiona Entrar para salir." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Ajuste del directorio de configuración fallido: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "%s: OK" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: perdido" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Contraseña: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "La contraseña es demasiado corta. Use al menos 4 símbolos." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Contraseña (de nuevo): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Las contraseñas no coinciden." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "sí" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "verdadero" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "v" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "no" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "falso" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Entrada no válida" diff --git a/locale/fa/LC_MESSAGES/django.po b/locale/fa/LC_MESSAGES/django.po index d53772faa..7d167ef88 100644 --- a/locale/fa/LC_MESSAGES/django.po +++ b/locale/fa/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/fa/LC_MESSAGES/pyLoad.po b/locale/fa/LC_MESSAGES/pyLoad.po index c2455afea..41ff60bc7 100644 --- a/locale/fa/LC_MESSAGES/pyLoad.po +++ b/locale/fa/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/fa/LC_MESSAGES/pyLoadCli.po b/locale/fa/LC_MESSAGES/pyLoadCli.po index 279daef1b..dd7471605 100644 --- a/locale/fa/LC_MESSAGES/pyLoadCli.po +++ b/locale/fa/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " سرعت: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " حجم: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " شناسه: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "وضعیت:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "در حال اجرا" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "سرعت کل" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "فایل‌های درون صف" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "مجموع" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "منو:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " اضافه کردن لینک" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " بستن سرور" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " خروج" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "فایل وجود ندارد." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "بستن سرور" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "لیست دستورات:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "فایل پیکربندی کاربر نمی‌تواند نوشته شود" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "آدرس: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "درگاه: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "نام کاربری: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "رمز عبور: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "اطلاعات ورود اشتباه است." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "برای اتصال به هسته‌ی pyLoad به py-openssl نیاز دارید." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "لینک‌های اضافه شده: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "حذف" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "انتقال" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "راه‌اندازی مجدد" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - قبلی" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - بعدی" diff --git a/locale/fa/LC_MESSAGES/setup.po b/locale/fa/LC_MESSAGES/setup.po index 2a1c9ad75..e9ad35a8a 100644 --- a/locale/fa/LC_MESSAGES/setup.po +++ b/locale/fa/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "رمز عبور: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/fi/LC_MESSAGES/django.po b/locale/fi/LC_MESSAGES/django.po index 04089267b..8dac03ec6 100644 --- a/locale/fi/LC_MESSAGES/django.po +++ b/locale/fi/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/fi/LC_MESSAGES/pyLoad.po b/locale/fi/LC_MESSAGES/pyLoad.po index 857d06854..f50353be9 100644 --- a/locale/fi/LC_MESSAGES/pyLoad.po +++ b/locale/fi/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/fi/LC_MESSAGES/pyLoadCli.po b/locale/fi/LC_MESSAGES/pyLoadCli.po index 6b2c3e606..d98e4636c 100644 --- a/locale/fi/LC_MESSAGES/pyLoadCli.po +++ b/locale/fi/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "Komentorivikäyttöliittymä" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s lataa:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "Nopeus:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "Koko:" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "Valmistunut:" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "Tunnus:" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "odotetaan:" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Valikko:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "Lisää linkkejä" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Jonon hallinta" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Kerääjän hallinta" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Linkkien hallinta" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/fi/LC_MESSAGES/setup.po b/locale/fi/LC_MESSAGES/setup.po index 32aba57dd..f7fe897c7 100644 --- a/locale/fi/LC_MESSAGES/setup.po +++ b/locale/fi/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 09089992d..af432befa 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Nouvelle demande de captcha" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Merci de lire le texte du captcha." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "PyLoad redémarré" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "Eteint" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Succès" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "Allumé" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Êtes-vous vraiment sûr de vouloir quitter pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Relancer le lien" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Effacer le lien" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Merci d'entrer un nom de package." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Veuillez cliquer sur le côté droit du captcha." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Une erreur est survenue." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Le dossier est vide" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Échoué" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Aucun captcha à lire." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Les mots de passe ne correspondent pas." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Paramètres enregistrés." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Nouveau répertoire" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Êtes-vous sûr de vouloir redémarrer pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "attend %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Téléchargements actifs" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Page principale" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "File d'attente " -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "Paquets" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Téléchargements" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Configuration" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Nom" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Status" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Taille" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Progression" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Identifiant" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Nom utilisateur" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Mot de passe" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Votre nom d'utilisateur et votre mot de passe ne correspondent pas. Veuillez réessayer." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Pour changer votre mot de passe ou ajouter un nouvel utilisateur, exécutez : " -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Supprimer les liens terminés" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Redémarrer les liens échoués" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Dossier :" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Mot de passe :" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Modifier le paquet" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Editer les détails du paquet ci-dessous." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Le nom du paquet." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Dossier" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Nom du sous-dossier pour ces téléchargements." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Liste des mots de passes utilisés pour décompresser." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Valider" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Réinitialiser" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Vous êtes désormais déconnecté." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Chemin" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absolu" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relatif" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "nom" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "taille" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "dernière modification" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "dossier parent" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "pas de contenu" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Général" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Comptes" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Sélectionnez une section à partir du menu" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Plugin" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Valide jusqu'au" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Trafic restant" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Temps" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Nombre maximum en parallèle" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Supprimer ? " -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "valide" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "invalide" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "oui" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "non" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Ajouter" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Ajouter un compte" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Entrez vos informations de compte pour utiliser les fonctionnalités premium." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Votre nom d'utilisateur." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Le mot de passe pour ce compte." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Choisissez l'hébergeur pour ce compte." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Démarrer" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "préc" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "suiv" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Fin" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Nouvelles" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Système" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "Python :" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "OS :" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "Version de pyLoad :" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Dossier d'Installation :" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Dossier de configuration :" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Dossier de téléchargement :" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Espace libre :" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Langue :" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Port de l'interface web :" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Port de l'interface à distance :" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Configurer" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Gestionnaire de fichiers" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Ajouter un paquet" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Recopiez vos liens ou envoyez un conteneur." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Le nom du nouveau paquet." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Liens" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Collez vos liens ici ou n'importe quel texte, et cliquez sur le bouton « Filtrer les URL »." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtrer les URL" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Mot de passe de l'archive RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Fichier" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Envoyer un conteneur." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Destination" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Lecture du catcha" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Le captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Texte" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Veuillez taper le texte du captcha." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Fermer" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Interface web" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Mise à jour de pyLoad disponible !" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Plugins mis à jour, redémarrez !" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha en attente" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Déconnexion" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administration" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Information" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Veuillez vous connecter !" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Arrêter" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Annuler" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Téléchargement :" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Reconnexion :" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Vitesse :" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Actif :" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Recharger la page" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "chargement" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Revenir en haut" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Quitter pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Redémarrer pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Pour ajouter un utilisateur ou modifier un mot de passe, utilisez :" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Important : L'utilisateur Admin a tous les droits !" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Modifier le mot de passe" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "modifier" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Entrez votre mot de passe actuel et celui souhaité." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Utilisateur" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Mot de passe actuel" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Nouveau mot de passe" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Le nouveau mot de passe." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Nouveau mot de passe (répéter)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "S'il vous plaît répétez le nouveau mot de passe." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Vous n'avez pas la permission d'accéder à cette page." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Répertoire de téléchargement introuvable." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "Illimité" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "non disponible" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Lancez pyload.py -s pour accéder au paramétrage." diff --git a/locale/fr/LC_MESSAGES/pyLoad.po b/locale/fr/LC_MESSAGES/pyLoad.po index cd55bd545..fe56c2bfa 100644 --- a/locale/fr/LC_MESSAGES/pyLoad.po +++ b/locale/fr/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Signal d'arrêt reçu" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad est déjà lancé avec le pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Echec lors du changement de groupe: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Echec lors du changement d'utilisateur: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "dossier des logs" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Démarrage" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Utilisation du dossier principal : %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto pour décoder les fichiers conteneurs" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "dossier des fichiers temporaires" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "dossier des téléchargements" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL pour les connexions sécurisées" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Déplacement des anciennes configurations utilisateur vers la BDD" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Vérifiez vos identifiants avec ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Tous les liens ont été supprimés" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Temps de téléchargement : %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Espace libre : %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Activation des comptes ..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Activation des Extensions..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad est opérationnel" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "redémarrage de pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad se termine" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Installation %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "impossible de trouver %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "impossible de créer %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "arrêt..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "erreur lors de l'arrêt" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "pyLoad a été tué depuis le Terminal" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "La base de données des fichiers est incompatible et a été supprimé." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "La base de données NE peut PAS être convertie." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "La base de données a été convertie de la v2 vers la v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "La base de données a été convertie de la v3 vers la v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Conversion de l'ancienne BDD Django" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "fini" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "hors ligne" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "en ligne" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "en file d'attente" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "ignoré" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "en attente" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "temp. hors ligne" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "démarrage" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "échoué" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "annulé" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "décryptage" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "personnalisé" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "téléchargement en cours" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "traitement en cours" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "inconnu" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Paquet terminé : %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Utilise SSL ThriftBackend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Erreur du backend distant: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Démarre %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Échec du chargement du backend %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "attend %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "Certificats SSL non trouvés." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Désolé, nous avons arrêté le support du démarrage de %s directement dans pyLoad" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Vous pouvez utiliser le serveur \"threaded\" qui offre de bonnes performances et le ssl," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "bien sur vous pouvez toujours utiliser vos %s existants avec pyLoads fastcgi server" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "les exemples de configurations sont localisés dans le répertoire module/webui/servers" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "les exemples de configurations sont localisés dans le répertoire pyload/webui/servers" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Ne peut utiliser %(server)s, python-flup n'est pas installé!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Erreur lors de l'importation du serveur léger : %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Vous devez télécharger et compiler bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Copiez le fichier boern.so dans le dossier module/lib, ou utilisez setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Copiez le fichier boern.so dans le dossier pyload/lib, ou utilisez setup.py install" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Évidemment vous devez être familier avec Linux et savoir comment compiler un logiciel" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Serveur placé en mode “threaded”, en raison de problèmes de performances connus sous Windows." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Ce serveur ne permet pas la connexion SSL, vous devriez envisager d'utiliser le mode “threaded” à la place" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Démarrage serveur web interne: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Démarrage serveur web SSL : %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Démarrage serveur web : %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Démarrage serveur webfastcgi : %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Démarrage du serveur léger (bjoern) : %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Vous n'avez pas la permission d'accéder à cette page." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Répertoire de téléchargement introuvable." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "Illimité" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "non disponible" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Lancez pyload.py -s pour accéder au paramétrage." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Téléchargement par blocs échoué, repli vers une seule connexion | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Le téléchargement commence : %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Téléchargement terminé : %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Il manque une fonction au plugin %s." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Abandon du téléchargement : %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Téléchargement redémarré : %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Le téléchargement est hors-ligne : %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Le téléchargement est temporairement hors ligne: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Téléchargement échoué : %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Impossible de se connecter à l'hôte ou connexion perdue, prochain essai dans une minute." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Téléchargement ignoré : %(name)s à cause de %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Démarrage du décryptage : %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Décryptage échoué : %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Nouvelle tentative en cours %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Échec de la collecte des infos pour %(name)s | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Erreur de l'exécution du hook : %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Impossible d'activer %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Plugins activés: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Plugins désactivés: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "La reconnexion a échoué : %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Script de reconnexion non trouvé !" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Lancement de la reconnexion" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Echec d'exécution du script de reconnexion !" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Reconnecté, nouvelle IP : %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Il n'y a pas assez de place sur le périphérique" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Impossible de s'identifier avec le compte %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Mauvais mot de passe" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "Votre heure %s utilise un format incorrect, utilisez 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "Le compte %s n'a pas assez de trafic, re-vérification dans 30 minutes" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "Le compte %s a expiré, re-vérification dans 1H" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Limite de téléchargement atteinte" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s a un format invalide." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Erreur d'importation %(name)s : %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Aucun hébergeur chargé" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Activez le téléchargement direct dans votre compte Bitshare" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "Le fichier links.txt ne peut être vidé." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Paramétrage du compte supprimé, du fait d'un nouveau format de configuration." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Autorisation requise (identifiant:mot de passe)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Veuillez entrer votre compte %s ou désactivez ce plugin" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Il y avait du code HTML dans le fichier téléchargé (%s)... erreur de redirection ? Le téléchargement va redémarrer." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Fichier temporairement indisponible" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload : attente de %d s entre chaque téléchargements." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload : attendre le captcha pendant %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Le fichier téléchargé est vide" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "La clé de l'API est invalide" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s : il ne reste pas assez de trafic" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Le trafic a été dépassé" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare : partage du trafic (téléchargement direct)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Un téléchargement est déjà en cours depuis cette adresse, 60 secondes d'attente" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Code d'authentification invalide, le téléchargement va redémarrer" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom : aucun slot disponible" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Vous avez besoin d'un compte premium pour ce fichier" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Le nom du fichier est invalide" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Erreur de téléchargement parallèle, attente pendant 60 secondes." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Vous n'êtes pas identifiés." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Le déchiffrement à échoué" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Aucune clé de fichier fournie dans l'URL" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Code d'erreur :" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Le fichier n'existe pas." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Les plugins ont été mis à jour, veuillez redémarrer pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Plugins mis à jour et rechargés" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Aucune mise à jour pour les plugins" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Aucune mise à jour pour pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Nouvelle version %s disponible de pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Téléchargez-le ici : http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Incapable de se connecter au serveur pour les mises à jour" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Nouvelle version de %(type)s | %(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Erreur lors de la mise à jour de %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Les versions discordent" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Téléchargement terminé : %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Nouvelle demande de captcha : %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Répondre avec ' le texte c %s sur le captcha'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Veuillez tout d'abord ajouter votre compte premium.to et redémarrez pyLoad" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Ajout de %s à partir du HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "%s non installé" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Impossible d'activer %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Activé" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Pas de plugin d'extraction activé" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Le paquet %s est mis dans la file d'attente pour une extraction ultérieure" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Vérification du paquet %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Extraction vers %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Aucun fichier trouvé pour l'extraction" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "extraction en cours" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Mot de passe protégé" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Mot de passe incorrect" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Suppression de %s fichiers" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Extraction terminée" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Erreur d'archive" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC différents" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Erreur inconnue" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "La définition de l'utilisateur et du groupe a échoué" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load : port 9666 déjà en cours d'utilisation" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s crédits restants" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Impossible d'envoyer une réponse." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Votre compte CaptchaTrader n'a pas assez de crédits" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Liste des crypteurs non trouvée" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "La liste des crypteurs est vide" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Téléchargement fini : %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Nouveau CaptchaID de l'upload: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Votre compte de captcha 9kw.eu n'a pas assez de crédits" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Scripts installés pour %s : " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Script non exécutable :" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Erreur dans %(script)s : %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Votre compte ExpertDecoders n'a pas assez de crédits" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Veuillez d'abord ajouter votre compte rehost.to et redémarrez pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Veuillez d'abord ajouter un compte valide premiumize.me et redémarrez pyLoad." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d crédits restants" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil et tesseract ne sont pas installés et il n'y a pas de client connecté pour le déchiffrement des captcha" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Pas de résultats pour le captcha obtenu dans le temps impartis par aucun des plugins." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "La définition de l'utilisateur et du groupe a échoué :: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Pas de Client connecté pour le décryptage captcha" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Ajout package %(name)s contenant %(count)d liens" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Ajout de %(count)d liens au paquet #%(package)d " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Aucun moteur JS détecté, s'il vous plaît installez soit SpiderMonkey, ossp-js, pyv8 ou rhino" diff --git a/locale/fr/LC_MESSAGES/pyLoadCli.po b/locale/fr/LC_MESSAGES/pyLoadCli.po index 43075a3a1..9fd31d4cd 100644 --- a/locale/fr/LC_MESSAGES/pyLoadCli.po +++ b/locale/fr/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Interface en ligne de commande" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s téléchargement(s) :" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Vitesse : " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Taille : " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Fini dans : " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " ID : " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "en attente : " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Statut:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "en pause" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "en cours" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "Vitesse totale" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Fichiers en attente" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Menu :" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Ajouter des liens" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "Gérer la file d'attente" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "Gérer le collecteur" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "Mettre en pause/Restaurer le serveur" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Stopper le serveur" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Quitter" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Utilisez cette syntaxe : add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Vérification de %d liens :" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Le fichier n'existe pas." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad a quitté" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Affiche le statut du serveur" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "affiche les téléchargements en file d'attente" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "affiche les téléchargements dans le collecteur" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Ajouter le paquet à la file d'attente" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Ajouter le paquet au collecteur" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Supprimer les fichiers de la file d'attente/du collecteur" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Supprimer les paquets de la file d'attente/du collecteur" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Déplacer les paquets de la file d'attente au collecteur ou vice versa" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Redémarrer les fichiers" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Redémarrer les paquets" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Vérifie le statut en ligne (fonctionne avec un conteneur local)" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Vérifie le statut en ligne d'un fichier conteneur" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Mettre le serveur en pause" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "continuer les téléchargements" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Basculer pause/reprendre" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "stopper le serveur" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Liste des commandes :" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Impossible d'écrire le fichier de configuration" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Vous avez besoin de py-openssl pour vous connecter à ce Core pyLoad." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Adresse: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Port : " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Nom d'utilisateur: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Mot de passe : " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Les identifiants sont incorrects." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Impossible d'établir la connexion à %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Vous avez besoin de py-openssl pour vous connecter au moteur de Pyload." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Mode interactif ignoré jusqu'à ce que vous entriez des commandes." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Ajouter un paquet:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Entrez un nom pour le nouveau paquet" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Paquet : %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Analyse des liens que vous voulez ajouter." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Tapez %s une fois fini." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Liens ajoutés : " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " retour au menu principal" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Gérer les paquets:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Gérer les liens:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Que voulez-vous déplacer ?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Que voulez-vous supprimer ?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Que voulez-vous redémarrer ?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Choisissez ce que vous voulez faire ou entrez le numéro du paquet." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "supprimer" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "déplacer" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "redémarrer" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - précédent" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - suivant" diff --git a/locale/fr/LC_MESSAGES/setup.po b/locale/fr/LC_MESSAGES/setup.po index 5afb2617a..bdb5c1cd8 100644 --- a/locale/fr/LC_MESSAGES/setup.po +++ b/locale/fr/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "o" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Bienvenue dans l'Assistant de Configuration de pyLoad." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Votre système va être vérifié et subir un réglage de base afin de lancer pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "La valeur entre crochets [] est toujours la valeur par défaut," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "dans le cas où vous ne voulez pas la changer ou vous ne savez pas quoi choisir, appuyez sur entrée." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "N'oubliez pas : vous pouvez toujours relancer cet assistant avec l'option --setup ou -s, lorsque vous démarrez pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Si vous avez un problème avec cet assistant appuyer sur CTRL-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "pour annuler et ne plus le laisser démarrer automatiquement avec pyload.py ." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Lorsque vous êtes prêt pour la vérification du système, appuyez sur entrée." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Vous avez besoin de pycurl, sqlite et python 2.5, 2.6 ou 2.7 pour exécuter pyLoad." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Merci d'effectuer les corrections nécessaires et de relancer pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Le configurateur va se fermer." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Vérification du système fini, appuyer sur entrée pour voir votre rapport de status." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "décryptage des conteneurs" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "connexion ssl" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "décryptage automatique des catchas" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Interface web" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "extension Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Fonctions disponibles :" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Fonctions indisponibles : " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "py-crypto n'est pas disponible" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Vous en avez besoin si vous souhaitez décrypter les fichiers conteneurs." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL n'est pas disponible" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Vous en avez besoin si vous souhaitez établir une connexion sécurisé avec le logiciel principal ou l'interface web." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Si vous souhaitez accéder à pyLoad uniquement en local, ssl n'est pas utile." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "La Reconnaissance des catchas n'est pas disponible" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Ceci est nécessaire uniquement pour certains hôtes en tant qu'utilisateur gratuit." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "Interface graphique non disponible" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "L'Interface Graphique." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "pas de moteur JavaScript trouvé" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Vous en aurez besoin pour certains liens Click'N'Load. Installez SpiderMonkey, ossp-js, pyv8 ou Rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Si vous le souhaitez, vous pouvez maintenant sortir du configurateur et corriger certaines dépendances." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Poursuivre l'installation ?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Vous voulez changer le chemin de la configuration ? Le chemin actuel est %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Si vous utilisez pyLoad sur un serveur ou si la partition home se trouve sur un disque flash il est conseillé de le modifier." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Changer le chemin de la configuration?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Vous voulez configurer les données de connexion et les paramètres de base ?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Ceci est recommandé pour la première exécution." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Faire le réglage de base ?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Vous voulez configurer ssl?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Configurer ssl?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Vous voulez configurer l'interface Web?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Configurer l'interface Web?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Installation terminée avec succès." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Appuyez sur entrée pour quitter et redémarrer pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Vérification du Système ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Votre version de python est trop récente, Merci d'utiliser Python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Votre version de python est trop ancienne, merci d'utiliser au moins Python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Version de Python : OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Vous avez installé jinja2 version %s, elle semble trop ancienne." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Vous pouvez continuer en toute sécurité mais si l'interface web ne fonctionne pas," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "mettez à jour ou désinstallez la, pyLoad inclus une librairie jinja2 suffisante." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "moteur JS" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Configuration de base ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Les données de connexion suivantes sont valables pour le CLI, GUI et l'interface Web." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Nom utilisateur" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Les clients externes (GUI, CLI ou autre) nécessitent un accès distant pour fonctionner sur le réseau." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Cependant, si vous souhaitez uniquement utiliser l'interface web vous pouvez le désactiver pour économiser la RAM." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Activer l'accès distant" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Langue" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Dossier de téléchargement" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Téléchargements parallèles max" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Utiliser la reconnexion ?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Emplacement du script de reconnexion" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Configuration de l'interface Web ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Activer l'interface Web?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Adresse d'écoute, si vous utilisez 127.0.0.1 ou localhost, l'interface Web sera accessible uniquement localement." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Adresse" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Port" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad offre plusieurs serveur d'arrière plan, suivez maintenant une brève explication." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Serveur par défaut ; c'est le meilleur choix si vous ne savez pas lequel choisir." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Ce serveur permet l'utilisation de SSL ; c'est une bonne alternative à builtin." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Peut être utilisé par apache, lighttpd, mais vous oblige à les configurer, ce qui n'est pas très facile." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Une alternative très rapide écrite en C, nécessite libev et des connaissances en linux." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Télécharger le ici : https://github.com/jonashaag/bjoern, compilez-le" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "et copiez bjoern.so vers module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "et copiez bjoern.so vers pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Attention : dans certain cas le serveur intégré ne marche pas, si vous avez des problèmes avec l'interface web" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "revenez ici et changez le serveur de “intégré” à “threaded”." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Serveur" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Configuration de SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Exécutez ces commande depuis le répertoire de configuration de pyLoad pour générer les certificats SSL :" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Si vous avez terminé et que tout s'est bien passé, vous pouvez activer le ssl maintenant." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Activer le SSL ?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Sélectionnez une action" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Créer/modifier l'utilisateur" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Lister les utilisateurs" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Supprimer un utilisateur" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Quitter" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Utilisateurs" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Définition d'un nouveau dossier de configuration, la configuration actuelle ne sera pas transférée !" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Dossier de configuration" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Dossier de configuration modifié, l'assistant va se fermer, veuillez le relancer ensuite." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Appuyez sur entrée pour quitter." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "La définition du dossier de configuration a échoué : %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "%s : OK" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s : absent" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Mot de passe : " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Le mot de passe est trop court. Utilisez au moins 4 caractères." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Mot de passe (encore) : " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Les mots de passe ne correspondent pas." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "oui" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "vrai" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "v" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "non" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "faux" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Entrée non valide" diff --git a/locale/ga/LC_MESSAGES/django.po b/locale/ga/LC_MESSAGES/django.po index a4a148192..617ce8b23 100644 --- a/locale/ga/LC_MESSAGES/django.po +++ b/locale/ga/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/ga/LC_MESSAGES/pyLoad.po b/locale/ga/LC_MESSAGES/pyLoad.po index c86006569..e3c89cc40 100644 --- a/locale/ga/LC_MESSAGES/pyLoad.po +++ b/locale/ga/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/ga/LC_MESSAGES/pyLoadCli.po b/locale/ga/LC_MESSAGES/pyLoadCli.po index e383ae6f0..67003e6d9 100644 --- a/locale/ga/LC_MESSAGES/pyLoadCli.po +++ b/locale/ga/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/ga/LC_MESSAGES/setup.po b/locale/ga/LC_MESSAGES/setup.po index 006a7f1de..a03a53855 100644 --- a/locale/ga/LC_MESSAGES/setup.po +++ b/locale/ga/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/gl/LC_MESSAGES/django.po b/locale/gl/LC_MESSAGES/django.po index 50f453f9e..44713bac7 100644 --- a/locale/gl/LC_MESSAGES/django.po +++ b/locale/gl/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Solicitude de Novo Captcha" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Por favor lea o texto do captcha." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad reiniciouse" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Éxito" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Está seguro de que quere saír de pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Reiniciar Ligazón" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Borrar Ligazón" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Por favor, introduza un nome ó paquete." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Por favor, prema á dereita do captcha." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Produciuse un erro." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "O cartafol está baleiro" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Fallou" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Non hai Captchas para ler." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Os contrasinais non coinciden." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Parámetros gardados." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Novo cartafol" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Está seguro de que quere reiniciar pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "esperando %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Descargas Activas" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Inicio" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Descargas" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Rexistros" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Configuración" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Información" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Progreso" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "O seu nome de usuario e contrasinal non coinciden. Por favor, inténteo de novo." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Para reiniciar os seus datos de inicio de sesión ou engadir un usuario, execute:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Borrar Terminados" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Reiniciar Falidos" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Cartafol:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Contrasinal:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Editar Paquete" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Editar os detalles do seguinte paquete." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Nome do paquete." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Nome do subcartafol para estas descargas." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Lista de contrasinais usadas para descomprimir." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Reiniciar" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Pechouse a sesión correctamente." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Ruta" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absoluto" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relativo" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "nome" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "tamaño" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "tipo" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "última modificación" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "directorio pai" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "sen contido" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Engadidos" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Elixa unha selección do menú" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Válido ata" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Tráfico restante" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Tempo" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Máx. en Paralelo" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Borrar?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "inválido" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "sí" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "non" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Engadir Conta" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Introduza os datos da súa conta para usar características premium." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "O seu nome de usuario." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "O contrasinal para esta conta." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Tipo" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Elixa un servidor para a súa conta." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Iniciar" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "anterior" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "seguinte" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Fin" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Novidades" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Soporte" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Sistema" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "S.O.:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "versión de pyLoad:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Cartafol de Instalación:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Cartafol de Configuración:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Cartafol de Descarga:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Espazo Libre:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Idioma:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Porto da Interface Web:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Porto da Interface Remota:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Instalar" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Administrador de ficheiros" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Engadir Paquete" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Pegue as súas ligazóns ou suba un contedor de ligazóns." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Nome do novo paquete." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Ligazóns" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Pegue as súas ligazóns ou calquera texto aquí e prema o botón de filtrar." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtrar urls" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Contrasinal para o arquivo RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Ficheiro" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Cargar un contedor de ligazóns." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Lendo captcha" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "O captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Texto" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Introduza o texto no captcha." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Interface web" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Hai unha actualización de pyLoad dispoñible!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Engadidos actualizados, por favor reinicia!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Esperando captcha" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Saír" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administrar" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Información" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Por favor, inicie sesión!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Deter" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Descarga:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Volverse a conectar:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Velocidade:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Activo:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Recargar páxina" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "cargando" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Volver ó principio" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Saír de pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Reiniciar pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Para engadir un usuario ou cambiar contrasinais empregue:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Importante: O usuario Administrador sempre ten todos os permisos!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Cambiar Contrasinal" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Administrador" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Permisos" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "cambiar" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Introduza o seu contrasinal actual e a desexado." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Usuario" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Contrasinal actual" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Novo contrasinal" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "O novo contrasinal." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Novo contrasinal (repetir)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Por favor, repita o seu novo contrasinal." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Non ten permisos para acceder a esta páxina." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Non se encontra o directorio de descarga." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "non dispoñible" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Execute pyload.py -s para acceder á instalación." diff --git a/locale/gl/LC_MESSAGES/pyLoad.po b/locale/gl/LC_MESSAGES/pyLoad.po index aadbdf35c..bca98364f 100644 --- a/locale/gl/LC_MESSAGES/pyLoad.po +++ b/locale/gl/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Sinal de saída recibida" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad xa está executándose con pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Cambio de grupo falido: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Cambio de usuario falido: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "cartafol para os rexistros" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Comezando" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Usando directorio de inicio: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto para descodificar contedores de ligazóns" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "cartafol para ficheiros temporais" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "cartafol para as descargas" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL para conexión segura" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Movendo a antiga configuración de usuario á BD" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Por favor, comprobe os seus datos de inicio de sesión con ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Todas as ligazóns foron eliminadas" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Tempo de descarga: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Espazo libre: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Activando Contas..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Activando Engadidos..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad está funcionando" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "reiniciando pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad pechouse" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Instalar %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "non se puido atopar %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "no se puido crear %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "apagando..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "produciuse un erro mentres se apagaba" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "pyload terminado dende o Terminal" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "O ficheiro da base de datos eliminouse por ser dunha versión incompatible." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "O ficheiro da base de datos NON se puido converter." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "A base de datos converteuse da v2 á v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "A base de datos converteuse da v3 á v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Convertendo a antiga BD Django" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "finalizado" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "fora de liña" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "en liña" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "na cola" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "omitido" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "esperando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "temporalmente fora de servicio" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "comezando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "falido" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "abortado" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "descifrando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "personalizado" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "descargando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "procesando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "descoñecido" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Paquete finalizado: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Usando SSL ThriftBackend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Erro remoto do motor: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Iniciando %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Fallou ó cargar o motor %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "esperando %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "Certificados SSL non encontrados." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Sentímolo, pero retirámolo soporte para iniciar %s directamente en pyLoad" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Pode empregar o servidor con fíos que ofrece un bo rendemento e ssl," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "por suposto pode seguir empregando o seu %s existente co servidor fastcgi de pyLoad" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "as configuracións de exemplo encóntranse no directorio module/webui/servers" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "as configuracións de exemplo encóntranse no directorio pyload/webui/servers" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Non pode usar %(server)s, python-flup non está instalado!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Erro importando servidor lixeiro: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Debe descargar e compilar bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Copie o módulo boern.so ó cartafol module/lib ou use a instalación setup.py" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Copie o módulo boern.so ó cartafol pyload/lib ou use a instalación setup.py" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Evidentemente, debe estar familiarizado con linux e saber como compilar software" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Servidor en modo threaded, debido a problemas de rendemento coñecidos en windows." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Este servidor non ofrece SSL, por favor considere usar o servidor con fíos no seu lugar" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Iniciando servidor web incorporado: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Iniciando servidor web SSL con fíos: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Iniciando servidor web con fíos: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Iniciando servidor fastcgi: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Iniciando servidor web lixeiro (bjoern): %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Non ten permisos para acceder a esta páxina." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Non se encontra o directorio de descarga." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "non dispoñible" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Execute pyload.py -s para acceder á instalación." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Descarga por partes falida, conexión única de emerxencia| %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Iniciando descarga: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Descarga finalizada: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "O engadido %s non atopa ningunha función." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Descarga cancelada: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Descarga reiniciada: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "A descarga está fóra de servizo: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "A descarga está temporalmente fora de servizo: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Descarga falida: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "No se puido conectar ó servidor ou conexión reiniciada, esperando 1 minuto e tentando de novo." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Descarga omitida: %(name)s debido a %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Comeza o descifrado: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Descifrado falido: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Reintentando %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "A Obtención de información para %(name)s fallou | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Erro executando as ligazóns: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Fallou a activación de %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Engadidos activados: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Engadidos desactivados: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Reconexión Falida: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Non se atopou o script de reconexión!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Iniciando reconexión" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Fallo executando o script de reconexión!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Conectado de novo, nova dirección IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Non hai suficiente espazo libre no dispositivo" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Non se puido iniciar sesión coa conta %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Contrasinal erróneo" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "A hora %s ten un formato incorrecto, use: 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "A conta %s non ten tráfico suficiente, comprobarase outra vez en 30min" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "A conta %s expirou, compróbea de novo en 1h" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Limite de descargas alcanzado" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s ten un patrón inválido." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Erro importando %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Non se cargou ningún servidor" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Active a descarga directa na súa conta de Bitshare" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "A lista de ligazóns non se puido limpar." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Configuración da conta borrada, debido ó formato da nova configuración." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Autorización requirida (usuario:contrasinal)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Arquivo non dispoñible temporalmente" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: esperando entre descargas %d s." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: esperando captcha %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "O arquivo descargado estaba baleiro" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "Clave de API inválida" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Non queda suficiente tráfico" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Tráfico excedido" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Tráfico compartido (descarga directa)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Xa está descargando dende esta dirección ip, esperando 60 segundos" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Código de Autenticación Inválido, a descarga reiniciarase" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: No quedan espazos dispoñibles" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Precisa dunha conta premium para este arquivo" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Nome do arquivo inválido" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Erro con descargas en paralelo, esperando 60s." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Non iniciou sesión." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "O ficheiro non existe." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Os engadidos foron actualizados, por favor reinicie pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Engadidos actualizados e cargados de novo" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Non hai actualizacións de engadidos dispoñibles" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "No hai actualizacións para pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Nova versión %s de pyLoad dispoñible ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Obtéñaa aquí: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Imposible conectar co servidor para actualizacións" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Nova versión de %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Erro mentres se actualizaba %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Non coincide a versión" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Descarga finalizada: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Nova Petición de Captcha: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Responda con 'c %s texto ó captcha'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Engadido %s dende HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "%s non instalado" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Non se puido activar %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Activado" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Non se activaron os engadidos de extracción" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Paquete %s posto na cola para a súa extracción posterior" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Comprobar paquete %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Extraer a %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "extraendo" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Protexido con contrasinal" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Contrasinal erróneo" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Borrando ficheiros %s" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Extracción finalizada" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Erro de Arquivo" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "O CRC non coincide" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Erro Descoñecido" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Configuración de Usuario e Grupo falida" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: O porto 9666 xa está en uso" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s créditos restantes" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "A súa conta de CaptchaTrader non ten créditos suficientes" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Descarga finalizada: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Scripts instalados para %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Script non executable:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Erro en %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Por favor, engada primeiro a súa conta rehost.to e reinicie pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil e tesseract non están instalados e no hai cliente conectado para descifrar o captcha" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Non se obtiveron resultados para o captcha no tempo asignado de ningún dos engadidos." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Configuración de Usuario e Grupo falida: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Non hai cliente conectado para descifrar o captcha" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Engadido o paquete %(name)s que contén %(count)d ligazóns" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Engadidos %(count)d ligazóns ó paquete #%(package)d " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Non se detectou ningún motor de js, por favor instale Spidermonkey, ossp-js, pyv8 ou rhino" diff --git a/locale/gl/LC_MESSAGES/pyLoadCli.po b/locale/gl/LC_MESSAGES/pyLoadCli.po index 4b1bbb714..deae3325f 100644 --- a/locale/gl/LC_MESSAGES/pyLoadCli.po +++ b/locale/gl/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Interface de Liña de Comandos" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s Descargas:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Velocidade: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Tamaño: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Finalizado en: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "esperando: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Menú:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Engadir Ligazóns" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Administrar Cola" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Administrar Colector" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " Retomar/Deter Servidor" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Parar Servidor" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Saír" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Por favor use esta sintaxe: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Comprobando %d ligazóns:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "O ficheiro non existe." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad terminou" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Amosa-lo estado do servidor" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Amosa-las descargas en cola" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Amosa-las descargas en colector" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Engadir paquetes á cola" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Engadir paquetes ó colector" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Borrar Ficheiros da Cola/Colector" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Borrar Paquetes da Cola/Colector" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Mover os Paquetes da Cola ó Colector ou viceversa" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Reiniciar ficheiros" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Reiniciar paquetes" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Comprobar o estado da conexión, traballa cun contedor local" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Comprobar o estado en liña dun contedor" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Pausa o servidor" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "continuar as descargas" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Alternar deter/continuar" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "finalizar servidor" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Lista de comandos:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Resultou imposíbel escribir no ficheiro de configuración do usuario" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Necesita py-openssl para conectarse a este Núcleo de pyLoad." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Enderezo: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Porto: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Nome de usuario: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Contrasinal: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Os datos de inicio de sesión son incorrectos." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Non se puido establecer a conexión a %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Necesita py-openssl para conectarse a este núcleo pyLoad." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Modo interactivo ignorado, xa que pasou algúns comandos." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Engadir Paquete:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Introduza un nome para o novo paquete" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Paquete: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Procesar as ligazóns que desexe engadir." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Teclee %s cando remate." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Ligazóns engadidos: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " volver ó menú principal" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Administrar Paquetes:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Administrar Ligazóns:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Que quere mover?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Que quere borrar?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Que quere reiniciar?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Elixa o que queira facer ou introduza o número do paquete." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "borrar" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "mover" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "reiniciar" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - anterior" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - seguinte" diff --git a/locale/gl/LC_MESSAGES/setup.po b/locale/gl/LC_MESSAGES/setup.po index b04099b35..86276ecf3 100644 --- a/locale/gl/LC_MESSAGES/setup.po +++ b/locale/gl/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "s" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Benvido ó Asistente de Configuración de pyLoad." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Revisarase o seu sistema e farase unha configuración básica para executar pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "O valor entre corchetes [] sempre é o valor por defecto," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "en caso de que non queira cambialo ou non estea seguro de que opción elixir, só prema entrar." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Non o esqueza: Sempre pode volver a executar este asistente co parámetro --setup ou -s cando inicie pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Se ten algún problema co asistente presione Ctrl-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "para abortar e non permitirlle volver a iniciarse automaticamente con pyload.py ." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Cando estea listo para a comprobación do sistema, prema entrar." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Precisa pycurl, sqlite e python 2.5, 2.6 ou 2.7 para executar pyLoad." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Por favor corrixa isto e volva a executar pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "O asistente da instalación pecharase." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "A comprobación do sistema concluíu, prema entrar para ver o informe de estado." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Estado ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "descifrando contedor" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "conexión ssl" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "descifrado automático de captcha" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Interface web" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "extensión Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Características dispoñibles:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Características non dispoñibles: " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "py-crypto non dispoñible" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Precisa disto se quere descifrar arquivos de contedores." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL non dispoñible" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Isto é necesario se quere establecer unha conexión segura co núcleo ou a interface web." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "SSL non é útil se tan só quere acceder a pyLoad localmente." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "recoñecemento de Captcha non dispoñible" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Só necesario para algúns servidores e como usuario gratuíto." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "Gui non dispoñible" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "A Interface de Usuario Gráfica." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "motor de JavaScript non atopado" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Precisará disto para algunhas ligazóns Click'N'Load. Instale Spidermonkey, ossp-js, pyv8 ou rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Pode cancelar o asiste agora e corrixir algunhas dependencias se quere." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Desexa continuar co asistente?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Quere cambiar a ruta de configuración? Actualmente é %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Si usa pyLoad en un servidor ou a partición primaria reside nunha memoria flash interna, pode ser boa idea cambiala." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Cambia-la ruta de configuración?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Quere configurar os datos de acceso e a configuración básica?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Isto recoméndase na primeira execución." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Facer a configuración básica?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Quere configurar ssl?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Configurar ssl?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Quere configurar a interface web?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Configurar a interface web?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Configuración rematada correctamente." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Prema entrar para saír e reiniciar pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Comprobación do sistema ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "A súa versión de python é demasiado nova, por favor use Python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "A súa versión de python é demasiado antiga, por favor use polo menos Python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Versión de Python: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "A súa versión %s de jinja2 instalada parece demasiado antiga." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Pode continuar de maneira segura pero se a interface web non funcionara," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "por favor actualícea ou elimínea, pyLoad inclúe unha biblioteca jinja2 suficiente." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "Motor JS" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Configuración Básica ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Os seguintes datos de acceso son válidos para CLI, GUI e interface web." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Os clientes externos (GUI, CLI ou outros) precisan acceso remoto para traballar a través da rede." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Non obstante, se só quere utilizar interface web pode desactivalo para aforrar ram." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Activar acceso remoto" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Cartafol de descargas" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Máximas descargas paralelas" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Usar reconectar?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Lugar do script de reconexión" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Configuración da Interface Web ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Activar a interface web?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Dirección de escoita, se usa 127.0.0.1 ou localhost, a interface web só poderá ser accesible localmente." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad ofrece varias infraestruturas de servidores, a continuación unhas pequenas explicacións." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "O servidor por defecto, a mellor opción se non sabe cal elixir." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Este servidor ofrece SSL e é unha boa alternativa ó integrado." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Pode usalo apache, lighttpd, require que o configure, o cal non é unha tarefa fácil." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Unha alternativa moi rápida escrita en C, require libev e coñecementos de linux." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Obtéñao aquí: https://github.com/jonashaag/bjoern, e compíleo" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "e copie bjoern.so a module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "e copie bjoern.so a pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Atención: Nalgúns casos raros o servidor integrado non funciona, se nota problemas coa interface web" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "volva aquí e cambie o servidor integrado polo servidor con fíos." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Configuración de SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Execute estes comandos dende o cartafol de configuración de pyLoad para crear os certificados ssl:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Se xa terminou e todo rematou ben, poderá activar ssl agora." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Activar SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Elixa unha acción" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Crear/Editar usuario" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Listar usuarios" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Eliminar usuario" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Saír" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Usuarios" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Configurando o novo directorio de configuración, os parámetros actuais non se transferirán!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Ruta de configuración" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Ruta de configuración cambiada, a instalación pecharase, por favor reinicie para continuar." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Prema Entrar para saír." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Axuste da ruta de configuración falida: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: non atopado" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Contrasinal: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Contrasinal (de novo): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Os contrasinais non coinciden." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "sí" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "verdadeiro" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "v" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "non" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "falso" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Ingreso non válido" diff --git a/locale/he/LC_MESSAGES/django.po b/locale/he/LC_MESSAGES/django.po index 50815063b..97c00c494 100644 --- a/locale/he/LC_MESSAGES/django.po +++ b/locale/he/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/he/LC_MESSAGES/pyLoad.po b/locale/he/LC_MESSAGES/pyLoad.po index d5efc9f35..4cbdb9e84 100644 --- a/locale/he/LC_MESSAGES/pyLoad.po +++ b/locale/he/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/he/LC_MESSAGES/pyLoadCli.po b/locale/he/LC_MESSAGES/pyLoadCli.po index 59cc71646..31c156f35 100644 --- a/locale/he/LC_MESSAGES/pyLoadCli.po +++ b/locale/he/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/he/LC_MESSAGES/setup.po b/locale/he/LC_MESSAGES/setup.po index 1e1bacb56..5e8e45761 100644 --- a/locale/he/LC_MESSAGES/setup.po +++ b/locale/he/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/hi/LC_MESSAGES/django.po b/locale/hi/LC_MESSAGES/django.po index 71cf38b32..7cd5d416a 100644 --- a/locale/hi/LC_MESSAGES/django.po +++ b/locale/hi/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/hi/LC_MESSAGES/pyLoad.po b/locale/hi/LC_MESSAGES/pyLoad.po index 5afc82339..ac081b482 100644 --- a/locale/hi/LC_MESSAGES/pyLoad.po +++ b/locale/hi/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/hi/LC_MESSAGES/pyLoadCli.po b/locale/hi/LC_MESSAGES/pyLoadCli.po index 4737f6785..734b08099 100644 --- a/locale/hi/LC_MESSAGES/pyLoadCli.po +++ b/locale/hi/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s डाउनलोड:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " गति: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " आकार: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " आईडी: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "प्रतीक्षा में :" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "स्थिति:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "कुल गति" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "कुल" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "मेन्यू " -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "लिंक्स जोड़ें" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "डाउनलोड जारी रखें " -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "सर्वर बंद करें " -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "कमांड सूची " -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "पोर्ट: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "उपयोगकर्ता नाम: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "पासवर्ड: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "पैकेज जोड़ें:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "नए पैकेज को नाम दें " -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "पैकेज: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "पूरा होने पर %s टाइप करें " -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "जोड़े गए लिंक" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "मुख्या मेन्यू पर वापस जाएं " -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "मिटायें " -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "पुनःआरंभ करें " -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "-पिछला " -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "-अगला " diff --git a/locale/hi/LC_MESSAGES/setup.po b/locale/hi/LC_MESSAGES/setup.po index 3ecfc5a1b..24da4ee92 100644 --- a/locale/hi/LC_MESSAGES/setup.po +++ b/locale/hi/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "पासवर्ड: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/hr/LC_MESSAGES/django.po b/locale/hr/LC_MESSAGES/django.po index fbaa25c79..29fbc3b16 100644 --- a/locale/hr/LC_MESSAGES/django.po +++ b/locale/hr/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/hr/LC_MESSAGES/pyLoad.po b/locale/hr/LC_MESSAGES/pyLoad.po index cb81932ca..e0fedc263 100644 --- a/locale/hr/LC_MESSAGES/pyLoad.po +++ b/locale/hr/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/hr/LC_MESSAGES/pyLoadCli.po b/locale/hr/LC_MESSAGES/pyLoadCli.po index ba9048e0c..cf1966357 100644 --- a/locale/hr/LC_MESSAGES/pyLoadCli.po +++ b/locale/hr/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/hr/LC_MESSAGES/setup.po b/locale/hr/LC_MESSAGES/setup.po index b4ef5c976..cad508e12 100644 --- a/locale/hr/LC_MESSAGES/setup.po +++ b/locale/hr/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/hu/LC_MESSAGES/django.po b/locale/hu/LC_MESSAGES/django.po index f2c1135d8..3d97e2270 100644 --- a/locale/hu/LC_MESSAGES/django.po +++ b/locale/hu/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Új Captcha kérés" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Olvasd el a captcha-n levő szöveget." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad újraindítva" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "ki" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Sikeres" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "be" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Biztos bezárod a pyLoad-ot?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Link újraindítás" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Link törlése" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Add meg a csomag nevét." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Kattints a megfelelő captcha helyre." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Hiba történt." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Üres könyvtár" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Sikertelen" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Nincs Captcha." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "A jelszavak nem egyeznek." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Beállítások elmentve." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Új könyvtár" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Biztos újraindítod a pyLoad-ot?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "várakozás %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Aktív letöltések" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Főoldal" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Letöltések" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Napló" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Beállítások" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Név" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Állapot" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Információ" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Méret" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Folyamat" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Bejelentkezés" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Felhasználónév" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Jelszó" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "A felhasználói név és a jelszó nem egyezik. Próbáld újra." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "A bejelentkezési adatok törléséhez vagy új felhasználó felvételéhez futtasd:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Sikeresek törlése" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Sikertelenek újrapróbálása" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Könyvtár:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Jelszó:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Csomag szerkesztése" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Csomag részletei." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Csomag neve." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "mappa" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Alkönyvtár a letöltéseknek." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Jelszavak a kitömörítéshez." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Küldés" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Alaphelyzet" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Sikeresen kijelentkeztél." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Elérési útvonal" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "abszolút" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relatív" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "név" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "méret" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "típus" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "utolsó módosítás" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "szülő könyvtár" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "nincs tartalom" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Általános" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Beépülők" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Hozzáférések" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Válaszd ki a megfelelő szekciót a menüből" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Beépülő" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "Prémium" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Lejár" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Hátralévő adatforgalom" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Idő" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Max. egyszerre futó" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Törlés?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "érvényes" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "érvénytelen" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "igen" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "nem" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Hozzáad" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Fiók hozzáadása" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Add meg a prémium hozzáféréshez szükséges adatokat." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Felhasználói neved." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Jelszó ehhez a hozzáféréshez." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Típus" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Válaszd ki a hozzáférésedhez tartozó ellátót." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Indít" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "előző" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "következő" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Vége" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Hírek" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Segítségnyújtás" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Rendszer" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "pyLoad verzió:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Telepítés helye:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Beállítások helye:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Letöltések helye:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Szabad terület:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Nyelv:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Web felület port:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Távoli elérés port:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Beállítás" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Állomány kezelő" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Csomag hozzáadása" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Illesztd be a linkeket, vagy tölts fel egy gyűjtőt." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Az új csomag neve." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Linkek" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Illesztd be a linkeket, vagy bármilyen szöveget és nyomj a linkek szűrésére." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Linkek kiszűrése" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Jelszó a RAR állományhoz" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Állomány" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Gyűjtő feltöltése." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Cél" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Captcha olvasás" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "A captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Szöveg" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Add meg a captcha-n található szöveget." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Bezárás" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Webes felület" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "pyLoad frissítés elérhető!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Beépülők frissítve, indítsd újra!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha várakozik" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Kijelentkezés" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Adminisztrálás" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Infó" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Kérlek jelentkezz be!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Megállít" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Mégse" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Letöltés:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Újracsatlakozás:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Sebesség:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Aktív:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Oldal frissítése" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "betöltés" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Vissza a tetejére" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "pyLoad bezárása" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "pyLoad újraindítása" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Új felhasználó hozzáadásához vagy jelszó változtatáshoz:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Fontos: Az Admin felhasználó mindig teljes jogkörrel rendelkezik!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Jelszó változtatás" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Engedélyek" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "változtat" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "A jelenlegi és a kívánt jelszó." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Felhasználó" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Jelenlegi jelszó" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Új jelszó" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Az új jelszó." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Új jelszó (ismét)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Ismételd meg az új jelszót." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Nincs jogosultságod a lap megtekintéséhez." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Letöltési könyvtár nem található." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "végtelen" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "nem elérhető" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "A beállításhoz futtasd: pyload.py -s." diff --git a/locale/hu/LC_MESSAGES/pyLoad.po b/locale/hu/LC_MESSAGES/pyLoad.po index 84f94d435..9f522930c 100644 --- a/locale/hu/LC_MESSAGES/pyLoad.po +++ b/locale/hu/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Leállítási jel érkezett" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "a pyLoad már fut az alábbi pid számmal: %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Sikertelen csoport váltás: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Sikertelen felhasználó váltás: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "könyvtár a naplóknak" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Indítás" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Főkönyvtár használata: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto a konténer fájlok dekódolásához" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "könyvtár az átmeneti fájloknak" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "könyvtár a letöltéseknek" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL a biztonságos kapcsolathoz" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Ellenőrizd a belépési adataid a következő paranccsal: ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Minden link törölve" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Letöltési idő: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Szabad hely: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Hozzáférések aktiválása..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Bővítmények aktiválása..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad fut" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "pyLoad újraindítása" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad kilép" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Telepítés %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "leállítás..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "hiba leállítás közben" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "pyLoad kilőve konzolról" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "befejezett" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "várólistán" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "átugorva" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "várakozás" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "átmenetileg offline" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "indítás" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "sikertelen" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "megszakított" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "dekódolás" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "egyéni" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "letöltés" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "feldolgozás alatt" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "ismeretlen" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Kész csomag: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "SSL ThriftBackend használata" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Távoli hiba: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Indítás: %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Backend betöltése sikertelen: %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "várakozás %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "SSL tanúsítvány nem található." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Ez a szerver nem támogatja az SSL-t, kérlek használj helyette másikat" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Nincs jogosultságod a lap megtekintéséhez." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Letöltési könyvtár nem található." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "végtelen" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "nem elérhető" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "A beállításhoz futtasd: pyload.py -s." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Darabokban letöltés sikertelen, visszatérés egyszeri kapcsolatra | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Letöltés elindítva: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Letöltés befejezve: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "A %s bővítményből hiányzik egy funkció." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Letöltés megszakítva: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Letöltés újraindítva: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "A letöltés offline: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "A letöltés átmenetileg offline: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "A letöltés sikertelen: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Nem sikerült csatlakozni a címhez, újrapróbálás 1 perc múlva." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Letöltés átugorva: %(name)s - %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Dekódolás elkezdve: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Dekódolás sikertelen: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Újra próbálkozás %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "%(name)s információinak lekérése sikertelen | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Sikertelen aktiválás: %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Újracsatlakozás sikertelen: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Újracsatlakozó script nem található!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Újracsatlakozás indítása" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Az újracsatlakozó scriptet nem sikerült futtatni!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Újracsatlakozva, új IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Nincs elég hely az eszközön" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Nem sikerült bejelentkezni: %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Hibás jelszó" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "%s hozzáférésen nincs elég adatforgalom, újra próbálás: 30 perc" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "%s hozzáférés lejárt, újra próbálás: 1 óra" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "A letöltési korlát elérve" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Hiba a(z) %(name)s betöltése közben: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Nincs szolgáltató betöltve" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Közvetlen letöltés aktiválása a Bitshare hozzáférésen" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Azonosítás szükséges (felhasználónév:jelszó)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Add meg a(z) %s hozzáférés adatait, vagy deaktiváld ezt a beépülőt" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "HTML kód van a letöltött fájlban (%s). Lehet, hogy átirányítási hiba, a letöltés újra lesz indítva." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Állomány átmenetileg nem elérhető" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: letöltések közti várakozás %d mp." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: captcha-ra várakozás %d mp." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "A letöltött fájl üres" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "Érvénytelen API kulcs" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Nincs elég adatforgalom hátra" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Adatforgalom túllépve" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Adatforgalom megosztás (közvetlen letöltés)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Már van folyamatban letöltés erről az IP-ről, várakozás: 60mp" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Hibás Auth kód, a letöltés újraindítása" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: Nincs ingyenes hely" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Ehhez a fájlhoz prémium hozzáférés szükséges" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Hibás fájlnév" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Többszálas letöltés hiba, várakozás: 60s." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Nem vagy bejelentkezve." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Sikertelen dekódolás" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Nincs fájl kulcs az URL-ben" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Hibakód:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Bővítmények frissítve, indítsd újra a pyLoad-ot ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Bővítmények frissítve és betöltve" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Nincs bővítmény frissítés" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Nincs új pyLoad verzió" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Új pyLoad verzió elérhető: %s ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Letöltés: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Nem sikerült a szerverhez csatlakozni a frissítésekért" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Új verzió: %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Hiba frissítés közben %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "verzió ütközés" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Letöltés befejezve: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Új captcha kérés: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Válaszolj ezzel: 'c %s szöveg a captcha-n'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Először adj meg rehost.to hozzáférést majd indítsd újra a pyLoad-ot" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "%s HotFolder-ből hozzáadva" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "Nincs %s telepítve" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Nem sikerült aktiválni: %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Aktivált" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Nincs kicsomagoló bővítmény aktiválva" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "%s csomag a várólistán későbbi kitömörítésre" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Csomag ellenőrzése: %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Kicsomagolás: %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Nincs kitömöríthető fájl" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "kicsomagolás" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Jelszóval védett" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Hibás jelszó" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "%s fájl törlése" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Kicsomagolás kész" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Tömörített állomány hiba" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC hiba" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Ismeretlen hiba" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Felhasználó és csoport beállítás sikertelen" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: A 9666 port használatban van" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s kredit maradt" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Nem sikerült választ küldeni." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "A CaptchaTrader hozzáférésen nincs elég credit" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Crypter lista nem található" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Crypter lista üres" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Letöltés befejezve: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Új CaptchaID a feltöltésből: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "A Captcha 9kw.eu hozzáférésen nincs elég credit" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Scriptek telepítve - %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Script nem futtatható:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Hiba: %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Az ExpertDecoders hozzáférésen nincs elég credit" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Először adj meg rehost.to hozzáférést majd indítsd újra a pyLoad-ot." -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Először adj meg premiumize.me hozzáférést majd indítsd újra a pyLoad-ot." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d kredit maradt" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Captcha megfejtéshez nincs kliens csatlakozva és nincs telepítve Pil vagy tesseract" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Felhasználó és csoport beállítás sikertelen: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/hu/LC_MESSAGES/pyLoadCli.po b/locale/hu/LC_MESSAGES/pyLoadCli.po index bdb9441d6..288299d23 100644 --- a/locale/hu/LC_MESSAGES/pyLoadCli.po +++ b/locale/hu/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Parancssoros felület" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s letöltés:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Sebesség: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Méret: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Befejezve: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "várakozás: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Állapot:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "felfüggesztve" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "fut" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "össz. sebesség" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Várólistás fájlok" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Összesen" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Menü:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Link hozzáadás" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Várólista kezelése" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Gyűjtő kezelése" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " Szerver szüneteltetése/folytatása" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Szerver kilövése (Kill)" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Bezárás" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Használd a következő formát: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "%d link ellenőrzése:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "A fájl nem létezik." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad leállítva" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Szerver állapota" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Várólistás fájlok" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Gyűjtőben levő letöltések" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Csomag várólistához adása" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Csomag gyűjtőhöz adása" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Fájl törlése várólista/gyűjtő" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Csomag törlése várólista/gyűjtő" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Csomag áthelyezése a várólista és a gyűjtő között" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Fájlok újraindítása" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Csomagok újraindítása" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Online státusz ellenőrzése, csak helyi konténer esetében" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "A konténer fájl online státuszának ellenőrzése" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Szerver szüneteltetése" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "letöltések folytatása" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Szüneteltetés/folytatás" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "szerver kilövése (Kill)" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Parancsok listája:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Nem sikerült írni a felhasználói beállítások fájlját" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Ehhez a pyLoad maghoz való csatlakozáshoz szükséged van py-openssl-re." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Cím: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Port: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Felhasználó: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Jelszó: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Hibás belépési adatok." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Nem sikerült kapcsolódni ide: %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Ehhez a pyLoad maghoz való csatlakozáshoz szükséged van py-openssl-re." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Az interaktív mód néhány parancs után figyelmen kívül hagyva." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Csomag hozzáadása:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Add meg az új csomag nevét" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Csomag: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Hozzáadandó linkek." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Írd %s miután végeztél." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Link felvéve: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " vissza a főmenübe" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Csomagok kezelése:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Linkek kezelése:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Mit szeretnél áthelyezni?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Mit szeretnél törölni?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Mit szeretnél újraindítani?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Válaszd ki mit szeretnél csinálni, vagy adj meg egy csomag számot." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "törlés" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "áthelyezés" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "újraindítás" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - előző" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - következő" diff --git a/locale/hu/LC_MESSAGES/setup.po b/locale/hu/LC_MESSAGES/setup.po index 6e9116909..bd43fefc0 100644 --- a/locale/hu/LC_MESSAGES/setup.po +++ b/locale/hu/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "i" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Üdvözöllek a pyLoad beállítási segédben." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Ellenőrizzük a rendszert és létrehozunk egy alap beállítást a pyLoad számára." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "A [] közötti érték minden esetben az alapértelmezett érték," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "ha nem akarod megváltoztatni, vagy nem vagy biztos benne mit válassz, csak nyomj entert." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Ne feledd: a segédhez visszatérhetsz ha a pyload.py-t a --setup vagy -s paraméterekkel indítod." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Ha bármi probléma lépne fel a segéd futása közben nyomj STRG-C kombinációt" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "a megszakításhoz, és hogy ne induljon el újra automatikusan." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Ha készen állsz a rendszer ellenőrzésre, nyomj Entert." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "A pyLoad futtatásához szükséged van a pycurl, sqlite és python 2.5, 2.6 vagy 2.7 verzióra." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Ezek javítása után futtasd újra a pyLoad-ot." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "A telepítő bezárul." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Rendszer ellenőrzés kész, nyomj Entert az eredmény megjelenítéséhez." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Státusz ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "konténer dekódolás" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "ssl kapcsolat" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "automatikus captcha dekódolás" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Webes felület" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "kiterjesztett Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Elérhető szolgáltatások:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Hiányzó szolgáltatások: " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "py-crypto nem elérhető" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Erre szükséged van a konténer fájlok dekódolásához." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL nem elérhető" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Erre szükséged van, ha biztonságos kapcsolatot szeretnél a mag vagy webes felület eléréséhez." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Ha csak helyben akarod elérni a pyLoad-ot, az ssl nem szükséges." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "nincs elérhető Captcha felismerő" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Csak néhány szolgáltatóhoz kell és ingyenes felhasználóként." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "GUI nem elérhető" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "Grafikus felület." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "nincs JavaScript motor" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Néhány Click'N'Load linknek szüksége van erre. Telepítsd a Spidermonkey, ossp-js, pyv8 vagy rhino csomagokat." -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Most megszakíthatod a telepítést, és kijavíthatod az esetleges hibákat" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Folytatod a beállítást?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Megváltoztatod a konfigurációs fájlok helyét? A jelenlegi: %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Megváltoztatod a konfigurációs fájlok helyét?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Be akarod állítani a bejelentkezési adatokat és az általános beállításokat?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Ajánlott az első futtatásnál." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Létre akarod hozni az általános beállításokat?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Be akarod állítani az ssl-t?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Beállítod az ssl-t?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Beállítod a webes kezelőfelületet?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Beállítod a webes kezelőfelületet?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "A beállítások sikeresen elvégezve." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Nyomj entert a kilépéshez majd indítsd újra a pyLoad-ot" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Rendszer ellenőrz ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "A python verziód túl új. Használd a 2.6/2.7-es verziót." -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "A python verziód túl régi. Használj legalább 2.5-ös verziót." -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Python Verzió: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "A telepített jinja2 verzió %s túl régi." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Biztonságosan tovább haladhatsz, de ha a webes felület nem működik," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "frissítsd vagy töröld, a pyLoad tartalmaz egy alkalmas jinja2 könyvtárat." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "JS motor" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Általános beállítások ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Ezek a belépési adatok a következőkhöz alkalmasak: CLI, GUI, web felület." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Felhasználónév" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Külső kliensek (GUI, CLI, ...) számára szükséges távoli elérés a hálózaton keresztüli működéshez." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Ha csak a webes felületet használod, akkor kikapcsolhatod, hogy memóriát takaríts meg." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Távoli hozzáférés engedélyezése" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Nyelv" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Letöltési könyvtár" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Max. egyidejű letöltés" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Újracsatlakozás használata?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Újracsatlakozó script helye" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Webes felület Beállítása ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Webes felület engedélyezése?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Figyelt cím, ha csak helyben akarod elérni akkor használd az 127.0.0.1 vagy localhost nevet." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Cím" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Port" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "A pyLoad számos backend szerver lehetőséget nyújt, ezekről következik egy rövid ismertető." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Használható több web-szerverrel (apache, lighttpd) egyéni beállítást igényel, ami nem egyszerű." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Letölthető innen: https://github.com/jonashaag/bjoern, le kell fordítani" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Figyelem: Néhány kivételes esetben a beépített szerver nem működik megfelelően. Ha hibát észlel a webes felületen" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "térjen vissza ide, és válasszon másik szervert." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Szerver" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## SSL beállítás ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Futtasd ezeket a parancsokat a konfigurációs könyvtárban, az ssl tanúsítványok elkészítéséhez:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Ha kész vagy, és minden rendben, akkor aktiválhatod az ssl-t." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "SSL engedélyezése?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Válassz műveletet" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Felhasználó szerkesztés/felvétel" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Felhasználók listázása" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Felhasználó törlése" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Kilépés" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Felhasználók" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "A konfigurációs fájlok új helye, a jelenlegi konfiguráció nem kerül áthelyezésre." -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Konfiguráció helye" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "A konfigurációs fájlok helye megváltozott," -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Nyomj Entert a kilépéshez." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "A beállítások eléri útja hibás: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: hiányzik" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Jelszó: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Rövid jelszó. Legalább 4 karaktert használj." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Jelszó (ismét): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "A jelszavak nem egyeznek." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "igen" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "igaz" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "i" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "nem" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "hamis" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "h" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Hibás érték" diff --git a/locale/id/LC_MESSAGES/django.po b/locale/id/LC_MESSAGES/django.po index 0c654c4d7..97f0628e5 100644 --- a/locale/id/LC_MESSAGES/django.po +++ b/locale/id/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/id/LC_MESSAGES/pyLoad.po b/locale/id/LC_MESSAGES/pyLoad.po index 80b62ab74..970c516c2 100644 --- a/locale/id/LC_MESSAGES/pyLoad.po +++ b/locale/id/LC_MESSAGES/pyLoad.po @@ -12,853 +12,848 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.pying failed: %(name)s | %(msg)s" -msgstr "" - -#: module/threads/PluginThread.py:388 -#, python-format -msgidmodule/threads/ServerThread.pymodule/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, p \ No newline at end of file diff --git a/locale/id/LC_MESSAGES/pyLoadCli.po b/locale/id/LC_MESSAGES/pyLoadCli.po index 589938d86..feb756424 100644 --- a/locale/id/LC_MESSAGES/pyLoadCli.po +++ b/locale/id/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/id/LC_MESSAGES/setup.po b/locale/id/LC_MESSAGES/setup.po index 7a2890016..ca6ad636f 100644 --- a/locale/id/LC_MESSAGES/setup.po +++ b/locale/id/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/it/LC_MESSAGES/django.po b/locale/it/LC_MESSAGES/django.po index 3fc6b7ee7..58bcfe478 100644 --- a/locale/it/LC_MESSAGES/django.po +++ b/locale/it/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Richiesto nuovo captcha" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Leggi il testo nel captcha." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyload riavviato" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "off" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Successo" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "on" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Sei sicuro di voler chiudere pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Riavvia il collegamento" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Cancella collegamento" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Immetti un nome per il pacchetto." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Clicca sulla posizione giusta del captcha." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Si è verificato un errore." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "La cartella è vuota" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Falliti" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Nessun Captcha da leggere." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Le passwords non corrispondono." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Settaggi salvati." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Nuova cartella" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Sei sicuro di voler riavviare pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "attendo %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Download attivi" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Home" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "Coda" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "Collettore" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Download" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Log" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Configurazione" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Nome" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Stato" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Info" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Dimensione" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Avanzamento" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Login" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Nome utente" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Password" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Il tuo nome utente e la tua password non corrispondono. Riprova." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Per resettare i tuoi dati di accesso o aggiungere un utente esegui:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Elimina i completi" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Riavvia i falliti" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Cartella:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Password:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Modifica pacchetto" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Modifica i dettagli del pacchetto qui di seguito." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Il nome del pacchetto." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Cartella" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Nome della sottocartella per questi download." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Lista delle password usate per decomprimere." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Invia" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "reset" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Ti sei disconnesso con successo." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Percorso" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "assoluto" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relativo" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "nome" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "dimensioni" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "tipo" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "ultima modifica" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "cartella superiore" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "nessun contenuto" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Generale" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Plugin" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Account" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Scegli una sezione dal menu" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Plugin" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "Premium" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Valido fino al:" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Traffico rimanente:" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Tempo" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Max paralleli" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Elimina? " -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "valido" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "non valido" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "si" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "no" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Aggiungi" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Aggiungi Account" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Inserisci i dati di un account premium per usufruire delle sue funzionalità." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Il tuo nome utente." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "La password di questo account." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Tipo" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Scegli l'hoster per il tuo account." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Avvio" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "precedente" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "prossimo" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Fine" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Novità" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Supporto" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Sistema" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "Python:" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "OS:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "Versione pyLoad:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Cartella installazione:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Cartella configurazione:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Cartella download:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Spazio libero:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Lingua:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Porta Interfaccia Web:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Porta Interfaccia Remota:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Configurazione" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "File Manager" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Aggiungi pacchetto" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Incolla i tuoi link o carica un contenitore." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Il nome del nuovo pacchetto." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Collegamenti" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Incolla qui i tuoi link oppure qualsiasi testo e premi il pulsante filtra." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtra URL" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Password per l'archivio RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "File" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Carica un contenitore." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Destinazione" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Captcha in lettura" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "Captcha" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Il captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Testo" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Inserisci il testo per il captcha." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Chiudi" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Interfaccia web" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Nessun aggiornamento disponibile!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Plugin aggiornati, per favore riavviare pyLoad." -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha in attesa" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Esci" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Amministra" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Info" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Effettua il login!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Arresto" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Annulla" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Download:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Riconnetti:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Velocità:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Attivo:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Ricarica pagina" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "carico" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Torna in cima" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Chiudi pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Riavvia pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Per aggiungere utenti o cambiare le password usa:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Importante: l'utente Admin ha sempre tutti i permessi!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Cambia Password" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Amministratore" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Permessi" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "cambia" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Inserisci la tua attuale e la nuova Password." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Utente" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Password attuale" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Nuova password" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Inserisci la nuova password." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Nuova password (ripetila)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Ripeti la nuova password." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Non hai i permessi per accedere a questa pagina." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Cartella Download non trovata." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "illimitato" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "non disponibile" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Esegui pyload.py -s per accedere al setup." diff --git a/locale/it/LC_MESSAGES/pyLoad.po b/locale/it/LC_MESSAGES/pyLoad.po index 5258f50f7..683ffed12 100644 --- a/locale/it/LC_MESSAGES/pyLoad.po +++ b/locale/it/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Ricevuto segnale di uscita" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad già in esecuzione con pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Impossibile cambiare il gruppo: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Impossibile cambiare utente: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "cartella dei log" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Avvio" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Uso la cartella home: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto per decodificare la libreria di file" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "cartella per i file temporanei" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "cartella dei download" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL per la connessione sicura" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Sposto la vecchia configurazione utente al DB" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Per favore controlla i tuoi dati di accesso eseguendo ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Tutti i link rimossi" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Tempo di download: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Spazio libero: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Attivazione Account..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Attivo i Plugins..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad è attivo e funzionante" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "riavvio pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "esco da pyLoad" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Installazione %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "%(desc)s: %(name)s non trovato" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "non posso creare %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "spegnimento..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "errore durante lo spegnimento" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "pyLoad chiuso da Terminale" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "Filedatabase è stato cancellato a causa dell'incompatibilità di versione." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "Il file del database non poteva essere convertito." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "Il database è stato convertito dalla v2 alla v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "Il database è stato convertito dalla v3 alla v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Conversione del vecchio DB Django" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "finito" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "offiline" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "online" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "in coda" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "saltato" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "in attesa" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "temp. offline" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "avviando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "fallito" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "annullato" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "decifrando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "personalizzato" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "scaricando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "elaborando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "sconosciuto" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Pacchetto completato: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "ThriftBackend SSL in uso" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Errore backend remoto: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Avvio %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Impossibile avviare backend %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "attendo %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "Certificati SSL non trovati." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Siamo spiacenti, abbiamo abbandonato il supporto per avviare %s direttamente all'interno di pyLoad" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Puoi utilizzare il server threaded che offre buone prestazioni e l'SSL," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "naturalmente puoi continuare ad usare il tuo attuale %s con il server fastcgi di pyLoads" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "si possono trovare configurazioni di esempio nella directory module/webui/servers" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "si possono trovare configurazioni di esempio nella directory pyload/webui/servers" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Non è possibile usare %(server)s, python-flup inon è installato!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Errore di importazione del server lightweight: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "E' necessario scaricare e compilare bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Copia il file boern.so nella cartella module/lib oppure usa setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Copia il file boern.so nella cartella pyload/lib oppure usa setup.py install" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Naturalmente è necessario avere familiarità con linux e saper compilare da codice sorgente" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Il server è stato impostato su threaded, a causa di problemi di prestazioni noti sotto Windows." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Questo server non supporta SSL, si consiglia l'uso della versione threaded" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Avvio webserver integrato: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Avvio webserver SSL threaded: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Avvio Webserver threaded: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Avvio server fastcgi: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Avvio il webserver lightweight (bjoern): %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Non hai i permessi per accedere a questa pagina." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Cartella Download non trovata." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "illimitato" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "non disponibile" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Esegui pyload.py -s per accedere al setup." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Download accellerato fallito, ripiego su singola connessione | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Avvio Download: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Download terminato: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Il plugin %s ha fallito una funzione." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Download annullato: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Download riavviato: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Il download è offline: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Il download è temporaneamente offline: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Download fallito: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Impossibile collegarsi all'host o connessione resettata, aspetto 1 minuto e riprovo." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Download saltato: %(name)s a causa di %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Decodifica avviata: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Decodifica fallita: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Riprovo %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Recupero informazioni per %(name)s fallito | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Errore durante l'esecuzione hooks: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Attivazione di %(name)s fallita" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Plugins attivati: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Plugins disattivati: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Riconnessione fallita: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Script per la riconnessione non trovato!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Nuovo tentativo di connessione" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Fallita l'esecuzione dello script di riconnessione!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Riconnesso, nuovo IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Spazio su disco insufficiente" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Impossibile effettuare il login con l'account %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Password errata" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "Il tuo orario %s ha un formato sbagliato, usa: 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "L'account %s non ha abbastanza traffico, controllo di nuovo tra 30min" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "L'account %s è scaduto; prossimo controllo fra 1 ora" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Limite di download raggiunto" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s ha uno schema non valido." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Errore importando %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Nessun Hoster caricato" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Attiva il download diretto sul tuo account Bitshare" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "LinkList non può essere cancellato." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Impostazioni account cancellato a causa del nuovo formato della configurazione." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Richiesta autorizzazione (nomeutente:password)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Per favore Inserisci il tuo account %s o disattiva questo plugin" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "C'era del codice HTML nel file scaricato (%s)... errore di redirect? Il download verrà riavviato." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "File temporaneamente non disponibile" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: attendo %d s tra i download." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: attendo %d s per il captcha." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Il file scaricato era vuoto" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "Chiave API invalida" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Traffico rimanente non sufficiente" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Traffico superato" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Traffic Share (download diretto)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Stai già scaricando da questo indirizzo IP, aspetta 60 secondi" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Auth Code non valido, il download sarà riavviato" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: Nessuno slot gratuito libero" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Hai bisogno di un account Premium per questo file" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Nome di file riportato non valido" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Errore durante il download parallelo, attendo 60s." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Non connesso." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Decifratura non riuscita" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Nessuna chiave fornita nell'URL" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Codice di errore:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Il file non esiste." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** I plugin sono stati aggiornati, riavvia pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Plugins aggiornati e riavviati" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Nessun aggiornamento per i plugin disponibile" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Nessun aggiornamento per pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Nuova versione di pyLoad %s disponibile ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Scaricala da qui: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Impossibile collegarsi al server per gli aggiornamenti" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Nuova versione di %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Errore durante l'aggiornamento di %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Versione non corrispondente" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Download finito: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Nuova richiesta Captcha: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Rispondi usando 'c %s text on the captcha'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Inserire prima il tuo account premium.to e riavviare pyLoad" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Aggiunto %s da HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "%s non installato" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Impossibile attivare %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Attivato" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Nessun plugin per l'estrazione attivato" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Il pacchetto %s è stato messo in coda per l'estrazione successiva" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Verifico pacchetto %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Estraggo in %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Nessun file trovato da estrarre" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "estrazione" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Protetto da password" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Password errata" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Cancello %s file" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Estrazione completata" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Archivio danneggiato" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC non corrispondente" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Errore Sconosciuto" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Configurazione Utente e Gruppo fallita" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: Porta 9666 già in uso" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s crediti rimasti" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Non posso inviare la risposta." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Il tuo account CaptchaTrader non ha crediti sufficienti" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Elenco Crypter non trovato" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Elenco Crypter vuoto" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Download finito: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Nuovo CaptchaID dall'upload: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Il tuo account Captcha 9kw.eu non ha abbastanza crediti" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Script installati per %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Script non eseguibile:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Errore in %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Il tuo account ExpertDecoders ha non abbastanza crediti" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Inserisci prima il tuo account rehost.to e poi riavvia pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Inserire un account premiumize.me valido e riavviare pyLoad." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d crediti rimasti" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil e tesseract non sono installati e nessun Client è connesso per decifrare i captcha" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Nessun risultato del captcha è stato trovato da alcun plugin nel tempo concesso." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Impostazione di Utente e Gruppo non riuscita: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Nessun client connesso per decifrare i captcha." -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Aggiunto pacchetto %(name)s contenente %(count)d collegamenti" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Aggiunti %(count)d link al pacchetto #%(package)d " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Nessun motore js rilevato, installare Spidermonkey, ossp-js, pyv8 o rhino" diff --git a/locale/it/LC_MESSAGES/pyLoadCli.po b/locale/it/LC_MESSAGES/pyLoadCli.po index 937056b8a..b9e963bc3 100644 --- a/locale/it/LC_MESSAGES/pyLoadCli.po +++ b/locale/it/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Interfaccia a riga di comando" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s File Scaricati:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Velocità: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Dimensione: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Terminato in: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "in attesa: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Stato:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "in pausa" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "in esecuzione" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "Velocità totale" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "File in coda" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Totale" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Menu:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Aggiungi Link" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "Gestisci Coda" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "Gestisci Libreria" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " Pausa/Riattiva Server" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Termina Server" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Esci" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Si prega di utilizzare questa sintassi: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Controllo %d link:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Il file non esiste." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad è stato chiuso" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Mostra lo stato del server" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Mostra i download in coda" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Mostra i download nella libreria" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Aggiunge pacchetti alla coda" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Aggiungi pacchetto alla libreria" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Elimina file dalla Coda/Collezione" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Elimina pacchetti dalla Coda/Libreria" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Sposta Pacchetti dalla Coda alla Libreria o vice versa" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Riavvia file" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Riavvia pacchetti" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Controlla stato online, funziona con contenitori locali" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Controlla stato online di un file contenitore" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Mette in pausa il server" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "continua i download" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Commutatore pausa/riprendi" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr " termina server" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Lista dei comandi:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Impossibile scrivere il file di configurazione utente" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Hai bisogno di py-openssl per connetterti a questo pyLoad Core." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Indirizzo:" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Porta: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Nome utente: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Password:" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "I dati di login sono errati." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Impossibile stabilire una connessione a %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Hai bisogno di py-openssl per connetterti a questo pyLoad core." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Modalità interattiva ignorata dato che hai passato alcuni comandi." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Aggiungi Pacchetto:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Inserisci un nome per il nuovo pacchetto" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Pacchetto: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Analizza i link che desideri aggiungere." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Digita %s quanto hai fatto." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Link aggiunti: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " torna al menu principale" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Gestisci Pacchetti:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Gestisci Link:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Che cosa vuoi spostare?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Che cosa vuoi cancellare?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Che cosa vuoi riavviare?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Scegli cosa vuoi fare oppure digita il numero del pacchetto." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "cancella" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "sposta" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "riavvia" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - precendente" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - sucessivo" diff --git a/locale/it/LC_MESSAGES/setup.po b/locale/it/LC_MESSAGES/setup.po index bf61f047c..9a7e5004d 100644 --- a/locale/it/LC_MESSAGES/setup.po +++ b/locale/it/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "s" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "n" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Benvenuto nell'Assistente di Configurazione di pyLoad." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Il setup controllerà il tuo sistema e genererà una configurazione di base per avviare pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "Il valore tra le parentesi quadre [] è sempre il valore di default," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "nel caso in cui non vuoi cambiare impostazione o non sei sicuro su cosa scegliere, premi semplicemente Invio." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Ricorda: Puoi sempre rieseguire questo assistente con i parametri --setup o -s, quando avvii pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Se hai qualche problema con questo assistente premi CRTL+C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "per annullare e non farlo partire più automaticamente con pyload.py ." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Quando sei pronto per la verifica del sistema premi Invio." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Hai bisogno di pycurl, sqlite e python 2.5, 2.6 o 2.7 per avviare pyLoad." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Per favore corregilo e riavvia pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Il setup si chiuderà." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Verifica del sistema finita, premi Invio per vedere il report di stato." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Stato ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "decrittografia contenitore" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "connessione ssl" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "decrittografia automatica captcha" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "GUI" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Interfaccia web" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "Click'N'Load esteso" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Funzioni disponibili:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Funzioni mancanti: " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "py-crypto non disponibile" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Hai bisofno di questo se vuoi decifrare i contenitori di file." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL non disponibile" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Questo è necessario se vuoi stabilire una connessione sicura con il core o l'interfaccia web." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Se vuoi accedere a pyLoad soltanto in locale, SSL non è necessario." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "Riconoscimento captcha non disponibile" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Necessario solo per alcuni hoster e come freeuser." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "Gui non disponibile" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "L'interfaccia utente grafica (GUI)." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "nessun motore JavaScript trovato" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Avrai bisogno di questo per alcuni link Click'N'Load. Installa Spidermonkey, ossp-js, pyv8 o rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Se vuoi puoi annullare il setup ora e correggere alcune dipendenze." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Continuare con il setup?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Vuoi cambiare il percorso per la configurazione? Quello attuale è %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Se si utilizza pyLoad su un server o la partizione principale si trova su una memoria flash interna potrebbe essere una buona idea cambiarla." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Cambiare il percorso della configurazione?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Si desidera configurare i dati di accesso e le impostazioni di base?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "E' consigliato per il primo avvio." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Creare configurazione di base?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Vuoi configurare l'ssl?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Configurare ssl?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Vuoi configurare l'interfaccia web?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Configurare l'interfaccia web?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Configurazione terminata con successo." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Premi Invio per uscire e riavviare pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Verifica del Sistema ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "La versione di python è troppo recente, usare Python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "La versione di python è troppo vecchia, usare almeno Python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Versione di Python: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "La versione installata %s di jinja2 sembra essere troppo vecchia." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Si può tranquillamente continuare, ma se l'interfaccia web non funziona," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "si prega di aggiornarla o disinstallarla, pyLoad include una libreria jinja2 sufficiente." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "motore JS" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Configurazione Base ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "I seguenti dati di accesso sono validi per CLI, GUI e interfaccia web." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Nome utente" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "I client esterni (GUI, CLI o altri) richiedono accesso remoto al sistema per funzionare nella rete." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Comunque, se hai in mente di utilizzare solo l'interfaccia web puoi disattivarlo per ridurre il consumo di memoria ram." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Attiva l'accesso remoto" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Lingua" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Cartella di download" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Numero massimo di download paralleli" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Usare la riconnessione?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Posizione dello script di riconnessione" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Configurazione dell'interfaccia web ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Attivare l'interfaccia web?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Indirizzo di ascolto, se usi 127.0.0.1 o localhost, l'interfaccia web sarà accessibile soltanto localmente." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Indirizzo" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Porta" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad offre diversi tipi di supporto a server, segue una breve spiegazione." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Server di default, la scelta migliore se non sai quale scegliere." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Questo server supporta SSL ed è una valida alternativa a quello integrato." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Può essere utilizzato con apache o lighttpd, ma ne richiede la configurazione, che non è una procedura semplice." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Alternativa molto veloce, scritta in C, richiede libev e conoscenza di linux." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Scaricalo da qui: https://github.com/jonashaag/bjoern, compilalo" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "e copia bjoern.so in module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "e copia bjoern.so in pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Attenzione: In alcuni rari casi il server integrato non funziona, se noti problemi con l'interfaccia web" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "torna qui e sostituisci il server integrato con quello threaded." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Server" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Configurazione SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Esegui questi comandi dalla cartella di configurazione di pyLoad per creare i certificati SSL:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Se hai finito e tutto è andato bene, puoi attivare SSL ora." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Attivare SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Seleziona azione" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Crea/Modifica utente" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Lista utenti" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Rimuovi utente" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Esci" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Utenti" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Imposta nuovo percorso per la configurazione. La configurazione attuale NON sarà trasferita!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Percorso di configurazione" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Percorso di configurazione modificato. il setup ora si chiuderà; riavvialo per andare avanti." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Premi Invio per uscire." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Impostazione del percorso di configurazione non riuscita: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "%s: OK" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: mancante" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Password:" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Password troppo corta. Usa almeno 4 caratteri." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Password (di nuovo): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Le passwords non corrispondono." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "si" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "vero" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "v" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "no" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "falso" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "f" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Inserimento non valido" diff --git a/locale/ja/LC_MESSAGES/django.po b/locale/ja/LC_MESSAGES/django.po index 26d05ee3a..d65e93853 100644 --- a/locale/ja/LC_MESSAGES/django.po +++ b/locale/ja/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "新しい Captcha をリクエスト" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Captcha のテキストを読んでください。" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad が再起動しました" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "オフ" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "成功しました" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "オン" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "pyLoad を本当に終了しますか?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "リンクを再起動" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "リンクを削除" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "パッケージ名を入力してください。" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "右の captcha の位置をクリックしてください。" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "エラーが発生しました。" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "フォルダが空です" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "読み取る Captcha がありません。" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "パスワードが一致しません。" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "設定が保存されました。" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "新規フォルダ" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "pyLoad を本当に再起動しますか?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "%s を待機中" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "アクティブなダウンロード" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "ホーム" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "キュー" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "コレクター" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "ダウンロード" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "ログ" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "設定" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "名前" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "ステータス" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "情報" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "サイズ:" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "進捗" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "ログイン" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "ユーザー名" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "パスワード" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "ユーザ名かパスワードが一致しません。再試行してください。" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "ログイン データをリセットしたりユーザを追加するには以下を実行してください:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "削除が完了しました" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "再起動に失敗しました" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "フォルダ:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "パスワード:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "パッケージを編集" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "下のパッケージの詳細を編集します。" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "パッケージの名前。" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "フォルダー" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "これらのダウンロードのためのサブフォルダの名前です。" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "unrar に使われたパスワードの一覧です。" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "送信" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "リセット" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "正常にログアウトしました。" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "パス" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "絶対的" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "相対的" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "名前" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "標本数" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "種類" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "最終更新" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "親ディレクトリ" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "内容なし" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "標準" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "プラグイン" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "アカウント" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "メニューからセクションを選択" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "プラグイン" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "プレミアム" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "有効期限" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "残りトラフィック" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "時間" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "最大の並列数" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "削除しますか?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "有効です" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "無効" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "はい" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "いいえ" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "追加" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "プレミアム機能を使うにはアカウント データを入力してください。" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "あなたのユーザ名です。" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "このアカウントのパスワードです。" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "あなたのアカウントのホスティング会社を選択してください。" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "開始" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "前へ" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "次へ" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "終了" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "ニュース" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "サポート" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "pyLoad のバージョン:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "インストール フォルダ:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "設定フォルダ:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "ダウンロード フォルダ:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "空き領域:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "言語:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "ウェブインタフェースのポート:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "リモート インタフェースのポート:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "ファイルマネージャ" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "パッケージを追加" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "リンクを貼り付けるかコンテナをアップロードしてください。" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "新しいパッケージの名前。" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "リンク" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "ここにリンクや任意のテキストを貼り付けるかフィルタ ボタンを押してください。" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "フィルタ URL" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "RAR アーカイブのパスワード" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "ファイル" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "コンテナをアップロードしてください。" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "保存先:" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Captcha を読み込み中" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Captcha です。" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "テキスト" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Captcha のテキストを入力してください。" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "閉じる" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "ウェブインタフェース" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "pyLoad の更新を利用できます!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "プラグインが更新されました、再起動してください!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha を待機中" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "ログアウト" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "管理" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "情報" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "ログインしてください!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "停止" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "キャンセル" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "ダウンロード:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "再接続:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "速度:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "アクティブ:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "ページを再読込" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "読み込み中" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "トップに戻る" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "pyLoad を終了" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "pyLoad を再起動" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "ユーザを追加またはパスワードを変更するには:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "重要: 管理者ユーザには常にすべての権限があります!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "パスワードを変更" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "権限" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "変更" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "現在のパスワードと新しいパスワードを入力してください。" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "ユーザ" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "現在のパスワード" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "新しいパスワード" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "新しいパスワードです。" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "新しいパスワード (再入力)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "新しいパスワードを繰り返してください。" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "無制限" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "利用不可" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/ja/LC_MESSAGES/pyLoad.po b/locale/ja/LC_MESSAGES/pyLoad.po index 45cecdb97..e742cdd43 100644 --- a/locale/ja/LC_MESSAGES/pyLoad.po +++ b/locale/ja/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "終了のシグナルを受信" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad はプロセス ID %s で既に実行中" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "グループの変更に失敗しました: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "ユーザーの変更に失敗しました: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "ログのフォルダ" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "開始中" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "ホームディレクトリとして %s を使用中" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "一時ファイルのフォルダ" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "ダウンロード先のフォルダ" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "セキュアな接続のための OpenSSL" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "./pyload.py -u であなたのログインデータをチェックしてください" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "すべてのリンクが削除されました" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "ダウンロード時間: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "空き領域: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "アカウントをアクティベート中..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "プラグインをアクティベート中..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad が実行中" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "pyLoad を再起動中" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad が終了します" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "%s をインストール" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "シャットダウン中..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "シャットダウン中にエラー" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "完了" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "オフライン" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "オンライン" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "キューに入っています。" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "スキップ" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "待機中" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "一時的にオフライン" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "開始中" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "失敗しました" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "中止しました" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "復号化" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "カスタム" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "ダウンロード中" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "処理中" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "不明" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "パッケージが完了しました: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "リモート バックエンド エラー: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "開始 %(name)s:%(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr " バックエンド %(name)sの読み込みに失敗した |%(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "%s を待機中" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "SSL 証明書が見つかりません。" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "このサーバーで SSL はありません、代わりにスレッドを使用してください" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "無制限" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "利用不可" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "ダウンロード チャンクへの移行に失敗しました 1 つの接続 |。%s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "ダウンロード開始: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "ダウンロード完了: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "プラグイン %s には関数がありません。" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "ダウンロードを中止: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "ダウンロードを再開: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "ダウンロードがオフライン: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "ダウンロードが一時的にオフライン: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "ダウンロードに失敗しました: %(name)s|%(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "ホストまたは接続のリセットに接続できなかったため、1 分後接続に再試行してください。" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "ダウンロードをスキップしました:%(plugin)sにより %(name)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "%(name)sの失敗の情報取得する |%(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "%(name)sをアクティブ に失敗しました" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "再接続に失敗しました: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "再接続スクリプトが見つかりません!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "再接続を開始中" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "失敗した実行スクリプト再接続 !" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "再接続、新しい IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "デバイスに空き領域不足" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "アカウント%(user)s ではログインできませんでした |%(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "間違ったパスワード" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "アカウント %s が十分なトラフィックがない、30 分でもう一度チェック" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "アカウント %s は有効期限が切れて、1 h でもう一度チェック" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "ダウンロード制限に達しました" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "%(name)s:%(msg)sのインポート エラー" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "ホスティング サービスが読み込まれていません" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Bitshare アカウントで直接のダウンロードを有効にします。" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr " (username:password)承認が必要" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "%S アカウントを入力するか、このプラグインを無効にしてください。" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "ファイルが一時的に利用できません。" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: ダウンロード %d 秒間待機しています。" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: キャプチャ %d 秒を待っています。" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "ダウンロードしたファイルが空だった" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "API キーが無効です。" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s:十分なトラフィックがない" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "トラフィックを超えています" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "急流: トラフィックを共有 (ダウンロードによる直販)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "既にこの ip アドレスからダウンロードする、60 秒を待っています。" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "無効な認証コード、ダウンロードが再起動" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: 空きスロット" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "このファイルのプレミアム アカウントを必要があります。" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "無効なファイル名を報告" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "並列ダウンロード エラー、60秒を待っています。" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "ログインしていません。" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "復号化に失敗しました" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "URL で提供されるファイル キーがありません。" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "エラー コード:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "* * * プラグインが更新されて、pyLoad を再起動してください * * *" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "プラグインの更新し、再読み込み" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "プラグインの更新はありません。" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "PyLoad の更新" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "* * * 新しい pyLoad バージョン %s が利用 * * *" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "* * * それを得るここで: http://pyload.org/download * * *" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "更新サーバーに接続することはできません。" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "新しいバージョンの%(type)s|%(name)s%(version) .2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "%sを更新するときのエラー" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "バージョンの不一致" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "ダウンロード完了: %(name)s @ %(plugin)s" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "新しいキャプチャ要求: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "'C %s テキストのキャプチャを' と答え" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "HotFolder から%s追加 " -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "%s がインストールされました" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "%S をアクティブにできませんでした。" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "アクティブ化" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "アクティブ化のプラグインがない" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "パッケージ %s は、抽出後のキュー" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "パッケージ %s をチェック" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "%S を抽出します。" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "ファイルを抽出するが見つかりません" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "展開中" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "パスワードで保護されています" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "正しくないパスワード" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "%s 個のファイルを削除中" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "展開が完了しました" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "アーカイブ エラー" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC が不一致" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "不明なエラー" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "ユーザー設定およびグループに失敗しました" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: 使用中のポート 9666" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s のクレジットを左" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "応答を送信できませんでした。" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "あなたの CaptchaTrader アカウントが十分なクレジット" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Crypter リストが見つかりません" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Crypter リストは空です。" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "ダウンロード完了: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "アップロードから新しい CaptchaID: %s: %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "あなたのキャプチャ 9kw.eu アカウントが十分なクレジット" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "%s のインストール スクリプト" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "スクリプトがない実行可能ファイル:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "%(script)s のエラー:%(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "あなたの ExpertDecoders アカウントが十分なクレジット" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "まず、rehost.to アカウントを追加し、pyLoad を再起動してください。" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d のクレジットを残った" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil とテッセラクト インストールされていないクライアント接続 captcha 解読" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "ユーザーとグループの設定に失敗しました: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/ja/LC_MESSAGES/pyLoadCli.po b/locale/ja/LC_MESSAGES/pyLoadCli.po index 40b14f12c..cbbc8ec27 100644 --- a/locale/ja/LC_MESSAGES/pyLoadCli.po +++ b/locale/ja/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " コマンド ライン インタフェース" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s ダウンロード:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " 速度: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " サイズ: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " 完了: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "待機中: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "ステータス:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "一時停止" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "実行しています。" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "合計速度" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "キュー内のファイル" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "合計" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "メニュー:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " リンクを追加" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " キューを管理" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " コレクターを管理" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " サーバーを一時停止/再開" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " サーバーを終了させる" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " 終了" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "この構文を使用してください: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "%d 個のリンクをチェック中:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "ファイルが存在しません。" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad が終了しました" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "印刷サーバーの状態" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "キュー内のダウンロードを印刷" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "コレクター内のダウンロードを印刷" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "パッケージをキューに追加" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "パッケージをコレクターに追加" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "キュー/コレクターからファイルを削除" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "キュー/コレクターからパッケージを削除" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "キューからコレクター (またはその逆) にパッケージを移動" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "ファイルを再起動" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "パッケージを再起動" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "オンラインの状態やローカル コンテナの仕事をチェック" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "コンテナ ファイルのオンライン状態をチェック" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "サーバーを一時停止" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "ダウンロードを継続" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "一時停止/再開を切替え" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "サーバーを終了させる" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "コマンドの一覧:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "ユーザー設定ファイルに書き込むことができませんでした" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "この pyLoad コアに接続するには py-openssl が必要です。" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "アドレス: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "ポート: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "ユーザー名: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "パスワード: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "ログイン データが間違っています。" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "%(addr)s:%(port)s への接続を確立できませんでした。" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "この pyLoad コアに接続するには py-openssl が必要です。" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "対話モードはあなたが入力したいくつかのコマンドを無視しました。" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "パッケージを追加:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "新しいパッケージの名前を入力" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "パッケージ: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "追加したいリンクを解析します" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "終わったら %s を入力してください。" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "リンクが追加されました: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " メイン メニューに戻る" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "パッケージを管理:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "リンクを管理:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "何を移動しますか?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "何を削除しますか?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "何を再起動しますか?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "何をするかを選択するかパッケージ番号を入力してください。" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "削除" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "移動" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "再起動" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - 前" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - 次" diff --git a/locale/ja/LC_MESSAGES/setup.po b/locale/ja/LC_MESSAGES/setup.po index b350f1063..9370418e4 100644 --- a/locale/ja/LC_MESSAGES/setup.po +++ b/locale/ja/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "pyLoad 設定アシスタントにようこそ。" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "それはあなたのシステムをチェックし、基本的なセットアップ pyLoad を実行するために。" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "角かっこ内の値は常に、既定値は" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "それを変更したくない、何を選択する確認が場合ヒットだけを入力します。" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "忘れてはいけない: pyload.py を起動すると常にセットアップまたは-s パラメーターでこのアシスタントを再実行することができます。" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "中止しないでください彼はもはや自動的に pyload.py を開始させてください。" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "システム チェックの準備が整ったら、ヒットを入力します。" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "pyLoad を実行するには pycurl と sqlite、python 2.5 または 2.6、2.7 が必要です。" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "これを修正して pyLoad を再実行してください。" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## 状態 ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "SSL 接続" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "自動 captcha 解読" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "ウェブインタフェース" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL を利用できません" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "GUI を利用できません" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "グラフィカル ユーザ インターフェイスです。" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "JavaScript エンジンが見つかりません" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "セットアップを続けますか。" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "設定パスを変更しますか。現在は %s です。" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "設定パスの変更ですか?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "ログイン データと基本設定を構成しますか。" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "最初の実行をお勧めしますです。" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "基本的なセットアップを行うか?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Ssl を構成しますか。" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Ssl を構成しますか。" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "ウェブインタ フェースを構成しますか。" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "ウェブインタ フェースを構成しますか。" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "セットアップは正常に完了しました。" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "PyLoad を再起動を終了を入力ヒット" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## システム チェック ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Python のバージョン: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "JS エンジン" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## 基本的なセットアップ ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "次の logindata は CLI と GUI のウェブインタ フェースに有効です。" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "ユーザー名" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "言語" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "ダウンロードフォルダ" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "最大並列ダウンロード" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "再接続を使用します。" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "スクリプトの場所を接続し直します" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## ウェブインタフェースのセットアップ ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "ウェブインタフェースをアクティベートしますか?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "リスン アドレス、127.0.0.1 または localhost、ウェブインタ フェースを使用する場合は、ローカルでのみアクセス可能。" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "アドレス" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "ポート" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad 今、簡単な説明、次のいくつかのサーバー バックエンドを提供しています。" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Apache、lighttpd を使用することができます、あまりにも簡単な仕事ではない、それらを構成する必要があります。" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "ここからそれを得る: https://github.com/jonashaag/bjoern、それをコンパイル" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "注意: いくつかのまれなケースで、組み込みのサーバーが動作しない、ウェブインタ フェースで問題が発生した場合" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "ここに戻ってくるし、ここでスレッドに組み込みサーバーを変更します。" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "サーバー" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## SSL セットアップ ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Ssl 証明書を pyLoad config フォルダーからこれらのコマンドを実行します。" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "完了したら、すべてがうまく行った場合 ssl を今すぐアクティブ化することができます。" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "SSL を有効にするか?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "動作を選択" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - ユーザを作成/編集" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - ユーザ一覧を表示" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - ユーザを削除" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - 終了" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "ユーザー" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "設定パス" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "終了するには Enter を押してください。" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "設定パスの設定に失敗しました: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: ありません" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "パスワード: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "パスワードが短すぎます。4 文字以上にしてください。" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "パスワード (再入力): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "パスワードが一致しません。" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "はい" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "いいえ" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "無効な入力" diff --git a/locale/ko/LC_MESSAGES/django.po b/locale/ko/LC_MESSAGES/django.po index 93877fc34..8a8ec2874 100644 --- a/locale/ko/LC_MESSAGES/django.po +++ b/locale/ko/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/ko/LC_MESSAGES/pyLoad.po b/locale/ko/LC_MESSAGES/pyLoad.po index 048520190..33c6cc922 100644 --- a/locale/ko/LC_MESSAGES/pyLoad.po +++ b/locale/ko/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/ko/LC_MESSAGES/pyLoadCli.po b/locale/ko/LC_MESSAGES/pyLoadCli.po index e85c7fb29..ed8539ae8 100644 --- a/locale/ko/LC_MESSAGES/pyLoadCli.po +++ b/locale/ko/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/ko/LC_MESSAGES/setup.po b/locale/ko/LC_MESSAGES/setup.po index 38f52ea3d..e806aa68e 100644 --- a/locale/ko/LC_MESSAGES/setup.po +++ b/locale/ko/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/ms/LC_MESSAGES/django.po b/locale/ms/LC_MESSAGES/django.po index 258e0cdf8..7ee9b2c75 100644 --- a/locale/ms/LC_MESSAGES/django.po +++ b/locale/ms/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Gagal" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Jenis" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Sistem" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Persediaan" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/ms/LC_MESSAGES/pyLoad.po b/locale/ms/LC_MESSAGES/pyLoad.po index 4d92823a5..e234643df 100644 --- a/locale/ms/LC_MESSAGES/pyLoad.po +++ b/locale/ms/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/ms/LC_MESSAGES/pyLoadCli.po b/locale/ms/LC_MESSAGES/pyLoadCli.po index d4119d884..4d9aef64d 100644 --- a/locale/ms/LC_MESSAGES/pyLoadCli.po +++ b/locale/ms/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Tambah pakej:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Masukkan nama untuk pakej baru" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Pakej: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Pautan ditambah: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " kembali ke menu utama" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Menguruskan pakej:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Menguruskan pautan:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Apakah yang anda ingin mengalih?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Apakah yang anda ingin hapuskan?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Apakah yang anda ingin memulakan semula?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "hapuskan" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "mengalih" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/ms/LC_MESSAGES/setup.po b/locale/ms/LC_MESSAGES/setup.po index 837f7ed34..c84724694 100644 --- a/locale/ms/LC_MESSAGES/setup.po +++ b/locale/ms/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/nl/LC_MESSAGES/django.po b/locale/nl/LC_MESSAGES/django.po index 912576e9e..fac53942b 100644 --- a/locale/nl/LC_MESSAGES/django.po +++ b/locale/nl/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Nieuw Captcha verzoek" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Lees de tekst van de captcha." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "PyLoad is herstart" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "uit" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Succes" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "aan" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Ben je zeker dat je pyLoad wilt afsluiten?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Herstart Link" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Verwijder Link" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Geef een naam voor het pakket op." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Gelieve op de correcte captcha positie te klikken." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Fout opgetreden." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Map is leeg" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Mislukt" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Geen captchas beschikbaar." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Wachtwoorden kwamen niet overeen." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Instellingen bewaard." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Nieuwe map" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Ben je zeker dat je pyLoad wilt herstarten?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "wachtend %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Actieve downloads" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Configuratie" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Naam" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Status" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Informatie" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Grootte" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Vooruitgang" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Inloggen" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Gebruikersnaam" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Wachtwoord" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Gebruikersnaam en wachtwoord komen niet overeen, probeer nogmaals." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Om logindata te resetten of gebruiker toe te voegen start:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Verwijder voltooide" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Herstart gefaalde" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Map:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Wachtwoord:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Pakket bewerken" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Bewerk de pakketdetails hieronder." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "De naam van het pakket." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Map" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Naam van de submap voor deze downloads." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Lijst van wachtwoorden die voor het uitpakken gebruikt worden." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Verzenden" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Wissen" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Je bent succesvol uitgelogd." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Pad" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absoluut" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relatief" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "naam" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "grootte" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "laatst gewijzigd" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "bovenliggende map" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "geen inhoud" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Algemeen" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Accounts" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Kies een categorie uit het menu" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Plugin" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Geldig tot" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Resterend volume" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Tijd" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Verwijderen?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "geldig" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "ongeldig" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "ja" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "nee" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Toevoegen" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Voeg Account toe" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Vul accountgegevens in om premium functies te gebruiken." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Gebruikersnaam." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Het wachtwoord voor deze account." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Kies de hoster voor je account." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "vorige" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "volgende" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Einde" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Nieuws" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Ondersteuning" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Systeem" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "pyLoad versie:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Installatie Map:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Configuratie Map:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Download Map:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Beschikbare Ruimte:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Taal:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Webinterface Poort:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Remote Interface Poort:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Installatie" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Bestandsbeheer" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Pakket Toevoegen" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Plak je links of upload een dlc bestand." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "De naam van het nieuwe pakket." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Plak je links of tekst hier en druk op de filterknop." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Wachtwoorden voor RAR-archieven" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Bestand" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Upload een container." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Bestemming" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Captcha's lezen" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "De captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Tekst" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Typ de tekst van de captcha in." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Sluiten" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "pyLoad Update beschikbaar!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Plugins updated, herstart pyLoad!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha's beschikbaar" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Afmelden" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administratie" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Informatie" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Gelieve aan te melden!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Annuleren" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Snelheid:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Actief:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Herlaad pagina" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "laden" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Naar top" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Sluit pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Herstart pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Toevoegen van gebruiker of wijzigen wachtwoord gebruik:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Belangrijk: Administrator heeft altijd alle toegangsrechten!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Wachtwoord Wijzigen" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Toegangsrechten" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "wijzigen" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Vul je huidig en gewenste wachtwoord in." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Gebruiker" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Huidig wachtwoord" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Nieuw wachtwoord" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Nieuw wachtwoord." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Nieuw wachtwoord (herhalen)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Herhaal het nieuwe wachtwoord." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Je hebt geen rechten deze pagina te bezoeken." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Downloadmap niet gevonden." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "onbeperkt" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "niet beschikbaar" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Start pyload.py -s om setup te starten." diff --git a/locale/nl/LC_MESSAGES/pyLoad.po b/locale/nl/LC_MESSAGES/pyLoad.po index 4f1fa4663..acd922208 100644 --- a/locale/nl/LC_MESSAGES/pyLoad.po +++ b/locale/nl/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Quit signaal ontvangen" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad is al actief met pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Veranderen van groep mislukt: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Veranderen van gebruiker mislukt: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "map voor logs" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Startend" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Gebruik hoofdmap: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "Container bestanden decoderen met pycrypto" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "map voor tijdelijke bestanden" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "map voor downloads" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL voor beveiligde verbinding" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Oude configuratie naar DB verplaatsen" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Controleer je logingegevens met ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Alle links verwijderd" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Downloadtijd: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Beschikbare ruimte: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Accounts worden geactiveerd..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Plugins aan het activeren..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad is lopende" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "pyLoad wordt herstart" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad wordt afgesloten" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Installeren %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "Niet te vinden %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "Niet aan te maken %(desc)s : %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "afsluiten..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "fout tijdens afsluiten" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "pyLoad is afgesloten via Terminal" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "Bestandsdatabase is verwijderd vanwege niet verenigbare versie." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "Bestandsdatabase kan NIET geconverteerd worden." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "Database is geconverteerd van v2 naar v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "Database is geconverteerd van v3 naar v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Oude Django DB omzetten" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "compleet" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "in wachtrij" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "overgeslagen" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "wachtend" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "tijdelijk offline" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "startend" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "mislukt" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "afgebroken" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "decrypten" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "gepersonaliseerd" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "wordt gedownload" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "verwerken" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "onbekend" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Pakket compleet: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "SSL ThriftBackend gebruiken" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Remotebackendfout: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Opstarten %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Laden van backend %(name)s | %(error)s mislukt" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "wachtend %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "SSL certificaten niet gevonden." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Sorry, we hebben ondersteuning voor starten van %s vanuit pyLoad verwijderd" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Je kan de threaded server gebruiken welke goede prestaties en ssl biedt," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "ook kan je de pyLoads fastcgi server gebruiken met je bestaande %s" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "voorbeeldconfiguratie is te vinden in module/webui/servers map" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "voorbeeldconfiguratie is te vinden in pyload/webui/servers map" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Kan %(server)s niet gebruiken, python-flup is niet geinstalleerd!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Fout bij importeren lichtgewicht server: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Je moet bjoern downloaden en compileren, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Kopieer de boern.so naar module/lib map en gebruik setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Kopieer de boern.so naar pyload/lib map en gebruik setup.py install" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Hiervoor is kennis van linux en compileren van software een vereiste" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Server op threated gezet, vanwege bekende prestatie problemen op windows." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Deze server heeft geen SSL, overweeg de threaded server te gebruiken" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Opstarten van builltin webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Opstarten van threaded SSL webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Opstarten van threaded webserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Opstarten van fastcgi server: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Opstarten van lichtgewicht webserver (bjoern): %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Je hebt geen rechten deze pagina te bezoeken." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Downloadmap niet gevonden." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "onbeperkt" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "niet beschikbaar" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Start pyload.py -s om setup te starten." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Downloaden in chunks is mislukt, val terug op één connectie | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Download gestart: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Download compleet: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Plugin %s mist een functie." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Download afgebroken: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Download herstart: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "%s offline" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Download is tijdelijk offline: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Download mislukt: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Kan geen verbinding maken met host, wacht 1 minuut en probeer opnieuw." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Download overgeslagen: %(name)s vanwege %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Decrypten gestart: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Decrypten mislukt: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Opnieuw proberen %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Informatie verzamelen voor %(name)s mislukt | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Uitvoeren van hooks mislukt: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Activeren mislukt van %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Geactiveerde plugins: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Niet geactiveerde plugins: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Opnieuw verbinden mislukt: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Opnieuw verbinden script niet gevonden!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Opnieuw aan het verbinden" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Uitvoeren van opnieuw verbinden script mislukt!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Opnieuw verbonden, nieuwe IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Onvoldoende schijfruimte vrij" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Kan niet inloggen onder gebruikersnaam %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Verkeerd wachtwoord opgegeven" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "Tijd %s heeft verkeerde , gebruik: 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "Account %s heeft niet genoeg credits, wij proberen het opnieuw in 30min" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "Account %s is verlopen, opnieuw te controleren in 1h" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Downloadlimiet bereikt" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s heeft een ongeldig patroon." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Fout bij importeren %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Geen Hoster geladen" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Activeer Direct Downloaden in je Bitshare Account" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "LinkList kon niet gewist worden." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Accountgegevens verwijderd, vanwege nieuw configutatie formaat." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Autorisatie vereist (gebruikersnaam:wachtwoord)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Voer hier uw %s gegevens in of deactiveer deze plugin" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Tijdens het proberen van het ophalen van het volgende bestand (%s) is er een html/pagina reactie teruggekomen, dit kan een doorsturing zijn naar een andere pagina. pyLoad zal nu opnieuw het bestand proberen binnen te halen." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Bestand tijdelijk niet beschikbaar" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: wachten tussen downloads %d s." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: Wachten tot captcha %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Downloadlink heeft geen bestand gekoppeld" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "API sleutel ongeldig" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Overdracht limiet bijna bereikt , niet voldoende credits" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Dataverkeer overschreden" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Bandbreedte Delen (Direct Downloaden)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Er wordt al een bestand gedownload vanaf dit ip adres, na 60 seconden volgende poging" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Ongeldige Auth Code, download wordt automatisch herstart" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: Geen beschikbaarde downloadslots" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "U heeft een premium account nodig voor deze bestand" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Bestandsnaam geeft ongeldigheidsmelding" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Gelijktijdige download mislukt, wacht 60 seconden voor volgende poging." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Niet ingelogd." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Ontcijferen van codering mislukt" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Geen bestandssleutel meegeleverd door URL" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Foutmeldingscode:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Bestand bestaat niet." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Plugins zijn bijgewerkt, pyLoad opnieuw starten aub***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Plugins bijgewerkt en opnieuw geladen" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Geen plugin updates beschikbaar" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Geen Updates voor pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Nieuwe pyLoad Versie %s beschikbaar ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Download hier: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Niet in staat te verbinden met server voor updates" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Nieuwe versie van %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Fout tijdens updaten van %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Versie mismatch" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Download compleet: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Nieuw Captcha verzoek: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Beantwoord met 'c%s text on the captcha'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Toegevoegde %s van HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "Niet %s geinstalleerd" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Kan %s niet activeren" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Geactiveerd" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Geen uitpak plug-ins geactiveerd" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Pakket %s in wachtrij voor later uitpakken" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Controleer pakket %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Uitpakken naar %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Geen bestanden gevonden om uit te pakken" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "uitpakken" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Beveiligd met een wachtwoord" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Verkeerd wachtwoord" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "%s bestanden verwijderen" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Uitpakken voltooid" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Archief fout" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC foutief" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Onbekende fout" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Instellen van gebruikers en de groep is mislukt" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: Poort 9666 al in gebruik" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s credits over" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Kan het antwoord niet verzenden." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Uw CaptchaTrader Account heeft niet genoeg credits" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Crypter lijst niet gevonden" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Crypter lijst is leeg" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Download compleet: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Nieuwe CaptchaID van upload: %s: %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Uw Captcha 9kw.eu Account heeft niet genoeg credits" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Geïnstalleerde scripts voor %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Script niet uitvoerbaar:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Fout in %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Uw ExpertDecoders Account heeft niet genoeg credits" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Gelieve eerst uw premium account toe te voegen en daarna pyLoad te herstarten" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "uw resterende aantal credits : %d" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Captcha ontcijfering niet mogelijk : A. Client is niet verbonden & B. Pil en Tesseract module niet gevonden" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Geen captcha resultaat ontvangen in aangegeven tijd bij een van de plugins." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Instellingen van gebruiker en groep kunnen niet geladen worden : %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Geen verbinding met client om captcha te decrypten" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Pakket %(name)s toevoegen met %(count)d links" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "%(count)d links toevoegen aan pakket #%(package)d " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Geen js engine gedetecteerd, installeer Spidermonkey, ossp-js, pyv8 of rhino" diff --git a/locale/nl/LC_MESSAGES/pyLoadCli.po b/locale/nl/LC_MESSAGES/pyLoadCli.po index 35e9d3aac..4925904ae 100644 --- a/locale/nl/LC_MESSAGES/pyLoadCli.po +++ b/locale/nl/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Opdrachtprompt" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Snelheid: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Grootte: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Compleet in: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "wachtend: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "gepauzeerd" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "lopend" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "totale Snelheid" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Bestanden in wachtrij" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Totaal" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Links toevoegen" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "Wachtrij beheren" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "Verzamelaar beheren" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " (De)Pauzeren Server" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Server afsluiten" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Afsluiten" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Gebruik deze opbouw: add enz" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Controleren van %d links:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Bestand bestaat niet." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad was afgesloten" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Server status weergeven" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Downloads in wachtrij weergeven" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Downloads in verzamelaar weergeven" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Pakketten toevoegen aan wachtrij" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Pakket toevoegen aan verzamelaar" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Bestanden verwijderen uit Wachtrij/Verzamelaar" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Pakketten verwijderen uit Wachtrij/Verzamelaar" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Verplaats pakketten van Wachtrij naar Verzamelaar of omgekeerd" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Bestanden herstarten" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Pakketten herstarten" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Controleer online status, werkt met lokale container" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Controleert de online status van een container bestand" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Server pauzeren" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "downloads hervatten" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Pauzeren/Starten" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "server afsluiten" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Lijst met commands:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Kan configuratiebestand voor gebruiker niet aanmaken" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Om verbinding te maken met deze pyLoad Core is py-openssl nodig." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Adres: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Poort: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Gebruikersnaam: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Wachtwoord: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Login gegevens verkeerd." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Kan geen verbinding maken met %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Om verbinding te maken met pyLoad is py-openssl noodzakelijk." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Interactieve modus wordt genegeerd, omdat je commando's hebt ingevult." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Pakket toevoegen:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Naam invullen voor nieuw pakket" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Pakket: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Parse de links die je wilt toevoegen." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Type %s als het klaar is." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Toegevoegde links: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " terug naar hoofdmenu" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Pakketten beheren:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Links beheren:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Wat wil je verplaatsen?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Wat wil je verwijderen?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Wat wil je herstarten?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Kies wat je wilt doen of vul pakketnummer in." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "verwijderen" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "verplaatsen" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "herstarten" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - vorige" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - volgende" diff --git a/locale/nl/LC_MESSAGES/setup.po b/locale/nl/LC_MESSAGES/setup.po index ed88ba315..23a10b62a 100644 --- a/locale/nl/LC_MESSAGES/setup.po +++ b/locale/nl/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "j" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Welkom bij de pyLoad configuratie assistent." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Deze zal uw systeem controleren en de basissetup uitvoeren." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "De waarden tussen de haakjes [] zijn de standaardwaarden," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "mocht het zo zijn dat u deze niet wil veranderen of indien u niet zeker bent, druk op enter." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Let op: u kunt altijd deze setup herstarten met de --setup of -s parameter als u pyload.py start." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Mocht u problemen hebben met deze assistent druk op STRG-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "om af te sluiten en de assistent niet meer automatisch te starten." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Als u klaar bent voor de systeemcontrole, druk op enter." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "U heeft pycurl, sqlite en python 2.5, 2.6 of 2.7 nodig om pyLoad te starten." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Corrigeer dit en herstart pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "De setup zal nu afbreken." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Systeemcontrole is uitgevoerd, druk op enter om het statusbericht te zien." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "ssl verbinding" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "automatische captcha ontcijfering" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "uitgebreide Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Functies beschikbaar:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Missende functies: " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "geen py-crypto beschikbaar" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "U heeft dat nodig om container bestanden te openen." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "geen SSL beschikbaar" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Dit is nodig om een beveiligde verbinding in te stellen naar de core of de webinterface." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Als u pyLoad enkel lokaal gebruikt is SSL overbodig." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "geen captcha herkenning beschikbaar" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Wordt alleen gebruikt bij enkele hosters als freeuser." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "GUI niet beschikbaar" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "De grafische gebruikersomgeving." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "geen JavaScript engine gevonden" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "U heeft dit nodig voor bepaalde Click'N'Load links. Instaleer Spidermoney, ossp-js, pyv8 of rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "U kunt nu setup afbreken en enkele afhankelijkheden installeren als u dat wilt." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Doorgaan met setup?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Wilt u de configuratiemap aanpassen? Huidige is %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Als u pyLoad op een server gebruikt of de home partitie bevindt zich op intern flash-geheugen, is het een goed idee om het te veranderen." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Verander configmap?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Wilt u login gegevens en basisinstellingen configureren?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Dit is aan te raden bij een eerste start." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Basissetup creëren?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Wilt u SSL configureren?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "SSL configureren?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Wilt u de webinterface configureren?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Webinterface configureren?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Setup is succesvol voltooid." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Druk op enter om af te sluiten en start pyLoad opnieuw" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Syteemcontrole ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Uw python versie is te nieuw, gebruik python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Uw python versie is te oud, gebruik minstens python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Python versie: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Uw gestalleerde versie %s van jinja2 is te oud." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "U kan veilig verder, alleen de webinterface zal niet werken." -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "Upgrade of verwijder het, pyLoad komt zelf met een goede jinja2 versie." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Basisinstellingen ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "De volgende logingegevens zijn geldig voor CLI, GUI en webinterface." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Gebruikersnaam" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Externe cliënten (GUI, CLI of andere) hebben externe toegang nodig om te werken over het netwerk." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Als je enkel de webinterface wil gebruiken mag je het uitschakelen om RAM te besparen." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Externe toegang inschakelen" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Taal" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Downloadmap" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Maximale parallele downloads" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Gebruik reconnect?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Reconnect script pad" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Webinterface setup ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Activeer webinterface?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Listen adres, als u 127.0.0.1 of localhost gebruikt is de webinterface alleen lokaal beschikbaar." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Adres" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Poort" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad beschikt over een aantal server backends, nu volgt een korte uitleg." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Standaard server, de beste keuze als je niet weet welke je moet kiezen." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Deze server beschikt over SSL en is een goed alternatief voor de interne server." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Kan gebruikt worden door apache, lighttpd, vereist configuratie wat niet makkelijk te doen is." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Super snel alternatief geschreven in C, vereist verstand van libev en linux." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Download het hier: https://github.com/jonashaag/bjoern, compile het" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "en kopieer bjoern.so naar modele/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Opgelet: In sommige gevallen werkt de builtin server niet, als je problemen hebt met de webinterface." -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "kom terug en verander de builtin server naar de threaded server." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Server" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## SSL setup ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Voer de volgende commando's uit vanuit pyLoad configuratiemap om ssl certificaten te maken:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Als de commando's succesvol uitgevoerd zijn kunt u SSL nu activeren." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "SSL activeren?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Aktie selecteren" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Aanmaken/wijzigen gebruiker" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Lijst met gebruikers" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Gebruiker verwijderen" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Afsluiten" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Gebruikers" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Nieuwe configuratiemap wordt ingesteld, uw huidige configuratie wordt niet overgenomen!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Configuratiepad" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Configuratiepad is veranderd en setup zal nu afsluiten, herstart setup om verder te gaan." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Druk op enter om af te sluiten." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Instellen van configuratiepad mislukt: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: mist" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Wachtwoord: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Wachtwoord te kort. Gebruik ten minste 4 symbolen." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Wachtwoord (nogmaals): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Wachtwoorden kwamen niet overeen." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "ja" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "waar" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "w" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "nee" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "niet waar" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "nw" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Ongeldige invoer" diff --git a/locale/no/LC_MESSAGES/django.po b/locale/no/LC_MESSAGES/django.po index 069e9851e..37c9905c9 100644 --- a/locale/no/LC_MESSAGES/django.po +++ b/locale/no/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/no/LC_MESSAGES/pyLoad.po b/locale/no/LC_MESSAGES/pyLoad.po index 4301f0e07..917ddf78c 100644 --- a/locale/no/LC_MESSAGES/pyLoad.po +++ b/locale/no/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/no/LC_MESSAGES/pyLoadCli.po b/locale/no/LC_MESSAGES/pyLoadCli.po index 6853d47a2..9289aa524 100644 --- a/locale/no/LC_MESSAGES/pyLoadCli.po +++ b/locale/no/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/no/LC_MESSAGES/setup.po b/locale/no/LC_MESSAGES/setup.po index 1d3d4bd71..634f65415 100644 --- a/locale/no/LC_MESSAGES/setup.po +++ b/locale/no/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/pa/LC_MESSAGES/django.po b/locale/pa/LC_MESSAGES/django.po index 8b2152180..4544bcc10 100644 --- a/locale/pa/LC_MESSAGES/django.po +++ b/locale/pa/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/pa/LC_MESSAGES/pyLoad.po b/locale/pa/LC_MESSAGES/pyLoad.po index 34a0719a1..89d3570f1 100644 --- a/locale/pa/LC_MESSAGES/pyLoad.po +++ b/locale/pa/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/pa/LC_MESSAGES/pyLoadCli.po b/locale/pa/LC_MESSAGES/pyLoadCli.po index 2c76600d5..6e1cd038f 100644 --- a/locale/pa/LC_MESSAGES/pyLoadCli.po +++ b/locale/pa/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/pa/LC_MESSAGES/setup.po b/locale/pa/LC_MESSAGES/setup.po index bc7f27197..5998f2af7 100644 --- a/locale/pa/LC_MESSAGES/setup.po +++ b/locale/pa/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/pl/LC_MESSAGES/django.po b/locale/pl/LC_MESSAGES/django.po index cbcf51c8d..e44012bae 100644 --- a/locale/pl/LC_MESSAGES/django.po +++ b/locale/pl/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Nowy obrazek (captcha)" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Proszę przeczytać tekst z obrazka." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad zrestartowano" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "Wył" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Powodzenie" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "Wł" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Na pewno chcesz zamknąć" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Zrestartuj link" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Usuń link" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Podaj nazwę paczki" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Proszę kliknij na prawej stronie obrazka" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "błąd" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Folder jest pusty" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Niepowodzenie" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Brak obrazków (captcha) do odczytania." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Hasło nie pasuje" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Ustawienia zapisano" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Nowy folder" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Czy chcesz zrestartować pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "czekaj %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Obecnie pobierane" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Pobrane" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Logi" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Konfiguracja" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Nazwa" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Status" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Informacja" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Rozmiar" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Postęp" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Logowanie" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Nazwa użytkownika" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Hasło" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Nieprawidłowa nazwa użytkownika lub hasło. Proszę spróbować ponownie." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Aby zresetować dane logowania lub dodać użytkownika uruchom komendę:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Usuń zakończone" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Nieudany restart" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Katalog:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Hasło:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Edytuj paczkę" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Tutaj edytuj szczegóły paczki." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Nazwa paczki." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Folder" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Nazwa podfolderu dla wskazanych pobrań." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Lista haseł używanych do rozpakowywania." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Wyślij" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Resetuj" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Wylogowano pomyślnie." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Ścieżka" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "bezpośrednia" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "względna" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "nazwa" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "rozmiar" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "rodzaj" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "ostatnio zmodyfikowany" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "katalog główny" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "brak treści" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Ogólne" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Wtyczki" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Konta" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Wybierz sekcję z menu" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Plugin" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Ważne do" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Pozostały transfer" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Czas" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Maksymalnie jednoczesnych pobrań" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Skasować?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "Ważny" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "nie ważny" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "tak" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "nie" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Dodaj" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Dodaj konto" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Podaj swoje dane konta do korzystania z funkcji premium." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Nazwa użytkownika." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Hasło dla tego konta." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Typ" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Wybierz hosting dla Twojego konta." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Uruchom" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "poprzedni" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "następny" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Koniec" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Wiadomości" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Wsparcie" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "System operacyjny:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "Wersja pyLoad:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Folder instalacji:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Folder konfiguracji:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Folder pobierania:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Wolne Miejsce:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Język:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Port interfejsu web:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Port interfejsu zdalnego:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Ustawienia" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Menedżer plików" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Dodaj paczkę" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Wklej linki lub wczytaj kontener." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Nazwa nowej paczki." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Linki" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Tutaj wklej linki lub dowolny tekst i wciśnij przycisk filtra." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtruj adresy url" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Hasło do archiwum RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Plik" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Wczytaj kontener." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Miejsce docelowe" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Odczyt captcha" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "Captcha (obrazek)" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Tekst" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Wprowadź tekst z obrazka (captcha)." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Zamknij" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Interfejs Web" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Dostępna aktualizacja dla pyLoad'a!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Wtyczki zaktualizowane, zrestartuj program!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Oczekiwanie na captcha" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Wyloguj" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Zarządzaj" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Informacje" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Zaloguj się!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Zatrzymaj" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Anuluj" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Pobrane:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Połącz ponownie:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Prędkość:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Aktywny:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Odśwież stronę" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "wczytywanie" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Powrót na początek strony" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Zamknij pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Zrestartuj pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Aby dodać użytkownika lub zmienić hasło użyj:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Uwaga: Administrator ma zawsze wszystkie prawa!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Zmiana Hasła" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Administrator" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Uprawnienia" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "zmień" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Wprowadź swoje hasło" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Użytkownik" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Aktualne hasło" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Nowe hasło" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Nowe hasło." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Nowe hasło (powtórz)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Proszę powtórzyć nowe hasło." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Nie posiadasz uprawnień dostępu do tej strony." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Nie znaleziono katalogu pobierania." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "Bez limitu" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "niedostępny" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Użyj polecenia pyload.py-s aby uzyskać dostęp do ustawień" diff --git a/locale/pl/LC_MESSAGES/pyLoad.po b/locale/pl/LC_MESSAGES/pyLoad.po index f7ca6734d..6247f50c8 100644 --- a/locale/pl/LC_MESSAGES/pyLoad.po +++ b/locale/pl/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Otrzymano sygnał zakończenia" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad jest już uruchomiony - proces %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Niepowodzenie przy zmianie grupy: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Niepowodzenie przy zmianie użytkownika: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "katalog na logi" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Rozpoczynam" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Używam katalogu domowego: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto deszyfruje pliki kontenera" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "katalog dla plików tymczasowych" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "katalog na pobrane pliki" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL dla połączenia szyfrowanego" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Przenoszę starą konfigurację użytkownika do Bazy Danych" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Sprawdź dane logowania komendą ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Wszystkie linki zostały usunięte" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Czas pobierania: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Wolne miejsce: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Aktywacja kont ..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Włączanie wtyczek ..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad jest uruchomiony i działa" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "restartuję pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad kończy działanie" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Zainstaluj %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "nie można znaleźć %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "nie można utworzyć %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "wyłączanie..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "błąd przy wyłączaniu" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "proces pyLoad wyłączono z poziomu terminala" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "Baza plików została usunięta z powodu braku niekompatybilnej wersji." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "Nie można przekonwertować Bazy plików." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "Przekonwertowano Bazę Danych z wersji v2 do v3. " -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "Przekonwertowano Bazę Danych z wersji v3 do v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Konwertuję bazę Django do nowszej wersji" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "zakończono" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "zakolejkowane" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "pominięte" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "oczekuję" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "tymczasowo offline" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "rozpoczynam" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "niepowodzenie" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "anulowno" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "rozkodowuję" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "własny" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "pobieranie" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "przetwarzanie" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "nieznany" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Paczka ukończona: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Użyj SSL ThriftBackend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Błąd zdalnego zaplecza: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Uruchamiam %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Bład ładowania backendu %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "czekaj %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "Nie znaleziono certyfikatów SSL." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Nie zalecamy uruchamiania %s bezpośrednio z pyLoad - zaprzestano wsparcia" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Możesz wykorzystać wielowątkowy serwer oferujący dobrą wydajność i szyfrowanie ssl," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "oczywiście nadal możesz używać %s z serwerem pyLoad fastcgi " -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "przykładowe konfiguracje znajdziesz w podkatalogu module/webui/servers " +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "przykładowe konfiguracje znajdziesz w podkatalogu pyload/webui/servers " -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Nie można użyć %(server)s - niezainstalowany python-flup " -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Błąd importu lightweight server: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Należy pobrać i skompilować bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Skopiuj plik boern.so do folderu module/lib lub użyj polecenia setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Skopiuj plik boern.so do folderu pyload/lib lub użyj polecenia setup.py install" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Oczywiście trzeba znać Linuksa i wiedzieć, jak się kompiluje programy" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Ze względu na znane problemy z wydajnością w systemie Windows ustaw serwer na threaded" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Ten serwer nie wspiera SSL, należy rozważyć użycie serwera threaded" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Uruchamiam wbudowany webserwer: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Uruchamiam wielowątkowy webserwer z szyfrowaniem SSL: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Uruchamiam wielowątkowy serwer: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Uruchamiam serwer fastcgi: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Uruchamianie serwera lightweight (bjoern):% (host) s:% (port) d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Nie posiadasz uprawnień dostępu do tej strony." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Nie znaleziono katalogu pobierania." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "Bez limitu" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "niedostępny" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Użyj polecenia pyload.py-s aby uzyskać dostęp do ustawień" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Pobranie fragmentów nie powiodło się, powrót do pojedynczego połączenia | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Pobieranie rozpocznie się: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Pobieranie zakończono: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Wtyczka %s nie zawiera funkcji." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Pobieranie przerwane: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Pobieram ponownie: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Pobieranie jest wyłączone: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Pobieranie jest tymczasowo niedostępne:% s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Pobieranie nie powiodło się: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Brak połączenia z hostem lub połączenie zostało zresetowane, zaczekaj 1 minutę i spróbuj ponownie." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Pominięto pobieranie: %(name)s z powodu %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Rozpoczęto rozszyfrowywanie: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Rozszyfrowywanie nie powiodło się: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Ponawianie %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Pobieranie informacji o %(name)s nie powiodło się | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Błąd przy uruchomieniu: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Nie powiodła się aktywacja %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Aktywne wtyczki:% s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Nieaktywne wtyczki:% s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Nieudane ponowne łączenie: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Nie znaleziono skryptu ponownego łączenia!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Uruchamiam ponowne łączenie" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Niepowodzenie przy uruchamianiu skryptu ponownego łączenia!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Ponownie połączony, nowe IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Zbyt mało miejsca na dysku" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Nie można zalogować się na koncie %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Hasło nieprawidłowe" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "Format czasu %s jest nieprawidłowy, użyj: 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "Konto % s generuje zbyt mały ruch, sprawdź ponownie za 30min" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "Konto %s wygasło, sprawdź ponownie za 1godz" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Osiągnięto limit transferu" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s zawiera błędny wzorzec." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Błąd przy imporcie %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Nie załadowano Hostera" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Uaktywnij pobieranie bezpośrednie w ustawieniach swojego konta Bitshare" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "Nie można wyczyścić zawartości LinkList." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Ustawienia konta usunięto po wprowadzeniu nowego formatu konfiguracji." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Wymagana autoryzacja (użytkownik:hasło)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Proszę wejść na konto %s lub wyłączyć wtyczkę" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "W pobranym pliku (%s) był kod HTML... przekierowanie błędu? Pobieranie zostanie uruchomione ponownie." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Plik czasowo niedostępny" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: Oczekiwanie pomiędzy pobraniami %d s." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: czekam na captcha %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Pobrany plik był pusty" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "niepoprawny klucz API" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Pozostało zbyt mało transferu" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Przekroczono transfer" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Współdzielenie ruchu (bezpośrednie pobieranie)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Trwa pobieranie spod tego adresu IP. Odczekaj 60 sekund" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Błędny kod autoryzacji. Pobieranie zostanie wznowione" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidshareCom: Brak wolnych slotów" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Ten plik wymaga konta premium" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Zgłoszono nieprawidłową nazwę pliku" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Błąd równoległego pobierania, odczekaj 60s." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Nie zalogowany." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Odszyfrowywanie nie powiodło się" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Nie umieszczono plik klucza w adresie URL" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Kod błędu:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Plik nie istnieje." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Wtyczki zostały zaktualizowane, proszę zrestartować pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Wtyczki zaktualizowane i przeładowane" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Brak dostępnych aktualizacji wtyczek" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Brak aktualizacji dla pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Dostępna nowa wersja %s ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Pobierz stąd: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Brak połączenia z serwerem aktualizacji" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Nowa wersja %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Podczas aktualizacji wystąpił bląd %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Niezgodność wersji" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Pobieranie zakończono: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Nowe żądanie captcha: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "W odpowiedzi użyj 'c %s tekst z captcha'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Najpierw dodaj swoje konto premium.to i zrestartuj pyLoad" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Dodano %s z HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "Nie zainstalowano %s" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Nie można aktywować %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Aktywowany" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Brak aktywnych wtyczek do rozpakowywania plików" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Pakiet %s zakolejkowany do rozpakowania" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Sprawdzanie paczki %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Wypakowano %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Nie znaleziono plików do rozpakowania" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "wypakowuję" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Zabezpieczone hałsem" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Nieprawidłowe hasło" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Usuwanie %s plików" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Wypakowanie zakończone" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Błąd archiwum" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "Nieprawidłowa suma kontrolna CRC" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Wystąpił nieznany błąd" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Ustawienie użytkowników i grup nie powiodło się: %s" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Wtyczka Click'N'Load: Port 9666 jest zajęty" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "Pozostało %s punktów" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Nie może wysłać odpowiedzi." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Posiadasz zbyt małą ilość punktów na koncie CaptchaTrader" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Nie odnaleziono listy Crypter" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Lista Crypter jest pusta" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Pobieranie zakończono: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Nowe CaptchaID z uploadu: %s: %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Twoje konto captcha 9kw.eu nie ma wystarczająco kredytów" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Zainstalowane skrypty dla %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Niewykonywalny skrypt:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Błąd w %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Twoje konto ExpertDecoders nie ma wystarczająco kredytów" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Najpierw dodaj swoje konto rehost.to i zrestartuj pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Dodaj najpierw ważne konto premiumize.me i zrestartuj pyLoad." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "Pozostało %s punktów" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Nie zainstalowano modułów pil i tesseract oraz brak połączenia z serwisem dekodującym captcha" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Żaden z serwisów nie odkodowal captcha w dopuszczalnym czasie. " -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Ustawienia użytkowników i grup nie powiodło się: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Odkodowanie Captcha nieaktywne" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Dodano paczkę %(name)s zawierającą %(count)d linków" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Dodano %(count)d linków do paczki #%(package)d" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Nie znaleziono silnika JavaScript, zainstaluj SpiderMonkey, ossp-js, pyv8 lub rhino" diff --git a/locale/pl/LC_MESSAGES/pyLoadCli.po b/locale/pl/LC_MESSAGES/pyLoadCli.po index eebdeeba7..44144e7dd 100644 --- a/locale/pl/LC_MESSAGES/pyLoadCli.po +++ b/locale/pl/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "Interfejs Linii Komend" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s Pobrań:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "Prędkość:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "Rozmiar:" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "Zakończono w:" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "ID:" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "Oczekiwanie:" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "Wstrzymane" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "Aktywne" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "Prędkość pobierania" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Pliki w kolejce" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Ogółem" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "Dodaj linki" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Zarządzaj kolejką" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Zarządzanie poczekalnią linków" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "Zatrzymaj/Wznów serwer" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "Wyłącz serwer" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "Wyjście" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Używamy składni: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Sprawdzanie linków %d:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Plik nie istnieje." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad został wyłączony" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Wyświetla status serwera" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Wyświetla pobierane pliki z kolejki" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Wyświetla pobierane pliki z poczekalni" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Dodaje pakiet do kolejki" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Dodaje paczkę do poczekalni" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Usuń pliki z Kolejki/Poczekalni" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Usuń Paczki z Kolejki/Poczekalni" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Przenoszenie paczek z kolejki do poczekalni i odwrotnie" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Zrestartuj pliki" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Zrestartuj paczki" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Sprawdź status online, współpracuje z lokalnym kontenerem" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Sprawdź stan online pliku kontenera" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Wstrzymaj serwer" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "kontynuuj pobieranie" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Wstrzymaj/Wznów" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "wyłącz serwer" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Lista poleceń:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Nie można zapisać pliku konfiguracyjnego" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Do połączenia z pyLoad Core wymagana jest instalacja py-openssl." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Adres:" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Port:" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Użytkownik:" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Hasło:" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Błędne dane logowania." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Nie można połączyć z %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Do połączenia z pyLoad Core wymagana jest instalacja py-openssl." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Tryb interaktywny wyłączono po wprowadzonych komendach." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Dodaj pakiet:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Wprowadź nazwę dla nowego pakietu" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Pakiet: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Analizuj linki które chcesz dodać." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Napisz %s gdy ukończone." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Dodanych linków:" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "powrót do głównego menu" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Zarządzanie pakietami:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Zarządzaj linkami:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Czy chcesz przenieść?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Czy na pewno chcesz usunąć?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Czy chcesz zrestartować?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Wybierz, co chcesz wykonać lub wprowadź numer paczki." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "skasuj" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "przenieś" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "Restart" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "- poprzedni" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - następny" diff --git a/locale/pl/LC_MESSAGES/setup.po b/locale/pl/LC_MESSAGES/setup.po index 9bebff39f..a05658825 100644 --- a/locale/pl/LC_MESSAGES/setup.po +++ b/locale/pl/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "t" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Witamy w asystencie konfiguracji pyLoad." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Dokona sprawdzenia systemu i ustawi podstawowe parametry potrzebne do uruchomienia pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "Wartość w nawiasach kwadratowych [] jest zawsze domyślną," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "jeśli nie chcesz zmieniać wartości lub nie masz pewności co wybrać, naciśnij enter." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Nie zapomnij: kiedy uruchamiasz pyload.py zawsze możesz ponownie wybrać asystenta dodając parametr --setup lub -s." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Jeśli masz jakiekolwiek problemy z asystentem wciśnij Ctlr-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "aby go zatrzymać i nie pozwolić mu automatycznie uruchomić się z pyload.py . " -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Naciśnij enter jak będziesz gotowy na sprawdzenie systemu." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Potrzebujesz pycurl, sqlite i pythona 2.5, 2.6 lub 2.7 aby uruchomić pyLoad." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Proszę popraw to i ponownie uruchom pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Instalator teraz zakończy działanie." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Zakończono sprawdzanie systemu, naciśnij enter w celu obejrzenia raportu." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Stan ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "rozszyfrowywanie kontenerów" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "połączenie SSL" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "automatyczne rozpoznawanie captcha" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Interfejs Web" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "rozszerzone Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Dostępne funkcje:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Niedostępne funkcje:" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "py-crypto jest niedostępny" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Potrzebujesz go jeśli chcesz rozszyfrowywać pliki kontenerowe." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL niedostępny" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Jest to potrzebne jeśli chcesz nawiązywać szyfrowane połączenia z Core lub interfejsem Web." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Jeśli chcesz mieć dostęp tylko lokalny - SSL nie jest użyteczne." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "brak rozpoznawania captcha" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Potrzebne tylko do niektórych serwisów dla kont darmowych." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "Interfejs graficzny niedostępny" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "Graficzny Interfejs Użytkownika." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "nie znaleziono silnika JavaScript" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Do dodania kilku linków jednocześnie będziesz potrzebował Click'N'Load. Zainstaluj SpiderMonkey, ossp-js, pyv8 lub rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Możesz przerwać instalator i naprawić niektóre zależności." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Kontynuować instalację?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Czy chcesz zmienić ścieżkę do plików konfiguracji? Obecnie to %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Jeśli używasz pyLoad'a na serwerze lub partycji home która znajduje się na pamięci flash - dobrym pomysłem może być zmiana tego parametru." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Zmienić ścieżkę dla plików konfiguracji?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Czy chcesz dokonać konfiguracji logowania i ustawień podstawowych?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Jest to wymagane przy pierwszym uruchomieniu." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Stworzyć podstawowe ustawienia?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Czy chcesz ustawić SSL?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Ustawić SSL?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Czy chcesz ustawić interfejs Web?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Ustawić interfejs Web?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Instalacja zakończona pomyślnie." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Naciśnij enter aby wyjść i ponownie uruchom pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Sprawdzenie systemu ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Zainstalowana wersja Python'a jest zbyt nowa, Proszę użyć wersji 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Zainstalowana wersja Python'a jest zbyt stara, Proszę użyć przynajmniej wersji 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Wersja Python'a: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Zainstalowana jinja2 w wersji %s jest przestarzała." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Możesz kontynuować pracę, ale interfejs Web nie będzie czynny," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "uaktualnij lub odinstaluj, pyLoad zawiera odpowiednią wersję biblioteki jinja2." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "silnik Java Skrypt" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Podstawowe Ustawienia ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Następujące parametry logowania są odpowiednie dla CLI, GUI i interfejsu Web." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Nazwa użytkownika" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Klienty zewnętrzne (GUI, CLI lub inne) potrzebują zdalnego połączenia do działania przez sieć." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Jeżeli chcesz używać tylko interfejsu web możesz dezaktywować to aby zaoszczędzić pamięć." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Włącz zdalny dostęp" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Język" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Folder pobierania" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Maksymalna liczba jednoczesnych pobrań" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Używać ponownego łączenia?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Lokalizacja skryptu do ponownego łączenia" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Ustawienia interfejsu Web ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Aktywować interfejs Web?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Adres do nasłuchu, jeśli użyjesz 127.0.0.1 lub localhost, interfejs Web będzie dostępny jedynie lokalnie." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Adres" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Port" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad oferuje kilka typów serwerów backends, a teraz po krótce wyjaśniam." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Serwer domyślny, najlepszy wybór, jeśli nie wiesz który wybrać." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Ten serwer wspiera SSL i jest dobrą alternatywą dla builtin." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Może być używany przez apache, lighttpd, wymaga od Ciebie ich konfiguracji, która nie jest zbyt łatwym zadaniem." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Bardzo szybka alternatywa, napisany w C, wymaga libev i znajomości Linuxa" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Pobierz go stąd: https://github.com/jonashaag/bjoern, i skompiluj go" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "i skopiuj plik bjoern.so do katalogu module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "i skopiuj plik bjoern.so do katalogu pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Uwaga: W pewnych, rzadkich przypadkach serwer builtin nie działa, jeśli występują problemy z interfejsem WWW" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "wróć tu i zmień serwer builtin na threaded" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Serwer" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Ustawienia SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "W celu wygenerowania certyfikatów ssl uruchom następujące komendy z katalogu pyload:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Jeśli wszystko pomyślnie się zakończyło, możesz aktywować SSL." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Aktywować SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Wybierz działanie" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1- Utwórz/Edutuj użytkownika" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2- Pokaż użytkowników" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Usuń użytkownika" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4- Wyjście" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Użytkownicy" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Ustawiam nową ścieżkę do plików konfiguracji, obecna konfiguracja nie zostanie tam przeniesiona!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Ścieżka do plików konfiguracji" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Ścieżka do plików konfiguracji została zmieniona, Instalator zostanie teraz zamknięty, uruchom go ponownie, aby przejść dalej." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Naciśnij Enter aby zakończyć." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Ustawienie ścieżki do plików konfiguracji nie powiodło się: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: brakuje" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Hasło:" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Hasło za krótkie. Użyj przynajmniej 4 znaków." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Hasło (ponownie):" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Hasło nie pasuje" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "tak" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "prawda" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "nie" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "fałsz" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Błędne dane" diff --git a/locale/pt/LC_MESSAGES/django.po b/locale/pt/LC_MESSAGES/django.po index 6b0a4f5bc..07d1ea2f8 100644 --- a/locale/pt/LC_MESSAGES/django.po +++ b/locale/pt/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Pedir novo Captcha" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Por favor leia o texto do captcha." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad reiniciou" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "desligado" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Sucesso" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "ligado" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Tem a certeza que quer sair do pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Reiniciar Link" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Apagar Link" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Introduza o nome do pacote." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Por favor clique na posição correta do captcha." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Ocorreu um erro." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Pasta vazia" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Falhou" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Sem Captchas para ler." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "As senhas não correspondem." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Configurações guardadas." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Nova pasta" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Tem a certeza que deseja reiniciar o pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Downloads Activos" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Inicio" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Registo de ocorrências" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Configuração" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Nome" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Status" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Informação" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Tamanho" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Progresso" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Login" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Nome do usuário" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Senha" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "O utilizador e a senha não correspondem. Tente novamente." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Para restabelecer a sua informação de login ou adicionar um utilizador execute:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Apagar os terminados" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Reinício falhou" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Pasta:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Senha:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Editar Pacote" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Edite os detalhes do pacote abaixo." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "O nome do pacote." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Pasta" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Nome da sub-pasta para estes downloads." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Lista das passwords usadas para extrair." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Enviar" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Restabelecer" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Terminou a sessão com sucesso." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Caminho" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absoluto" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relativo" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "nome" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "tamanho" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "tipo" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "última modificação" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "diretoria superior" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "sem conteúdo" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Geral" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Contas" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Escolha uma das secções do menu" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Plugin" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Válida até" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Tráfego remanescente" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Tempo" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Máximos Paralelos" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Apagar?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "válido" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "não válido" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "sim" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "não" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Adicionar" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Adicionar conta" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Introduza os dados da sua conta para utilizar as características premium." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "O seu nome de utilizador." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "A senha para esta conta." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Tipo" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Escolha o host da sua conta." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Iniciar" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "anterior" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "próximo" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Fim" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Novidades" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Ajuda" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Sistema" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "SO:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "Versão do pyLoad:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Pasta de instalação:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Pasta das configurações:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Pasta de Downloads:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Espaço Livre:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Idioma:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Porta do Webinterface:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Porta do interface remoto:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Configurações" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Adicionar pacote" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Introduza os seus links ou carregue um container." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Nome do novo pacote." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Introduza aqui os seus links ou texto e carregue no botão filtrar." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtrar urls" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Senha para o arquivo RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Ficheiro" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Carregar um container." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Destino" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "A ler captcha" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "O captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Texto" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Introduza o texto do captcha." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Fechar" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Atualização do pyLoad disponível!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Plugins atualizados, por favor reinicie!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha a aguardar" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Sair" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administrar" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Informações" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Inicie a Sessão!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Parar" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Cancelar" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Restabelecer ligação:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Velocidade:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Activo:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Atualizar página" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "a carregar" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Voltar para o topo" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Sair do pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Reiniciar pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Para adicionar um utilizador ou alterar senhas utilize:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Importante: o Administrador tem sempre todas as permissões!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Alterar a senha" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Administrador" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Permissões" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "alterar" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Introduza a sua senha actual e a desejada." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Utilizador" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Senha atual" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Nova senha" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "A nova senha." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "A nova senha (repetir)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Por favor repita a nova senha." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "ilimitado" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/pt/LC_MESSAGES/pyLoad.po b/locale/pt/LC_MESSAGES/pyLoad.po index 00f04a239..3dbe39ee1 100644 --- a/locale/pt/LC_MESSAGES/pyLoad.po +++ b/locale/pt/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "sinal de Sair recebido" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad já está rodando com pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Falha ao trocar grupo: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Falha ao trocar de usuario: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Iniciando" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Usando diretório: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Todos os links foram removidos" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Espaço livre: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Ativando contas..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad está rodando" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "reiniciando pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad fechou" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "desligando..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "erro durante desligamento" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "Terminado" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "Offline" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "Online" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "em fila" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "ignorada" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "esperando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "Temp. off-line" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "iniciando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "falhou" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "abortada" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "descriptografando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "personalizado" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "Transferindo" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "processando" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "desconhecido" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Pacote finalizado: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Erro de back-end remoto: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Iniciando %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Falha ao carregar back-end %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "Certificado SSL não encontrado." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Este servidor não oferece SSL, por favor, considere usar HTTP{?} em vez disso" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "ilimitado" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "pedaços do Download falharam, retornar para conexão simples |%s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Inicio do Download: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Termino do Download: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Plugin %s está sem uma função." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Download abortado: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Download reiniciado: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Download está offline: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Download esta temporariamente offline: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Download falhou: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Impossível conectar com o host ou a conexão receptou, tentar novamente em 1 minuto." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Download pulado: %(name)s pois %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Busca de informações para %(name)s falhou|%(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Falha de ativação %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Reconectar Falhou: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Script de reconexão não encontrado!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Iniciando reconexão" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Falha ao executar script de reconexão!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Reconectado, novo IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Espaço insuficiente no dispositivo" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Não pode ligar com a conta %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Senha incorreta" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "A conta %s não tem tráfego suficiente, checando novamente em 30 min" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "A conta %s expirou, checando novamente em 1h" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Limite de Download alcançado" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Erro ao importar %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Nenhum Hoster carregado" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Ativar Download direto em sua conta Bitshare" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Autorização necessaria (nome de usuario: senha)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Por favor entre sua %s conta ou desative este plugin" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Havia código HTML no arquivo baixado (%s)...erro de redirecionamento? O Download vai ser reiniciado." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Arquivo temporariamente indisponível" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: esperar entre os Downloads %d s." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: esperando por capacha %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Arquivo baixado estava vazio" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "Chave de API inválida" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Tráfego restante insuficiente" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Tráfego excedido" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Compartilhamento de tráfego (Download direto)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Ja está baixando deste endereço de ip, espere 60 segundos" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Código de autenticação invalido, Download vai ser reiniciado" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: Sem slots vazios" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Você precisa de uma conta premium para este arquivo" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Nome do arquivo relatado como invalido" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Erro de Download paralelo, esperar 60 segundos." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Não está logado." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Descriptografia falhou" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Nenhum arquivo chave fornecido na URL" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Codigo do erro:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Plugins foram atualizados, por favor reinicie o pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Plugins atualizados e recarregados" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Nenhuma atualização de plugin disponível" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Nenhuma atualização para o pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "* * * Nova versão %s do pyLoad disponível * * *" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "* * * faça o Download em : http://pyload.org/download * * *" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Impossível conectar com o servidor de atualizações" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Nova versão de %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Erro ao atualizar %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Incompatibilidade de versão" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Download concluído: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Nova solicitação de Captcha: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Responder com 'c %s o texto no captcha'" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Adicionado %s de HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "Sem %s instalado" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Não foi possível activar o %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Ativado" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Não ha plugins de extração ativos" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Pacote %s enfileirados para extração posterior" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Verificar pacote %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Extrair para %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Arquivos não encontrados para extrair" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "extraindo" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Protegido por senha" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Senha incorreta" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Excluindo %s arquivos" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Extração terminada" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Erro de arquivo" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "Incompatibilidade de CRC" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Erro desconhecido" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Configuração de usuário e grupo falhou" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'n'Load: porta 9666 já está em uso" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s créditos sobrando" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Não pode enviar resposta." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Sua conta CaptchaTrader não tem créditos suficientes" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Lista do Crypter não encontrada" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Lista do Crypter vazia" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Download terminado: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Novo CaptchaID do upload: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Sua conta 9kw.eu não tem créditos suficientes" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "scripts instalados para %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Scrip não executável:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Erro em %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Sua conta ExpertDecoders não tem créditos suficientes" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Por favo adicione sua conta rehost.to antes de reiniciar o pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d créditos sobrando" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil e tesseract não estão instalados e nenhum cliente está conectado para reconhecimento de captcha" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Configuração de usuário e grupo falhou: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/pt/LC_MESSAGES/pyLoadCli.po b/locale/pt/LC_MESSAGES/pyLoadCli.po index 49a9ff501..847c98c40 100644 --- a/locale/pt/LC_MESSAGES/pyLoadCli.po +++ b/locale/pt/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Interface de Linha de Comandos" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Velocidade: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Tamanho: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Terminado em: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "em espera: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Estado:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "pausados" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "em execução" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "Velocidade total" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Arquivos na fila" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Adicionar Links" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Gerir Fila" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Gerir Coletor" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " Parar/Retomar servidor" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Terminar Servidor" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Sair" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Por favor, use esta sintaxe: Adicionar ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Checar %d links:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "O arquivo não existe." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad foi finalizado" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Estado do servidor de impressões" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Cópias de downloads na fila" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Cópias de downloads no coletor" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Adicionar pacotes para a fila" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Adicionar pacotes para o coletor" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Deletar arquivos da fila/coletor" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Deletar pacotes da fila/coletor" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Mover pacotes da fila para o coletor ou vice-versa" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Reiniciar arquivos" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Reiniciar pacotes" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Verificar o estado online, trabalhar com recipiente local" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Verifica o estado online de um arquivo de contêiner" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Colocar servidor em Pausa" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "continuar downloads" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Alternar pausa/retomar" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "terminar servidor" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Lista de comandos:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Não foi possível escrever o arquivo de configuração do usuário" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Endereço: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Porta: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Nome do usuário: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Senha: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Dados de login estão errados." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Não conseguiu estabelecer conexão com %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "você precisa do py-openssl para se conectar com o pyLoad core." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "O modo interativo foi ignorado pois alguns comandos foram pulados por você." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Adicionar Pacote:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Insira um nome para o novo pacote" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Pacote: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Analise os links que você deseja adicionar." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Digite %s quando terminar." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Links adicionados: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " voltar ao menu principal" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Gerenciar pacotes:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Gerenciar Links:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "O que você deseja mover?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "O que você deseja excluir?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "O que você deseja reiniciar?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "deletar" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "mover" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "reiniciar" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - anterior" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - próximo" diff --git a/locale/pt/LC_MESSAGES/setup.po b/locale/pt/LC_MESSAGES/setup.po index 66923aa8d..989c21fab 100644 --- a/locale/pt/LC_MESSAGES/setup.po +++ b/locale/pt/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "s" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Bem-vindo ao assistente de configuração do pyLoad." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Ele irá verificar o seu sistema e fazer uma configuração básica para executar o pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "O valor entre colchetes [] é sempre o valor padrão," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "no caso de você não quer mudá-lo ou você não tiver certeza qual escolher, apenas tecle enter." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Não se esqueça: você sempre pode executar novamente o assistente com os parâmetros --setup ou -s, quando você iniciar o pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "para cancelar e não deixá-lo iniciar automaticamente com pyload.py ." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Quando estiver pronto para verificação do sistema, aperte enter." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Continuar com a configuração?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Você quer alterar o caminho de configuração? O atual é %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Alterar o caminho de configuração?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Você quer configurar dados de login e configurações básicas?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Isto é recomendável para a primeira execução." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Fazer a configuração básica?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Você quer configurar o ssl?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Configurar o ssl?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Você quer configurar a interface WEB?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Configurar a interface Web?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Configuração concluída com êxito." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Aperte enter para sair e reiniciar o pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "# # Instalação basica # #" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Os dados de login à seguir é válido para o CLI, GUI e interface Web." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Nome do usuário" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Língua" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "nº Downloads paralelos" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Usar Reconectar?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Local do script de reconexão" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "# # Instalação da interface WEB# #" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Ativar webinterface?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Endereço de escuta, se você usar 127.0.0.1 ou localhost, a interface Web será acessível apenas localmente." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Endereço" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Porta" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "O pyLoad oferece vários backends de servidor, a seguir uma breve explicação." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Pode ser usado pelo apache, lighttpd, requer que você os configure, o que não é tarefa muito fácil." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Pegue-a daqui: https://github.com/jonashaag/bjoern, é só compilar" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Atenção: Em alguns casos raros o servidor builtin não está funcionando, se você notar problemas com a interface Web" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "Volte aqui e mude o servidor builtin para o threaded ." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Servidor" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "# # Configuração SSL # #" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Execute esses comandos na pasta de configuração do pyLoad para fazer certificados ssl:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Se você está pronto e tudo correu bem, você pode ativar o ssl agora." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Ativar SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Selecione a ação" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Criar/editar usuário" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Lista de usuários" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Remover usuário" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Sair" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Usuários" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Pressione Enter para sair." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "A troca do caminho de configuração falhou: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Senha: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Senha muito curta. Use pelo menos 4 caracteres." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Senha (novamente): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "As senhas não correspondem." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "sim" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "verdadeiro" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "v" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "não" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "falso" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Entrada inválida" diff --git a/locale/ro/LC_MESSAGES/django.po b/locale/ro/LC_MESSAGES/django.po index 6a4afa0d0..5dfc685da 100644 --- a/locale/ro/LC_MESSAGES/django.po +++ b/locale/ro/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/ro/LC_MESSAGES/pyLoad.po b/locale/ro/LC_MESSAGES/pyLoad.po index e798cc988..c50b5c540 100644 --- a/locale/ro/LC_MESSAGES/pyLoad.po +++ b/locale/ro/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/ro/LC_MESSAGES/pyLoadCli.po b/locale/ro/LC_MESSAGES/pyLoadCli.po index 26a3f1f88..17acda928 100644 --- a/locale/ro/LC_MESSAGES/pyLoadCli.po +++ b/locale/ro/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/ro/LC_MESSAGES/setup.po b/locale/ro/LC_MESSAGES/setup.po index aed4d803e..8520f88e1 100644 --- a/locale/ro/LC_MESSAGES/setup.po +++ b/locale/ro/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/ru/LC_MESSAGES/django.po b/locale/ru/LC_MESSAGES/django.po index 908d4684d..d6c3d748d 100644 --- a/locale/ru/LC_MESSAGES/django.po +++ b/locale/ru/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Запрос новой картинки." -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Прочитайте текст на рисунке." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "Программа pyLoad заново загружена." -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "выкл." -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Успешно" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "вкл." -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Вы уверены, что хотите закончить pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Перезапустить ссылку" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Удалить ссылку." -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Введите имя контейнера." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Пожалуйста кликните на правильную позицию картинки." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Свершилась ошибка." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Папка пуста" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Сбой" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Нет рисунка для прочтения." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Пароли не совпадают." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Cохранения установок завершилась." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Новая папка" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Вы уверены, что хотите перезагрузить pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "ожидание %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Активные загрузки" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Домой" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Закачки" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Отчёты" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Настройки" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Название" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Статус" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Информация" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Размер" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Прогресс" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Логин" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Пользователь" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Пароль" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Неправильные имя пользователя или пароль! Попробуйте еще раз." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Для сброса своих данных или добавления нового пользователя запустите: " -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Удалить завершённые" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Перезапустить неудавшиеся" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Папка:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Пароль:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Редактировать контейнер" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Редактирование деталей контейнера." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Имя контейнера." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Папка" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Имя подпапки для этих загрузок." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Список паролей, используемых для распаковки." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Отправить" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Сброс" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Вы успешно вышли." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Путь" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "абсолютный" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "относительный" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "имя" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "размер" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "тип" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "последнее изменение" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "родительская папка" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "отсутствует содержимое" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Основные" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Плагины" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Аккаунты" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Выберите секцию меню" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Приложение" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "Премиум аккаунт" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Годен до" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Осталось трафика" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Время" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Макс. потоков" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Удалить?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "действителен" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "не годен" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "да" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "нет" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Добавить" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Добавление учетной записи" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Укажите премиум аккаунт для использования всех его возможностей." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Имя пользователя." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Пароль для этой учетной записи." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Тип" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Выберите хостинг." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Начало" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "пред." -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "след." -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Конец" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Новости" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Поддержка" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Система" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "ОС:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "Версия pyLoad:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Папка установки:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Папка настроек:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Папка скачанного:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Свободно:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Язык:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Порт WEB интерфейса:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Порт удаленного управления:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Установка" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Файл менеджер" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Добавить контейнер" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Вставьте ссылки или загрузите контейнер." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Имя нового контейнера." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Ссылки" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Вставьте здесь ссылки и нажмите \"Фильтр\"" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Фильтр" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Пароль для архива RAR" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Файл" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Загрузить контейнер." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Назначение" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Чтение картинки" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "Картинка" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Картинка." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Текст" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Введите текст с картинки." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Закрыть" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Web-интерфейс" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Доступны обновления pyLoad!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Плагины обновлены, перезапустите pyLoad!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Ожидаем рисунок" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Выйти" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Администрирование" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Информация" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Пожалуйста, войдите со своими учётными данными!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Стоп" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Отменить" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Загрузка:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Переподключение:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Скорость:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Активные:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Обновить страницу" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "загрузка" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Вверх" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Завершить pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Перезапустить pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Для добавления пользователя или изменения пароля:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Внимание: администратор уже обладает всеми правами!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Изменить пароль" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Админ" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Права" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "изменить" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Введите текущий и желаемый пароль." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Пользователь" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Текущий пароль" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Новый пароль" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Новый пароль." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Новый пароль (повтор)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Пожалуйста повторите новый пароль." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "У вас нет прав на просмотр страницы." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Папка для закачек не найдена." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "неограниченный" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "не доступно" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Для доступа к настройкам запустите pyload.py -s." diff --git a/locale/ru/LC_MESSAGES/pyLoad.po b/locale/ru/LC_MESSAGES/pyLoad.po index 92dd4b2dc..b4fc6a768 100644 --- a/locale/ru/LC_MESSAGES/pyLoad.po +++ b/locale/ru/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Получен сигнал для завершения работы" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad уже запущен, pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Не удалось изменить группу: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Не удалось изменить пользователя: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "папка отчетов" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Запускается" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Основная папка: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto для декодирования файлов контейнеров" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "папка временных файлов" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "папка для закачек" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL для безопасного соединения" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Переместить прежнюю пользовательскую конфигурацию в БД" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Пожалуйста, проверьте свои учётные данные запустив ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Все ссылки удалены" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Время закачки: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Свободное место: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Активация аккаунта..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Активация плагина..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad загружен и работает" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "перезапуск pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "завершение работы pyLoad" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Установка %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "не могу найти %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "не могу создать %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "завершение работы..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "ошибка при завершении работы" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "pyLoad остановлен с терминала" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "Базы данных была удалена по причине несовместимой версии." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "База данных НЕ может быть преобразована." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "База данных преобразована из v2 в v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "База данных преобразована из v2 в v3." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Преобразование прежней БД Django" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "закончено" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "оф-лайн" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "он-лайн" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "в очереди" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "пропущено" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "ожидание" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "временно недоступно" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "запускается" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "завершено с ошибкой" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "прервано" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "раскодирование" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "пользовательский" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "загружается" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "обрабатывается" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "неизвестно" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Пакет завершен: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Используется SSL ThriftBackend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Ошибка удаленного сервиса: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Запуск %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Ошибка при загрузке %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "ожидание %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "SSL сертификаты не найдены." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "К сожалению, поддержка в pyLoad прекращена начиная с версии %s" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Вы можете использовать threaded сервер для повышения производительности и использования SSL," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "но можно и использовать прежний сервер %s с pyLoads fastcgi" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "Примеры конфигурации web-серверов можно посмотреть в папке module/webui/servers" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "Примеры конфигурации web-серверов можно посмотреть в папке pyload/webui/servers" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Использовать %(server)s невозможно, так как не установлен python-flup!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Этот сервер не предоставляет возможность использовать SSL, пожалуйста рассмотрите возможность использовать сервер threaded взамен выбранного" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Запуск встроенного веб-сервера django: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Запуск веб-сервера lighttpd: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Запуск threaded веб-сервера: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Запуск fastcgi-сервера: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "У вас нет прав на просмотр страницы." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Папка для закачек не найдена." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "неограниченный" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "не доступно" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Для доступа к настройкам запустите pyload.py -s." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Загрузка параллельных потоков данных завершена с ошибками, возврат к однопоточной загрузке | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Загрузка начата: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Загрузка завершена: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "В плагине %s нет функции." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Загрузка прервана: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Ошибка загрузки: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Загрузка недоступна: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Загрузка временно недоступна: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Ошибка загрузки: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Невозможно соединиться с провайдером или срыв соединения, следующая попытка через одну минуту." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Загрузка пропущена: %(name)s @ %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Декодирование начато: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Ошибка декодирования: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Повторная попытка %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Получение информации по %(name)s завершилось ошибкой | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Ощибка выполнения захватов: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Ошибка активации %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Переподключение не удалось: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Скрипт переподключения не найден!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Начинаем переподключение" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Ошибка при выполнении скрипта переподключения" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Переподключено, новый IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Не хватает места на устройстве." -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Не могу войти с учетной записью %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Неправильный пароль" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "Время %s имеет неправильный формат, используйте формат 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "Недостаточно траффика в аккаунте %s, следующая проверка через 30 минут" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "Истек срок действия аккаунта %s, следующая проверка через 1 час" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Достигнут лимит загрузок" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s имеет не правильный шаблон." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Ошибка импорта %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Не загружен ни один из файлобменников" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "В своей учётной записи включите опцию 'direct Download'" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "Список ссылок не может быть очищен." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Установки учетной записи удалены в связи с новым форматом." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Необходима авторизация (имя пользователя:пароль)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Пожалуйста, введите ваш аккаунт для %s или отключить этот плагин" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Найден HTML-код в файле загрузки (%s)... ошибка перенаправления? Загрузка будет перезапущена." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Файл временно недоступен" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: ожидание между загрузками %d сек." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: ожидание картинки %d сек." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Загруженный файл пуст" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "Неверный ключ API" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: Осталось недостаточно трафика" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Трафик закончился" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Traffic Share (прямая загрузка)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Уже идет загрузка с этого IP, ждем 60 секунд" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Неправильный код идентификации, загрузка будет перезапущена" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: Нет свободного слота" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Для этого файла нужен премиум аккаунт" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Имя файла указано неверно" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Ошибка параллельной загрузки, ждем 60 секунд." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Вход не произведен." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Сбой расшифровки" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "Нет ключа файла в URL-адресе" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Код ошибки:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Файл не существует." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Дополнения обновлены, перезапустите pyLoad ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Дополнения обновлены и перезагружены" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Нет обновлений для дополнений" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Нет обновлений pyLoad" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Доступна новая версия pyLoad %s ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Скачайте здесь: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Не возможно соединиться с сервером обновлений" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Новая версия %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Ошибка при обновлении %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Конфликт версии" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Загрузка завершена: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Новый запрос картинки: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Ответ с текстом на картинке %s" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Пожалуйста, сначала добавьте учетную запись premium.to и перезапустите pyLoad" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Добавлен %s из HotFolder" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "%s не установлен" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Не возможно активировать %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Активирован(a/о)" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Не активировано дополнений для извлечения/распаковки" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Пакет %s поставлен в очередь для последующего извлечения/распаковки" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Проверка пакета %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Извлечение/распаковка в %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Не найдено файлов для извлечения" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "извлекается/распаковывается" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Защищено паролем" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Неправильный пароль" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Удаление файлов %s" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Извлечениe/распаковка завершено(a)" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Ошибка архива" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "Ошибка контрольной суммы" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Неизвестная ошибка" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Ошибка установки пользователя и группы: %s" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: Порт 9666 уже занят" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "Осталось %s кредитов" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Не удалось отправить ответ." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Недостаточно средств на вашем аккаунте CaptchaTrader" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Список шифрования не найден" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Список шифрования пуст" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Загрузка завершена: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Новая(ые) CaptchaID из загрузки: %s: %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Ваша учетная запись 9kw.eu имеет не достаточно кредитов" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Установленные скрипты для %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Не возможно запустить скрипт:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Ошибка в %(script): %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "Учетная запись ExpertDecoders не имеет достаточно кредитов" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Пожалуйста сначала добавьте ваш rehost.to аккаунт и перезапустите pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Пожалуйста сначала добавьте действительную учетную запись для premiumize.me и перезапустить pyLoad." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "Осталось %s кредитов" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil и tesseract не установлены. Не подключен клиент для расшифровки картинок" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Не получен результат расшифровки картинки в течение отведённого времени ни одним из дополнений" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Ошибка установки пользователя и группы: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Не подключен клиент для расшифровки картинок" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Добавлен контейнер %(name)s с %(count)d сылками" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Добавлено %(count)d ссылок в контейнер #%(package)d " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Не обнаружена js платформа, пожалуйста установите либо Spidermonkey, ossp-js, pyv8 или rhino" diff --git a/locale/ru/LC_MESSAGES/pyLoadCli.po b/locale/ru/LC_MESSAGES/pyLoadCli.po index 61d91a9fb..20b49882a 100644 --- a/locale/ru/LC_MESSAGES/pyLoadCli.po +++ b/locale/ru/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "Интерфейс командной строки" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s загрузок:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "Скорость: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "Размер: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "Закончено в: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "ожидание: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Состояние:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "приостановлено" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "в процессе" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "общая скорость" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Файлов в очереди" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Всего" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Меню:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "Добавить ссылки" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "Управление очередью" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "Управление коллектором ссылок" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "Запустить/Приостановить сервер" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "Остановить сервер" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "Выход" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Используйте шаблон: add <Имя контейнера> <ссылка1> <ссылка2> ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Проверка %d ссылки:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Файл не найден." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "Работа pyLoad была принудительно завершена" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Показать состояние сервера" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Показать закачки в очереди" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Показать закачки в списке коллектора" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Добавить контейнер в очередь" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Добавляет контейнер в коллектор ссылок" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Удалить файлы из очереди/коллектора" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Удалить контейнер из очереди/коллектора" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Переместить пакет(ы) из очереди в коллектор и наоборот" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Перезапустить файлы" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Перезапустить пакеты" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Проверка статуса связи, действует с местными контейнерами" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Проверяет состояние файла-контейнера" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Приостановить сервер" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "продолжить закачки" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Переключить пауза/продолжить" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "остановить сервер" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Список команд: " -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Записать файл конфигурации пользователя не удалось" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Для соединения с ядром pyLoad необходим пакет py-openssl." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Адрес: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Порт: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Имя пользователя: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Пароль: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Неправильные учётные данные." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Невозможно подключиться к %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Для соединения с ядром pyLoad необходим пакет py-openssl." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "В связи с тем, что были введены ряд команд, интерактивный режим был прерван." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Добавить пакет:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Введите название пакета" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Контейнер: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Анализ ссылок для добавления." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Введите %s когда будете готовы." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Добавлены ссылки: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "назад в главное меню" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Управление пакетами:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Управление ссылками" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Что Вы хотите переместить?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Что Вы хотите удалить?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Что Вы хотите перезапустить?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Выбирайте, что Вы хотите сделать или внесите номер пакета." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "удалить" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "переместить" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "перезапустить" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "- предыдущий" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "- следующий" diff --git a/locale/ru/LC_MESSAGES/setup.po b/locale/ru/LC_MESSAGES/setup.po index e55aa5fe7..b1d0093d4 100644 --- a/locale/ru/LC_MESSAGES/setup.po +++ b/locale/ru/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "да" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "нет" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Вас приветствует помощник по настройке pyLoad" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Будет проверена система и внесены первоначальные настройки для запуска pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "В квадратных скобках [] указываются значения по умолчанию," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "если Вы не хотите менять эти значения или не уверены в своём выборе, просто нажмите ENTER." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Не забудьте: Вы всегда можете снова запустить помощника по настройкам, набрав pyload.py с ключом --setup или -s." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "При возникновении проблем с этим ассистентом нажмите STRG-C" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "для прекращения установки. pyload.py больше не будет запускаться автоматически." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Для старта проверки системы, нажмите ENTER." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Для работы pyLoad необходимы pycurl, sqlite и python 2.5, 2.6, 2.7." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Установите недостающие пакеты и перезапустите pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Программа установки завершает работу." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Проверка системы завершена. Чтобы просмотреть отчет, нажмите клавишу ENTER." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Отчет ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "расшифровка" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "SSL подключение" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "автоматическая расшифровка CAPTCHA" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "GUI " -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Web-интерфейс" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "поддержка Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Доступные функции:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Недоступные функции:" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "недоступен py-crypto" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Он нужен для раскодирования файлов." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "нет SSL" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Он нужен для защиты соединения с ядром или web-интерфейсом." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "При локальных соединениях SSL не нужен." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "Расшифровка Captcha недоступна" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Нужна на некоторых файл-хостингах." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "Нет GUI" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "Нет поддержки JavaScript" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Ето понадобиться для некоторых ссылок Click'N'Load. Инсталировайте Spidermonkey, ossp-js, pyv8 или rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "При желании сейчас можно прервать установку и поставить необходимые зависимые пакеты." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Продолжить настройку?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Нужно ли менять путь к папке настроек? Текущий путь %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Если вы используете pyLoad на каком-нибудь сервере или путь к конфигурации указывает на flash-диск, лучше поменяйте его." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Изменить путь?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Хотите изменить учётные данные и другие базовые настройки?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Настоятельно рекомендуется при первом запуске." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Изменить основные настройки?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Хотите настроить SSL?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Настроить SSL?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Хотите настроить WEB-интерфейс?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Настроить WEB-интерфейс?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Установка успешно завершена." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Нажмите ENTER и запустите pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Проверка системы ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Версия python слишком новая, используйте Python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Версия python слишком старая, используйте Python версии 2.5 и выше" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Версия Python: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Слишком старая версия jinja2 %s." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Можно спокойно продолжить настройку, но если web-интерфейс не будет работать," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "то обновите или удалите библиотеку jinja2. Она уже есть в составе pyLoad." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Основные настройки ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Эти учётные данные подходят к CLI, GUI и WEB-интерфейсу." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Пользователь" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Внешним клиентам (GUI, CLI и другие) понадобиться дистанционный доступ для работы через сеть." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Если Вы хотите пользоваться только соединением через веб интерфейс, отключите его, чтобы уменьшить потребление оперативной памяти." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Включить дистанционный доступ" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Язык" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Папка закачек" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Макс.число одновременных закачек" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Использовать переподключение интернета?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Путь к скрипту переподключения" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Установки WEB-интерфейса ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Включить WEB-интерфейс?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "ip-адрес WEB-интерфейса. Если указать 127.0.0.1 или localhost, то WEB-интерфейс будет доступен только локально." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Адрес" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Порт" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "В pyLoad несколько вложенных серверов, ниже следуют описания в коротком виде." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Стандартная настройка, наилучший выбор если вам не ясно какой сделать выбор." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Етот сервер поддерживает SSL и хорошая, годная альтернатива к builtin." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Может использоваться вместе с apache, lighttpd, требует настройки, что является не таким простым заданием." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Получить его здесь: https://github.com/jonashaag/bjoern и скомпилировать его" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Внимание: В некоторых редких случаях встроенный сервер не работает, если вы заметили проблемы с веб-интерфейсом" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "вернуться сюда и изменить сервер builtin на сервер threaded." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Сервер" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Настройки SSL ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Для генерации SSL сертификатов выполните следующие команды, находясь в папке конфигурации pyLoad:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Если всё прошло успешно, сейчас можно будет включить поддержку SSL." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Включить SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Выберите действие" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Добавить/Изменить пользователя" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Показать список пользователей" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Удалить пользователя" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Выход" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Пользователи" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Установлен новый путь к папке настроек. Текущие настройки не будут сохранены!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Путь к настройкам" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Путь к настройкам был изменён. Перезапустите ассистент для продолжения настройки." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Нажмите клавишу Enter для выхода." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Не удалось установить путь к настройкам: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: отсутствует" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Пароль: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Слишком простой пароль, нужно минимум 4 символа." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Пароль (Повторить)" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Пароли не совпадают." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "да" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "Да" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "нет" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "Ложь" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Некорректный ввод" diff --git a/locale/setup.pot b/locale/setup.pot index 11d64d094..ceba6a5d2 100644 --- a/locale/setup.pot +++ b/locale/setup.pot @@ -17,463 +17,463 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: module/setup.py:33 +#: pyload/setup.py:33 msgid "y" msgstr "" -#: module/setup.py:35 +#: pyload/setup.py:35 msgid "n" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "Welcome to the pyLoad Configuration Assistant." msgstr "" -#: module/setup.py:54 +#: pyload/setup.py:54 msgid "" "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:56 +#: pyload/setup.py:56 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:57 +#: pyload/setup.py:57 msgid "" "in case you don't want to change it or you are unsure what to choose, just " "hit enter." msgstr "" -#: module/setup.py:59 +#: pyload/setup.py:59 msgid "" "Don't forget: You can always rerun this assistant with --setup or -s " "parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:60 +#: pyload/setup.py:60 msgid "If you have any problems with this assistant hit STRG-C," msgstr "" -#: module/setup.py:61 +#: pyload/setup.py:61 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:63 +#: pyload/setup.py:63 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:70 +#: pyload/setup.py:70 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:71 +#: pyload/setup.py:71 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Setup will now close." msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "## Status ##" msgstr "" -#: module/setup.py:83 +#: pyload/setup.py:83 msgid "container decrypting" msgstr "" -#: module/setup.py:85 +#: pyload/setup.py:85 msgid "ssl connection" msgstr "" -#: module/setup.py:87 +#: pyload/setup.py:87 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "Webinterface" msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:98 +#: pyload/setup.py:98 msgid "Features available:" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "Featues missing: " msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "no py-crypto available" msgstr "" -#: module/setup.py:107 +#: pyload/setup.py:107 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:111 +#: pyload/setup.py:111 msgid "no SSL available" msgstr "" -#: module/setup.py:112 +#: pyload/setup.py:112 msgid "" "This is needed if you want to establish a secure connection to core or " "webinterface." msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:118 +#: pyload/setup.py:118 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:123 +#: pyload/setup.py:123 msgid "" "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-" "js, pyv8 or rhino" msgstr "" -#: module/setup.py:125 +#: pyload/setup.py:125 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "Continue with setup?" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:135 +#: pyload/setup.py:135 msgid "" "If you use pyLoad on a server or the home partition lives on an iternal " "flash it may be a good idea to change it." msgstr "" -#: module/setup.py:136 +#: pyload/setup.py:136 msgid "Change config path?" msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:144 +#: pyload/setup.py:144 msgid "Make basic setup?" msgstr "" -#: module/setup.py:151 +#: pyload/setup.py:151 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:152 +#: pyload/setup.py:152 msgid "Configure ssl?" msgstr "" -#: module/setup.py:158 +#: pyload/setup.py:158 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:159 +#: pyload/setup.py:159 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:165 +#: pyload/setup.py:165 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "## System Check ##" msgstr "" -#: module/setup.py:175 +#: pyload/setup.py:175 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:181 +#: pyload/setup.py:181 msgid "Python Version: OK" msgstr "" -#: module/setup.py:224 +#: pyload/setup.py:224 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:225 +#: pyload/setup.py:225 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:226 +#: pyload/setup.py:226 msgid "" "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:243 +#: pyload/setup.py:243 msgid "JS engine" msgstr "" -#: module/setup.py:250 +#: pyload/setup.py:250 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:253 +#: pyload/setup.py:253 msgid "The following logindata is valid for CLI and webinterface." msgstr "" -#: module/setup.py:259 module/setup.py:357 module/setup.py:373 +#: pyload/setup.py:259 pyload/setup.py:357 pyload/setup.py:373 msgid "Username" msgstr "" -#: module/setup.py:265 +#: pyload/setup.py:265 msgid "" "External clients (GUI, CLI or other) need remote access to work over the " "network." msgstr "" -#: module/setup.py:266 +#: pyload/setup.py:266 msgid "" "However, if you only want to use the webinterface you may disable it to save " "ram." msgstr "" -#: module/setup.py:267 +#: pyload/setup.py:267 msgid "Enable remote access" msgstr "" -#: module/setup.py:271 +#: pyload/setup.py:271 msgid "Language" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "Downloadfolder" msgstr "" -#: module/setup.py:274 +#: pyload/setup.py:274 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:278 +#: pyload/setup.py:278 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:281 +#: pyload/setup.py:281 msgid "Reconnect script location" msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:289 +#: pyload/setup.py:289 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "" "Listen address, if you use 127.0.0.1 or localhost, the webinterface will " "only accessible locally." msgstr "" -#: module/setup.py:292 +#: pyload/setup.py:292 msgid "Address" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Port" msgstr "" -#: module/setup.py:295 +#: pyload/setup.py:295 msgid "" "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:296 +#: pyload/setup.py:296 msgid "Default server; best choice if you plan to use pyLoad just for you." msgstr "" -#: module/setup.py:297 +#: pyload/setup.py:297 msgid "" "Support SSL connection and can serve simultaneously more client flawlessly." msgstr "" -#: module/setup.py:299 +#: pyload/setup.py:299 msgid "" "Can be used by apache, lighttpd, etc.; needs to be properly configured " "before." msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Very fast alternative to builtin; requires libev and bjoern packages." msgstr "" -#: module/setup.py:305 +#: pyload/setup.py:305 msgid "" "Attention: In some rare cases the builtin server is not working, if you " "notice problems with the webinterface" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "Server" msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:322 +#: pyload/setup.py:322 msgid "" "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:328 +#: pyload/setup.py:328 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:330 +#: pyload/setup.py:330 msgid "Activate SSL?" msgstr "" -#: module/setup.py:347 +#: pyload/setup.py:347 msgid "Select action" msgstr "" -#: module/setup.py:348 +#: pyload/setup.py:348 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:349 +#: pyload/setup.py:349 msgid "2 - List users" msgstr "" -#: module/setup.py:350 +#: pyload/setup.py:350 msgid "3 - Remove user" msgstr "" -#: module/setup.py:351 +#: pyload/setup.py:351 msgid "4 - Quit" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "Users" msgstr "" -#: module/setup.py:391 +#: pyload/setup.py:391 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:392 +#: pyload/setup.py:392 msgid "Configpath" msgstr "" -#: module/setup.py:400 +#: pyload/setup.py:400 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:401 +#: pyload/setup.py:401 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:405 +#: pyload/setup.py:405 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:411 +#: pyload/setup.py:411 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:456 +#: pyload/setup.py:456 msgid "" "Warning: Consider a password of 10 or more symbols if you expect to access " "from outside your local network (ex. internet)." msgstr "" -#: module/setup.py:457 +#: pyload/setup.py:457 msgid "Password: " msgstr "" -#: module/setup.py:461 +#: pyload/setup.py:461 #, python-format msgid "Password too short! Use at least %s symbols." msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password must be alphanumeric." msgstr "" -#: module/setup.py:467 +#: pyload/setup.py:467 msgid "Password (again): " msgstr "" -#: module/setup.py:473 +#: pyload/setup.py:473 msgid "Passwords did not match." msgstr "" -#: module/setup.py:489 +#: pyload/setup.py:489 msgid "yes" msgstr "" -#: module/setup.py:489 +#: pyload/setup.py:489 msgid "true" msgstr "" -#: module/setup.py:489 +#: pyload/setup.py:489 msgid "t" msgstr "" -#: module/setup.py:492 +#: pyload/setup.py:492 msgid "no" msgstr "" -#: module/setup.py:492 +#: pyload/setup.py:492 msgid "false" msgstr "" -#: module/setup.py:492 +#: pyload/setup.py:492 msgid "f" msgstr "" -#: module/setup.py:495 module/setup.py:505 +#: pyload/setup.py:495 pyload/setup.py:505 msgid "Invalid Input" msgstr "" diff --git a/locale/si/LC_MESSAGES/django.po b/locale/si/LC_MESSAGES/django.po index bc193cfa5..2fa2b0e15 100644 --- a/locale/si/LC_MESSAGES/django.po +++ b/locale/si/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "නම" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "ප්‍රධාන" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "ගමනාන්තය" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "අවලංගු කරන්න" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/si/LC_MESSAGES/pyLoad.po b/locale/si/LC_MESSAGES/pyLoad.po index 053e865c6..0aaf63cd8 100644 --- a/locale/si/LC_MESSAGES/pyLoad.po +++ b/locale/si/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/si/LC_MESSAGES/pyLoadCli.po b/locale/si/LC_MESSAGES/pyLoadCli.po index f859072ff..574f50aa9 100644 --- a/locale/si/LC_MESSAGES/pyLoadCli.po +++ b/locale/si/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/si/LC_MESSAGES/setup.po b/locale/si/LC_MESSAGES/setup.po index c9bbb5513..3cbfa52f1 100644 --- a/locale/si/LC_MESSAGES/setup.po +++ b/locale/si/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/sq/LC_MESSAGES/django.po b/locale/sq/LC_MESSAGES/django.po index cd2449a47..f8bfd5446 100644 --- a/locale/sq/LC_MESSAGES/django.po +++ b/locale/sq/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/sq/LC_MESSAGES/pyLoad.po b/locale/sq/LC_MESSAGES/pyLoad.po index 1f6ed52b9..d9df0e4bf 100644 --- a/locale/sq/LC_MESSAGES/pyLoad.po +++ b/locale/sq/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/sq/LC_MESSAGES/pyLoadCli.po b/locale/sq/LC_MESSAGES/pyLoadCli.po index 73f7e3230..80567cb30 100644 --- a/locale/sq/LC_MESSAGES/pyLoadCli.po +++ b/locale/sq/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/sq/LC_MESSAGES/setup.po b/locale/sq/LC_MESSAGES/setup.po index 0e0e1d124..f1fb975f8 100644 --- a/locale/sq/LC_MESSAGES/setup.po +++ b/locale/sq/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/sr/LC_MESSAGES/django.po b/locale/sr/LC_MESSAGES/django.po index f298d0667..0083d9a21 100644 --- a/locale/sr/LC_MESSAGES/django.po +++ b/locale/sr/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Нови захтев за проверу" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Молимо да прочитате текст са провере." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad рестартован" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "искључено" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Успешно обављено" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "укључено" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Да ли сте сигурни да желите да искључите pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Рестартовати везу" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Обрисати везу" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Унесите име пакета." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Кликните на десну страну провере." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Десила се грешка." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Фасцикла је празна" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Неуспело" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Нема захтева за проверу" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Лозинке се не поклапају" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Подешавања сачувана." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Нова фасцикла" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Да ли сте сигурни да желите да рестатујете pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "чекам %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Активна преузимања" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Кућа" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Преузимања" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Извештаји" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Подешавање" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Име" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Статус" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Информација" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Величина" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Напредак" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Пријава" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Корисничко име" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Лозинка" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Име и лозинка не одговарају. Поновити." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Да би ресетовали податке пријаве или за додавање корисника:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Обриши завршено" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Рестартовање неуспешно" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Фасцикла:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Лозинка:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Уреди пакет" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Уреди детаље пљкета." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Име пакета." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Фасцикла" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Име подфасцикле за ова преузимања." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Списак лозинке за РАР." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Сачувај" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Ресет" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Успешно сте се одјавили." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Путања" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "абсолутно" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "релативно" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "име" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "величина" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "тип" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "задња промена" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "родитељска фасцикла" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "нема садржаја" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Опште" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Додатци" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Налози" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Одабрати секцију из менија" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Прикључак" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "Премијум" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Важи до" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Преостали проток" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Време" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Макс истовремено" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Обриши?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "исправно" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "није важно" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "да" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "не" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Додај" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Додај налог" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Унос података за употребу премијум могућности." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Ваше име:" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Лозинка за овај налог" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Тип" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Одабрати хост Вашег налога." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Стартуј" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "назад" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "даље" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Крај" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Вести" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Подршка" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Систем" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "ОС:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "Верзија pyLoad-а:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Фасцикла инсталације:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Фасцикла подешавања:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Фасцикла преузимања:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Простор:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Језик:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Порт вебинтерфејса:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Порт удаљеног интерфејса:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Подешавање" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Менаџер датотеке" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Додај пакет" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Прилепи линкове или послати контејнер." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Име новог пакета." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Везе" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Прилепите везе или текст и стисните дугме Филтер." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Филтрирај УРЛ" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Лозинка за РАР архиве" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Датотека" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Пошаљи контејнер." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Одредиште" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Читање провере" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "Провера" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Провера." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Текст" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Унети текст из провере." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Затвори" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Вебинтерфејс" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "Ажурирања су доступна!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Додатци су ажурирани, рестартовати!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Чекање провере" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Одјава" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Администруј" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Инфо" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Логујте се!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Заустави" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Откажи" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Преузми:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Поновна веза:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Брзина:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Активно:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Поново учитај страну" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "учитавање" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Назад на врх" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Искључити pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Рестартовати pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "За додавање/промене лозинку употребити:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Важно! Админ корисник увек има сва права!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Промени лозинку" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Администратор" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Дозволе" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "промени" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Унети тренутну и жељену лозинку." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Корисник" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Тренутна лозинка" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Нова лозинка" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Нова лозинка:" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Нова лозинка (понови)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Поновити нову лозинку." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Немате право за приступ овој страни." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Фасцикла преузимања није нађена." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "неограничено" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "није доступно" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Покренути pyload.py -s за приступ подешавању." diff --git a/locale/sr/LC_MESSAGES/pyLoad.po b/locale/sr/LC_MESSAGES/pyLoad.po index 44cad0c91..a4d0514c0 100644 --- a/locale/sr/LC_MESSAGES/pyLoad.po +++ b/locale/sr/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Примљен је сигнал за излазак" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad већ ради са бројем %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Не могу да променим групу: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Не могу да променим корисника: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "фасцикла за извештаје" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Покрећем" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Основна фасцикла: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pycrypto за дешифровање контејнера" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "фасцикла за привремене датотеке" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "фасцикла за преузимања" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL за сигурносне везе" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Премештање старих подешавања у базу" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Проверите ваше податке пријављивања са ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Све везе су уклоњене" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Време преузимања: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Слободно простора: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Активирам налоге…" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Активација додатка..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad је спреман за коришћење" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "поновно покретање pyLoad-а" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad се затвара" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Инсталација %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "не могу да нађем %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "не могу да креирам %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "искључујем…" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "грешка при искључивању" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "убити pyLoad из терминала" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "База је избрисано због некомпатибилне верзије." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "База не може да се конвертује" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "База је конвертована са v2 у v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "База је конвертована са v3 у v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Конвертовање старе Django базе" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "завршено" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "ван мреже" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "на мрежи" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "на чекању" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "прескочено" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "чекам" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "привремено ван мреже" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "започињем" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "неуспело" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "прекинуто" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "дешифрујем" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "прилагођено" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "преузимам" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "обрађујем" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "непознато" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Пакет је завршен: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Употреба SSL ThriftBackend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Грешка удаљеног фида: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Покрећем %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Не могу да учитам позадинску компоненту %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "чекам %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "SSL сертификати нису пронађени." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Одпустили смо подршку да би стартовали %s директно са pyLoad" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Можете да употребите сервер са навојом који пружа добре перформансе и ссл," -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "а можете и да наставите са вашим %s са pyLoads fastcgi сервером" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "примере подешавања су у фасцикли module/webui/servers" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "примере подешавања су у фасцикли pyload/webui/servers" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Не могу да употребим %(server)s, python-flup није инсталиран!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Грешка увоза lightweight сервера: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Требате да преузмете и компилујете bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Копирајте boern.so у фасциклу module/lib или употребите setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Копирајте boern.so у фасциклу pyload/lib или употребите setup.py install" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Наравно требате да познајете линукс и да знате како да конпилујете програме" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Сервер постављен на навојен, због проблема на Виндоз." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Овај сервер не подржава SSL. Уместо њега користите угнеждени." -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Стартовање уграђеног сервера: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Стартовање навојеног ССЛ веб сервера: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Стартовање навојеног веб сервера: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Стартовање fastcgi сервера: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Стартовање вебсервера (bjoern): %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Немате право за приступ овој страни." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Фасцикла преузимања није нађена." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "неограничено" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "није доступно" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Покренути pyload.py -s за приступ подешавању." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Одломци преузимања нису успели. Враћање на једну везу | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Преузимање је започето: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Преузимање је завршено: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Прикључку %s недостаје функција." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Преузимање је прекинуто: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Преузимање је поново покренуто: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Преузимање је ван мреже: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Преузимање је тренутно ван мреже: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Преузимање није успело: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Не могу да се повежем са хостом или је веза прекинута. Поновно повезивање за 1 минут." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Преузимање је прескочено: %(name)s због %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Дешифровање почело: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Неуспешно дешифровање: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Понављање %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Не могу да преузмем податке за %(name)s | %(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "Грешка покретања куке: %s" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Не могу да активирам %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Активну додатци: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Неактивни додатци: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Неуспешно поновно повезивање: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Скрипт за поновно повезивање није пронађен." -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Покрећем поновно повезивање" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Не могу да извршим скрипт за поновно повезивање." -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Поново је повезано; нова IP адреса: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Нема довољно простора на уређају" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Не могу да се пријавим са налогом %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Неисправна лозинка" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "Време %s има лош формат, употреби: 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "Налог %s нема довољно саобраћаја. Проверавам поново за 30 минута." -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "Налог %s је истекао. Проверавам поново за сат времена." -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "Достигнуто је ограничење преузимања" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s има неважећи образац." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Грешка увоза %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Ниједан хостер није учитан" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Активирајте директно преузимање у налогу Bitshare-а" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "LinkList не може да буде обрисан." -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Подешавања налога избрисане због новијег формата." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Потребна је провера идентитета (корисничко име и лозинка)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Унесите налог на сервису %s или деактивирајте овај прикључак." -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "Пронађен је HTML кôд у преузетој датотеци (%s). Преузимање ће поново бити покренуто." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Датотека тренутно није доступна" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: чекање између преузимања %d с." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: чекање потврдног кода %d с." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "Преузета датотека је празна" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "API кључ је неисправан" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: немате довољно саобраћаја" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Прекорачили сте саобраћај" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: дељење саобраћаја (директно преузимање)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Већ преузимате са ове IP адресе. Сачекајте 60 секунди." -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Неисправан кôд за проверу идентитета. Преузимање ће поново бити покренуто." -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "Rapidshare.com: нема слободних слотова" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Потребан вам је премијум налог да бисте преузели ову датотеку" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Пријављено име датотеке није исправно" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Грешка у истовременом преузимању. Сачекајте 60 секунди." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "Нисте пријављени." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Дешифровање није успело" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "У URL адреси није наведен кључ датотеке" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Кôд грешке:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Датотека не постоји." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Прикључци су ажурирани. Поново покрените pyLoad. ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Прикључци су ажурирани и поново учитани" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Нема ажурирања прикључака" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "Нема нове верзије pyLoad-а" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Доступна је нова верзија, pyLoad %s ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Преузмите је одавде: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Не могу да се повежем са сервером за ажурирања" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Нова верзија %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "Грешка при ажурирању %s" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Верзије се не поклапају" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Преузимање је завршено: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Нови захтев потврдног кода: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "Одговорите са „c %s текст на потврдном коду“" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "Додато %s из HotFolder-а" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "Није инсталиран %s" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "Не могу да активирам %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Активирано" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Нису активирани прикључци за распакивање" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "Пакет %s је стављен у ред за распакивање" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "Провери пакет %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Распакуј у %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Нема датотека за распакивање" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "распакујем" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Заштићено лозинком" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Неисправна лозинка" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "Бришем %s датотека" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Распакивање је завршено" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Грешка у архиви" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC се не поклапа" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Непозната грешка" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Постављање корисника и групе није успело" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: порт 9666 већ је у употреби" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "Преостало је %s кредита" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "Не могу да пошаљем одговор." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "У вашем налогу на сервису CaptchaTrader нема довољно кредита." -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Списак шифратора није пронађен" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Списак шифратора је празан" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Преузимање је завршено: %(name)s @ %(plugin)s" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Нови CaptchaID од отпремања: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "У вашем налогу на сервису 9kw.eu нема довољно кредита." -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "Инсталирани скрипти за %s: " -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Скрипта не може да се изврши:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Грешка у %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "У вашем налогу на сервису ExpertDecoders нема довољно кредита." -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Прво додајте налог на сервису rehost.to па поново покрените pyLoad." -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "Преостало је %d кредита" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Pil и Tesseract нису инсталирани, нити је повезан клијент ради дешифровања потврдних кодова." -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Ни један резултат провере није примљен у времену од било којег додатка." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Постављање корисника и групе није успело: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Нема прикаченог клијента за дешифровање провере" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Додат пакет %(name)s са %(count)d везе(а)" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Додато %(count)d везе у пакет #%(package)d" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Нисам нашао js мотор, инсталирати Spidermonkey, ossp-js, pyv8 или rhino" diff --git a/locale/sr/LC_MESSAGES/pyLoadCli.po b/locale/sr/LC_MESSAGES/pyLoadCli.po index 3cda02c25..21c5c2400 100644 --- a/locale/sr/LC_MESSAGES/pyLoadCli.po +++ b/locale/sr/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Интерфејс командне линије" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s преузимања:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Брзина: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Величина: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Завршено: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr " ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "на чекању: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Статус:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "паузирано" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "покренуто" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "Укупна брзина" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Датотеке у списку" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Укупно" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Мени:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Додај везе" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Управљај списком" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Управљај сакупљачем" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr " Паузирај/настави сервер" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Окончај сервер" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Изађи" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Користите ову синтаксу: add <име пакета> <веза> <друга веза>…" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Провера %d веза:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Датотека не постоји." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad је обустављен" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Штампа статус сервера" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Штампа преузимања у списку" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Штампа преузимања у сакупљачу" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Додаје пакет у списак" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Додаје пакет у сакупљач" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Брише датотеке из списка/сакупљача" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Брише пакете из списка/сакупљача" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Премешта пакете из списка у сакупљач и обрнуто" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Поново покрени датотеке" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Поново покрени пакете" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Проверава доступност (ради са локалним контејнером)" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Проверава доступност датотеке контејнера" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Паузирај сервер" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "настави преузимања" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Паузирај/настави" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "окончај сервер" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Списак команди:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Не могу да пишем на датотеку са подешавањима" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Треба вам py-openssl да би се привезали на pyLoad језгро." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Адреса: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Порт: " -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Корисничко име: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Лозинка: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Подаци за пријаву су погрешни." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Не могу да успоставим везу са адресом %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Потребан вам је py-openssl да бисте се повезали на сервер pyLoad-а." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Занемарен је интерактивни режим јер сте задали неке команде." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Додајте пакет:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Унесите име новог пакета" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Пакет: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Рашчланите везе које желите да додате." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Унесите %s када завршите." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Додато веза: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " назад на главни мени" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Управљајте пакетима:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Управљајте везама:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Шта желите да преместите?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Шта желите да обришете?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Шта желите да поново покренете?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Одабрати шта да се уради или унети број пакета." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "обриши" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "премести" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "поново покрени" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " – претходно" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " – следеће" diff --git a/locale/sr/LC_MESSAGES/setup.po b/locale/sr/LC_MESSAGES/setup.po index 710c3f54c..8363527b6 100644 --- a/locale/sr/LC_MESSAGES/setup.po +++ b/locale/sr/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "д" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "н" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Добро дошли код помоћника за подешавање pyLoad-а." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Он ће проверити систем и наместити основне поставке тако да можете да покренете pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "Вредност у угластим заградама је подразумевана." -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "ако не желите да промените или незнате шта да изаберете, стисните 'ентер'." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Знајте: можете поново да покренете овај асистент са параметром --setup или -s када покренет pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Ако имате проблема са асистентом, стисните STRG-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "за поништавање и немојте да га покренете аутоматски са pyload.py ." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Када сте спремни да проверите систем, стисните 'ентер'." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Треба Вам pycurl, sqlite и python 2.5, 2.6 или 2.7 за покретање pyLoad-а." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Поправите то и поново покрените pyLoad." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Сетап ће се затворити." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Провера система је завршена, стисните 'ентер' да би видели резултат." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Статус ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "дешифровање контејнера" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "ссл веза" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "аутоматско налажење провере" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Вебинтерфејс" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "напредан Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Доступне функције:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Функције које недостају:" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "py-crypto није доступан" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "То Вам треба ако желите да дешифрујете контејнере." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "ССЛ није доступан" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Потребно ако желите да урадите сигурносну везу на језгро или вебинтерфејс." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Ако желите да приступите pyLoad само локално, ССЛ није потребно." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "није доступно налажење провере" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Потребно за неке хостере и као бесплатан корисник." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "Gui није доступно" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "Графички интерфејс." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "нема JavaScript мотор" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "То Вам треба за неке Click'N'Load везе. Инсталирати Spidermonkey, ossp-js, pyv8 или rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Можете сада да зауставите и да поправите неке зависности ако желите." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Наставити са подешавањем?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Желите ли да промените путању за подешавање? Тренутна путања је %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Ако користите pyLoad на серверу или на партицији на интерном флешу, може да буде добро да промените." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Променити путању за подешавање?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Желите ли да наместите податке за пријаву и основне поставке?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Ово је препоручено на прво покретање." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Уради осносно подешавање?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Желите ли да подесите SSL?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Подесити SSL?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Да се конфигурише веб интерфејс?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Подесити веб интерфејс?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Подешавање је успешно завршено." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Притисните Enter да изађете и поново покренете pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Провера система ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Ваша верзија python је много нова, употребите python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Ваша верзија python је престара, употребите макар python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Верзија Python: У реду" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Ваша верзија jinja2 %s делу престара." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Можете да наставите, али ако веб интерјест не ради," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "ажурирајте или деинсталирајте га, pyLoad има довољно jinja2 библиотеку." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "JS мотор" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Основно подешавање ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Следећи подаци за пријаву важе за CLI, GUI и веб интерфејс." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Корисничко име" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Језик" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Фасцикла преузимања" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Максималан број истовремених преузимања" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Користити поновно повезивање?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Локација скрипта за поновно повезивање" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Подешавање веб интерфејса ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Активирати веб интерфејс?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Адреса за пријем. Ако користите 127.0.0.1 или localhost, веб интерфејс ће бити доступан само локално." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Адреса" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Порт" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad пружа неколико системске подршке сервера, ево кратко објашњење." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Подразумеван сервер, најбољи избор ако незнате који да користите." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Овај сервер пружа ССЛ и добра је алтернатива за уграђени." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Може да га користи apache, lighttpd, потребно је да их подесите, што није најлакше." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Врло брза алтернатива писана у Ц, потребно libev/линукс знање." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Узети га овде: https://github.com/jonashaag/bjoern компилујте га" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "и копирајте bjoern.so у module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "и копирајте bjoern.so у pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Пажња: у неким случајевима уграђен сервер не ради, ако имате проблема са веб интерфејсом" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "вратите се овде и промените уграђен сервер са навојеним." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Сервер" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## Подешавање SSL-а ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Покрените ове команде из pyLoad фасцикле подешавања да би урадили ССЛ цертификате:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Ако сте завршили ис све је у реду, можете сада да активирате ССЛ." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Активирати SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Изаберите радњу" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 – креирајте/уредите корисника" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 – излистајте кориснике" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 – уклоните корисника" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 – изађите" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Корисници" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Подешавање нове путање, актуелна конфигурација неће бити пренета!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Путања конфигурације" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Путања промењена, сетај ће се затворити, поново покрените за наставак." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Притисните Enter да изађете." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Не могу да поставим путању за подешавање: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "%s: У реду" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: фали" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Лозинка: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Лозинка је прекратка. Унесите бар четири симбола." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Потврда лозинке: " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Лозинке се не поклапају" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "да" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "тачно" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "т" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "не" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "нетачно" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "н" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Неисправан унос" diff --git a/locale/sv/LC_MESSAGES/django.po b/locale/sv/LC_MESSAGES/django.po index b1c927a67..8f3f05d72 100644 --- a/locale/sv/LC_MESSAGES/django.po +++ b/locale/sv/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Ny captchabegäran" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Var god läs texten på captchan." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad startades om" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "Är det säkert att du vill avsluta pyLoad?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Starta om länken" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Radera länken" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Var god skriv in ett paketnamn." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Var god kiicka på den rätta captchapositionen." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Ett fel inträffade." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Mappen är tom" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Inga captchor att läsa." -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Lösenorden stämde inte överens." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Inställningar sparade." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Ny mapp" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "Är det säkert att du vill starta om pyLoad?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "väntar %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Aktiva hämtningar" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Hem" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "Hämtningar" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Loggar" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Konfiguration" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "Förlopp" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Ditt användarnamn och lösenord stämde inte. Försök igen." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "För att återställa dina loginuppgifter eller lägga till en användare, kör:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Radera färdiga" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Omstart misslyckades" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Mapp:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Lösenord:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Redigera paket" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Redigera paketdetaljerna här." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Namnet på paketet." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Mappnamn för dessa nedladdningar." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Lösenordslista som används vid uppackning." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Återställ" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Du har loggats ut." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Sökväg" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "absolut" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "relativ" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "namn" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "storlek" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "typ" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "senast ändrad" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "föräldrakatalog" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "inget innehåll" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Tilläggsprogram" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Välj ett avsnitt från menyn" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Giltigt till" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Trafik kvar" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Tid" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Max samtidiga" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Ta bort?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "inte giltigt" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "ja" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "nej" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Skriv in dina kontouppgifter för att använda premiumfunktioner." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Ditt användarnamn." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Lösenord för detta konto." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Starta" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "föreg" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "nästa" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Slut" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Nyheter" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "pyLoad-version:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Installationsmapp:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Konfigurationsmapp:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "Hämtningsmapp:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Ledigt utrymme:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Språk:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Port för webbgränssnitt:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Port för fjärrgränssnitt:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Filhanterare" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Lägg till paket" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Klistra in länkar eller ladda upp en container." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Namnet på det nya paketet." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Länkar" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Klistra in dina länkar eller valfri text och tryck filterknappen." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Filtrera länkar" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "Lösenord för RAR-arkiv" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Fil" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Ladda upp en container." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Läser captcha" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Captcha" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Skriv in texten på captchan." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Webbgränssnitt" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "pyLoad uppdatering tillgänglig!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Plugins uppdaterade, starta om!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha väntar" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Logga ut" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Administrera" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Logga in!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Stoppa" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "Hämta:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Återanslut:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Hastighet:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Aktiv:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Uppdatera sidan" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "läser in" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Tillbaka upp" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "Avsluta pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "Starta om pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "För att lägga till användare eller byta lösenord använd:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Viktigt: Adminanvändare har alltid alla behörigheter!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Byt lösenord" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "Behörigheter" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "ändra" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Ange ditt nuvarande och önskade lösenord." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Användare" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Nuvarande lösenord" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Nytt lösenord" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Det nya lösenordet." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Nytt lösenord (upprepa)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Upprepa det nya lösenordet." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Du har inte behörighet att komma åt denna sida." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Hämtningskatalogen hittades inte." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "inte tillgänglig" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Kör pyload.py -s för att komma åt konfigurationen." diff --git a/locale/sv/LC_MESSAGES/pyLoad.po b/locale/sv/LC_MESSAGES/pyLoad.po index 7b88d29f7..48292bdec 100644 --- a/locale/sv/LC_MESSAGES/pyLoad.po +++ b/locale/sv/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Tog emot avslutningssignal" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad körs redan med pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Misslyckades att ändra gruppen %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Kunde inte ändra användaren: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "mapp för loggar" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Startar" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Använder hemkatalog: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "pyCrypto avkodar containerfiler" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "mapp för temporära filer" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "mapp för hämtningar" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "OpenSSL för säker anslutning" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Flyttar gamla användarinställningar till databasen" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Kontrollera dina login-uppgifter med './pyload.py -u'" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Alla länkar togs bort" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "Hämtningstid: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Ledigt utrymme: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Aktiverar konton..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Aktiverar tilläggsprogram..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad är igång" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "startar om pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyLoad avslutas" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "Installera %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "kunde inte hitta %(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "kunde inte skapa %(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "stänger ner..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "fel vid nedstängning" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "dödade pyLoad från Terminal" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "Fildatabasen togs bort på grund av inkompatibel version." -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "Fildatabasen kunde INTE konverteras." -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "Databasen konverterades från v2 till v3." -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "Databasen konverterades från v3 till v4." -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "Konverterar gammal Django DB" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "färdig" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "frånkopplad" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "ansluten" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "kölagd" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "hoppades över" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "väntar" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "temp. frånkopplad" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "startar" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "misslyckades" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "avbruten" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "dekrypterar" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "anpassad" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "hämtar" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "behandlar" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "okänd" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Paketet klart: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "Använder SSL ThriftBackend" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Fel i fjärradministrationsmodulen: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Startar %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Inläsningen av administrationsmodulen %(name)s misslyckades | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "väntar %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "SSL-certifikat hittades inte." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Ledsen, start av %s direkt från pyLoad stöds inte längre" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "Du kan " -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "naturligtvis kan du fortfarande anväda befintliga %s med pyLoads fastcgi server" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" -msgstr "exempel på konfigurationsfiler finns i mappen \"module/webui/servers\"" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" +msgstr "exempel på konfigurationsfiler finns i mappen \"pyload/webui/servers\"" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "Kan inte använda %(server)s. python-flup är inte installerat!" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "Fel vid import av den lätta servern: %s" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "Du måste ladda ner och kompilera bjoern, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" -msgstr "Kopiera filen boern.so till mappen 'module/lib' eller använd 'setup.py install'" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" +msgstr "Kopiera filen boern.so till mappen 'pyload/lib' eller använd 'setup.py install'" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "Naturligtvis behöver du vara bekant med Linux och veta hur man kompilerar programvara" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "Server inställd på trådad, pga kända prestandaproblem i Windows." -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Den här servern använder inte SSL, överväg att använda den trådade istället " -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Startar inbyggd webbserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "Startar trådad SSL-webbserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "Startar trådad webbserver: %(host)s:%(port)d" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "Startar fastcgi-server: %(host)s:%(port)d" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "Startar den lätta webservern (bjoern): %(host)s:%(port)d" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Du har inte behörighet att komma åt denna sida." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "Hämtningskatalogen hittades inte." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "inte tillgänglig" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Kör pyload.py -s för att komma åt konfigurationen." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Hämtningen startar: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Hämtningen klar: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Plugin %s saknar en funktion." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Hämtningen avbröts: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Hämtning startades om: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Hämtningen är offline: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Hämtningen är tillfälligt offline: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Hämtning misslyckades: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Hämtning hoppades över: %(name)s pga %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "Avkrypteringen startar: %s" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "Hämtning misslyckades: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "Försöker igen %s" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Misslyckades aktivera %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Aktiverade plugins: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Avaktivera plugins: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Återanslutningen misslyckades: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Skript för att återansluta hittades inte!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Startar reconnect" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Exekveringen av återanslutningsskriptet misslyckades!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Återansluten, nytt IP-nummer: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Otillräckligt utrymme på enheten" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "Din tid %s har ett felaktigt format. Använd: 1:22-3:44" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "%s innehåller ett ogiltigt mönster." -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Fel vid import av %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "länklistan kunde inte raderas" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "Kontoinställningar raderade pga nytt format för konfigureringen." -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "Filen finns inte." -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Aktiverat" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "Ingen plugin returnerade captcharesultat i tid." -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "Ingen klient för avkryptering av captcha ansluten" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "Lade till paketet %(name)s som innehåller %(count)d länkar" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "Lade till %(count)d länkar till paket #%(package)d " -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Ingen js motor hittades. Var vänlig installera Spidermonkey, ossp-js, pyv8 eller rhino" diff --git a/locale/sv/LC_MESSAGES/pyLoadCli.po b/locale/sv/LC_MESSAGES/pyLoadCli.po index 028585bc6..18b3a4009 100644 --- a/locale/sv/LC_MESSAGES/pyLoadCli.po +++ b/locale/sv/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Kommandoradsgränssnitt" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s hämtningar:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Hastighet: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Storlek: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Färdig om: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "väntar: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Meny:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Lägg till länkar" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Hantera kö" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "Hantera länksamlaren" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "Pausa/starta servern" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Döda server" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Avsluta" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Använd denna syntax: add ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Kontrollerar %d länkar:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Filen finns inte." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad avbröts" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Visar serverstatus" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Visar nedladdningar i kön" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Visar nedladdningar i länksamlaren" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Lägger till paketet i kön" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Lägger till paketet i länksamlaren" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Radera filer från kön/länksamlaren" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Radera paket från kön/länksamlaren" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Flytta paket från kön till länksamlaren och vice versa" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Starta om filer" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Starta om paket" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Undersök onlinestatus, fungerar med lokal container" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Kontrollerar onlinestatusen för en containerfil" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Pausa servern" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "återuppta hämtningar" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Pausa/fortsätt" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "döda server" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Lista över kommandon:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Kunde inte skriva användarens inställningsfil" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "Du behöver py-openssl för att ansluta till denna pyLoad Core." -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Adress: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Användarnamn: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Lösenord: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Inloggningsdata är felaktigt." -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "Kunde inte etablera anslutning till %(addr)s:%(port)s." -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "Du behöver py-openssl för att ansluta till denna pyLoad core." -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Interaktivt läge ignorerat då vissa kommandon skickades." -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Lägg till paket:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Ange ett namn för nya paketet" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Paket: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Klistra in länkarna som du vill lägga till." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Skriv %s när du är färdig." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Länkar lades till: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr " tillbaka till huvudmenyn" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Hantera paket:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Hantera länkar:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Vad vill du flytta?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Vad vill du ta bort?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Vad vill du starta om?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Välj vad du vill göra eller skriv in ett paketnummer." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "ta bort" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "flytta" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "starta om" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - föregående" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr " - nästa" diff --git a/locale/sv/LC_MESSAGES/setup.po b/locale/sv/LC_MESSAGES/setup.po index 190b6ab71..36013181c 100644 --- a/locale/sv/LC_MESSAGES/setup.po +++ b/locale/sv/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "j" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Välkommen till konfigurationsguiden för pyLoad." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Den kommer att kontrollera ditt system och göra en grundkonfiguration för att kunna köra pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "Värden inom hakparanteser [] är alltid standardvärdet," -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "tryck bara Enter i de fall du inte vill ändra det eller om du är osäker vad du ska välja." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Glöm inte: Du kan alltid köra denna guide igen med --setup eller parametern -s, när du startar pyload.py ." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Om du får några problem med denna guide så tryck Ctrl-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "för att avbryta och låt bli att starta automatiskt med pyload.py ." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Tryck på Enter när du är färdig för att kontrollera systemet." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "Du behöver pycurl, sqlite och python 2.5, 2.6 eller 2.7 för att köra pyLoad." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Korrigera detta och kör pyLoad igen." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Konfigurationen kommer nu att stängas." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Systemkontrollen är färdig. Tryck på Enter för att se din statusrapport." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "container-dekryptering" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "ssl-anslutning" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "automatisk captcha-dekryptering" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "Grafiskt gränssnitt" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Webbgränssnitt" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "utökad Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Funktioner tillgängliga:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Funktioner saknade: " -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "ingen py-crypto tillgänglig" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "Du behöver denna om du vill dekryptera container-filer." -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "ingen SSL tillgänglig" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Denna krävs om du vill etablera en säker anslutning till core eller webbgränssnittet." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "Om du endast vill ha lokalt åtkomst till pyLoad så är inte SSL användbart." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "ingen Captcha Recognition tillgänglig" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "Behövs endast för vissa \"hosters\" och som \"freeuser\"." -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "GUI inte tillgängligt" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "Grafiskt användargränssnitt." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "ingen JavaScript-motor hittades" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Du behöver detta för några Click'N'Load-länkar. Installera Spidermonkey, ossp-js, pyv8 eller rhino" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Du kan avbryta konfigurationen nu och rätta till beroenden om du vill." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Fortsätt med konfigurationen?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Vill du ändra konfigurationssökvägen? Aktuell sökväg är %s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "Om du använder pyLoad på en server eller hempartitionen finns på en intern Flash-disk så kan det vara en bra idé att ändra den." -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Ändra konfigurationssökväg?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Vill du konfigurera inloggningsdata och grundinställningar?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Detta rekommenderas för första gången." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Skapa grundkonfiguration?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Vill du konfigurera SSL?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Konfigurera SSL?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Vill du konfigurera webbgränssnittet?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Konfigurera webbgränssnittet?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Konfigurationen färdigställdes." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Tryck Enter för att avsluta och starta om pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Systemkontroll ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Din python-version är för ny. Använd Python 2.6/2.7" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Din python-version är för gammal. Använd minst Python 2.5" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Python-version: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Din installerade jinja2 version %s verkar vara för gammal." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "Du kan med säkerhet fortsätta men om webbgränssnittet inte fungerar," -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "uppgradera eller avinstallera det. pyLoad inkluderar ett lämpligt jinja2-bibliotek." -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "JS-motor" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Grundkonfiguration ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Följande inloggningsdata är giltigt för CLI, GUI och webbgränssnitt." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "Externa klienter (GUI, CLI osv) behöver fjärråtkomst för att fungera över nätverket." -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "Men om du bara vill använda webbgränssnittet kan du avaktivera den för att spara RAM." -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Aktivera fjärråtkomst" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "Hämtningsmapp" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Max samtidiga hämtningar" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Använd återanslutning (Reconnect)?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Plats för Reconnect-skript" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Konfiguration av webbgränssnitt ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Aktivera webbgränssnitt?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Lyssningsadress, om du använder 127.0.0.1 eller localhost, kommer webbgränssnittet endast vara åtkomligt lokalt." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad erbjuder flera server backends. Här följer en kort förklaring." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "Standardserver, bästa valet om du inte vet vilken du ska välja." -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "Denna server erbjuder SSL och är ett bra alternativ till den inbyggda." -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Kan användas med apache, lighttpd. Kräver att du konfigurera dem, vilket inte är så svårt." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "Mycket snabbt alternativ skrivet i C. Kräver libev och Linux-kunskaper." -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Hämta det här: https://github.com/jonashaag/bjoern, kompilera det" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" -msgstr "och kopiera bjoern.so till module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" +msgstr "och kopiera bjoern.so till pyload/lib" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Viktigt: I vissa ovanliga fall kanske den inbyggda servern inte fungerar. Om du upplever problem med webbgränssnittet" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "så kom tillbaka hit och ändra den inbyggda servern till den trådade servern." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## SSL-konfiguration ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Kör dessa kommandon från konfigurationsmappen för pyLoad för att skapa SSL-certifikaten:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Du kan aktivera SSL nu om du är färdig och allting gick bra." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Aktivera SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Välj åtgärd" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Skapa/Redigera användare" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Lista användare" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Ta bort användare" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Avsluta" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Användare" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Ställer in ny konfigurationssökväg. Aktuell konfiguration kommer inte att överföras!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Konfigurationssökväg" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Konfigurationssökvägen har ändrats. Guiden kommer nu att stängas. Starta om för att fortsätta." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Tryck Enter för att avsluta." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Inställning av konfigurationssökväg misslyckades: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: saknas" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Lösenord: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Lösenord (igen): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Lösenorden stämde inte överens." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "ja" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "sant" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "s" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "nej" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "falskt" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Ogiltig inmatning" diff --git a/locale/te/LC_MESSAGES/django.po b/locale/te/LC_MESSAGES/django.po index 08637a88d..e70361f00 100644 --- a/locale/te/LC_MESSAGES/django.po +++ b/locale/te/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/te/LC_MESSAGES/pyLoad.po b/locale/te/LC_MESSAGES/pyLoad.po index 9b38dd6fa..fd50b53a0 100644 --- a/locale/te/LC_MESSAGES/pyLoad.po +++ b/locale/te/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/te/LC_MESSAGES/pyLoadCli.po b/locale/te/LC_MESSAGES/pyLoadCli.po index 8bea11172..88558b540 100644 --- a/locale/te/LC_MESSAGES/pyLoadCli.po +++ b/locale/te/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/te/LC_MESSAGES/setup.po b/locale/te/LC_MESSAGES/setup.po index 3a58338b3..0249422a8 100644 --- a/locale/te/LC_MESSAGES/setup.po +++ b/locale/te/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/tr/LC_MESSAGES/django.po b/locale/tr/LC_MESSAGES/django.po index e76b54f38..63e227a8d 100644 --- a/locale/tr/LC_MESSAGES/django.po +++ b/locale/tr/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "Yeni Captcha İsteği" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "Lütfen captcha üstündeki metni okuyunuz." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad yeniden başlatıldı" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "Kapat" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "Başarılı" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "Aç" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "pyLoad'dan çıkmak istediğinize emin misiniz?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "Bağlantıyı yeniden başlat" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "Bağlantıyı Sil" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "Lütfen paket adını girin." -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "Lütfen sağdaki captcha ya tıklatın." -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "Bir hata oluştu." -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "Klasör boş" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Başarısız oldu" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "Okumak için Captcha bulunamadı" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "Parolalar eşleşmedi." -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "Ayarlar kaydedildi." -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "Yeni klasör" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "pyLoad'u yeniden başlatmak istediğinize emin misiniz?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "bekleyen %s" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "Aktif İndirmeler" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "Ev" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "İndirmeler" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "Loglar " -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "Ayarlar" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "İsim" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Durum" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "Bilgi" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Boyut" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "İlerleme" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Oturum açma" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Kullanıcı Adı" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Şifre" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "Kullanıcı adınız ve parolanız uymuyor. Lütfen tekrar deneyiniz." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "Hesabınızı sıfırlamak için veya yeni kullanıcı eklemek için çalıştırın:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "Bitenleri Temizle" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "Başarısızları Tekrar Başlat" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "Klasör:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "Şifre:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "Paketi Düzenle" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "Aşağıdaki paket detaylarını düzenle." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "Paketin adı." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Klasör" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "Bu indirmeler için alt klasör adı." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "Unrar için parola listesi." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Gönder" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "Sıfırla" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "Başarılı şekilde çıkış yaptınız." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "Yol" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "tam" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "Bağıntılı" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "isim" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "boyut" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "tip" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "son değişimi" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "ana klasör" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "içerik yok" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Genel" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "Eklentiler" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Hesaplar" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "Menüden bir bölüm seçiniz" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Eklenti" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "Son geçerlilik tarihi" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "Kalan trafik" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "Zaman" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "Maks Paralel" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "Sil?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "geçerli" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "geçersiz" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "evet" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "hayır" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Ekle" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "Hesap Ekle" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "Premium özelliklerini kullanabilmek için hesap bilgilerini giriniz." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "Kullanıcı adınız." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "Bu hesap için parola." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Türü" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "Hesabınız için host seçiniz." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "Başla" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "önceki" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "sonraki" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "Son" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "Haberler" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "Destek" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Sistem" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "pyLoad versiyonu:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "Kurulum Klasörü:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "Ayar Klasörü:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "İndirme Klasörü:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "Boş Alan:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "Dil:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Web Arayüz Portu:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "Uzak Arayüz Portu:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Kurulum" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "Dosya Yöneticisi" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "Paket Ekle" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "Linklerinizi yapıştırın veya taşıyıcı dosyayı yükleyin." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "Yeni paketin adı." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "Linkler" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "Linklerinizi veya herhangi bir metni yapıştırıp filitrele butonuna basınız." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "Linkleri filitrele" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "RAR-Arşiv dosyaları için parola" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "Dosya" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "Taşıyıcı dosyayı yükleyin." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Hedef" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "Captcha okunuyor" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "Captcha." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "Metin" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "Captcha üstündeki metni giriniz." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Kapat" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Web arayüzü" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "pyLoad Güncelleme mevcut!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "Eklentiler güncellendi, lütfen yeniden başlatın !" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "Captcha bekliyor" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "Çıkış" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "Yönet" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "Bilgi" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "Lütfen Giriş Yapın!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "Dur" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "İptal" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "İndirme:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "Yeniden bağlan:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "Hız:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "Aktif:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "Sayfayı yenile" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "yükleniyor" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "Sayfa başı" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "pyLoad'dan çık" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "pyLoad'ı yeniden başlat" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "Kullanıcı eklemek veya şifre değiştirmek:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "Önemli: Yönetici kullanıcısının her zaman tüm izinleri vardır!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "Parolayı Değiştir" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "İzinleri" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "değiştir" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "Şimdiki parolanızı ve değiştirmek istediğiniz parolayı giriniz." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "Kullanıcı" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "Parolanız" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "Yeni parola" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "Yeni parola." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "Yeni parola (tekrar)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "Lütfen yeni parolanızı tekrar giriniz." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Bu sayfaya erişmek için izniniz yok." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "İndirme dizini bulunamadı." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "sınırsız" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "mevcut değil" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Ayarlara erişmek için pyload.py -s çalıştırın." diff --git a/locale/tr/LC_MESSAGES/pyLoad.po b/locale/tr/LC_MESSAGES/pyLoad.po index c3d2d7a55..ea9d3755c 100644 --- a/locale/tr/LC_MESSAGES/pyLoad.po +++ b/locale/tr/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "Çıkış sinyali alındı" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad zaten %s pid ile çalışıyor" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "Grup değiştirme başarısız: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "Kullanıcı değiştirme başarısız: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "günlükler için klasör" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "Başlıyor" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "Ev dizinini kullan: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "geçici dosyalar için klasör" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "indirmeler için klasör" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "Güvenli bağlantı için OpenSSL" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "Eski kullanıcı ayarlarını veritabanına taşı" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "Giriş bilgilerinizi kontrol edin ./pyload.py -u" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "Tüm bağlantılar kaldırıldı" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "İndirme süresi: %s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "Boş alan: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "Hesap etkinleştiriliyor ..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "Eklentiler etkinleştiriliyor ..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad başlatıldı ve çalışıyor" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "pyLoad yeniden başlatılıyor" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "pyload çıkış" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "kapatılıyor ..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "kapatma sırasında hata oluştu" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "bitti" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "Çevrimdışı" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "Çevrimiçi" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "sıraya alındı" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "atlandı" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "bekliyor" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "geçici çevrimdışı" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "başlatılıyor" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "başarısız oldu" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "iptal edildi" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "çözülüyor" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "Özel" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "indiriliyor" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "işlem devam ediyor" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "bilinmeyen" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "Paket tamamlandı. %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "Uzak uç hatası: % s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "Başlıyor %(name)s: %(addr)s:%(port)s" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "Arka uç yüklenirken hata %(name)s | %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "bekleyen %s" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "SSL sertifikaları bulunamadı." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "Maalesef pyLoad içinde doğrudan başlangıç​​ %s için destek düştü" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "bjoern'i indirmek ve derlemek gerekir, https://github.com/jonashaag/bjoern" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "Bu sunucu hiçbir SSL sunmuyor, kullanarak yerine dişli düşünün lütfen" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "Yerleşik web sunucusu başlatılıyor: %(host)s:%(port)d" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "Bu sayfaya erişmek için izniniz yok." -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "İndirme dizini bulunamadı." -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "sınırsız" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "mevcut değil" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "Ayarlara erişmek için pyload.py -s çalıştırın." -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "Karşıdan yükleme başarısız, tekli bağlantıya dönün | %s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "Yükleme başlar: %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "Yükleme bitti: %s" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "Eklenti %s işlevi eksik." -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "Yükleme iptal edildi: %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "Yükleme yeniden başlatıldı: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "Yükleme çevrimdışı: %s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "Yükleme geçici olarak çevrımdışı: %s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "Yükleme başarısız: %(name)s | %(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "Sunucuya bağlanılamadı veya bağlantı sıfırlandı, 1 dakikalık erteleme bekleniyor." -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "Yükleme atlandı: %(name)s bunun yüzünden %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "Bilgisi %(name)s alınırken hata | %(err)s oluştu" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "Aktive etme başarısız %(name)s" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "Eklentiler etkinleştiriliyor: %s" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "Eklentiler kapatılıyor: %s" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "Tekrar bağlanma başarısız: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "Tekrar bağlanma komutu bulunamadı!" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "Tekrar bağlanma başlatılıyor" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "Yeniden Bağlantı komut dosyası yürütmesi başarısız!" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "Yeniden Bağlandı, yeni IP: %s" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "Aygıtta yeterli alan yok" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "Hesap ile giriş yapılamadı %(user)s | %(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "Hatalı Şifre" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "Hesap %s yeterli trafik yok, 30 dk içinde yeniden deneyin" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "Hesap %s süresi doldu, 1 saat içinde yeniden deneyin" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "İndirme sınırına erişildi" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "Alınırken hata %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "Hiçbir Sunucu yüklenemedi" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "Bitshare hesabınızdaki direk yüklemeyi aktifleştirin" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "Yetkilendirme gerekli (kullanıcı adı: şifre)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "Lütfen %s hesabınıza girin veya bu eklentiyi devre dışı bırakın" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "İndirilen dosyadaki (%s)... HTML kodunda yönlendirme hatası? Download yeniden başlatıldı." -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "Dosya geçici olarak kullanılamıyor" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "Netload: Yüklemeler %d s arasında bekliyor." -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "Netload: captcha için bekleniyor %d s." -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "İndirilen dosya boş" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "API anahtarı geçersiz" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: yeterli trafik kalmadı" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "Trafik aşıldı" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "Rapidshare: Trafik Paylaşılan (direk yükleme)" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "Zaten bu IP adresinden yükleme yapılmakta, 60 saniye bekleniyor" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "Geçersiz kimlik doğrulama kodu, yükleme yeniden başlatılacak" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "RapidShareCom: Tüm ücretsiz bağlantılar doldu" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "Bu dosya için premium üyelik hesabı gerekir" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "Dosya adı geçersiz bildirdi" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "Paralel yükleme hatası, 60 saniye bekleniyor." -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "giriş yapılmadı." -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "Çözümleme başarısız oldu" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "URL'de sağlanan hiçbir dosya anahtarı yok" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "Hata kodu:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "*** Eklentiler güncellendi, pyLoad'ı yeniden başlatın ***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "Eklentiler güncellendi ve yeniden yüklendi" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "Eklentiler için güncelleme yok" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "pyLoad için güncelleme yok" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "*** Yeni pyLoad Sürümü %s mevcuttur ***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** Buradan indirin: http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "Güncelleştirmeler için sunucuya bağlanmak mümkün değil" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "Yeni versiyonu %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "%s güncelleştirme hatası" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "Sürüm uyuşmazlığı" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "Yükleme bitti: %(name)s @ %(plugin)s " -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "Yeni Captcha İsteği: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "captcha üstündeki 'c %s metnini cevapla" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "Lütfen önce premium.to hesabınızı ekleyin ve pyLoad'u yeniden başlatın" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "HotFolder gelen ek %s" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "Yüklü %s yok" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "%s etkinleştirilemedi" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "Etkinleştirildi" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "Aktif Extract eklentisi yok" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "%s paketini daha sonra ayıklamak için sıraya alındı" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "%s paketi kontrol et" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "Arşiv ayıklanıyor şuraya %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "Arşivden ayıklanacak dosya bulunamadı" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "Ayıklanıyor" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "Şifre korumalı" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "Hatalı şifre" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "%s Dosya siliniyor" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "Ayıklama bitti" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "Arşiv hatası" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC Uyuşmazlığı" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "Bilinmeyen Hata" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "Kullanıcı ve Grup Ayarları başarısız oldu" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: Port 9666 zaten kullanılıyor" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "%s kredi kaldı" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "yanıt gönderilemedi." -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "Sizin CaptchaTrader hesabınızda yeterli kredi bulunmamakta" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "Şifreleme listesi bulunamadı" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Şifreleme listesi boş" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "Yükleme bitti: %(name)s @ %(plugin)s " -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "Yeni CaptchaID yükleme tarafından: %s : %s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "Captcha 9kw.eu hesabı yeterli kredi yok" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "%s: için yüklü komut dosyaları" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "Komut dosya çalıştırılamaz:" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "Hata %(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "ExpertDecoders hesabınızda yeterli kredi yok" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "Lütfen önce rehost.to hesabınızı ekleyin ve pyLoad'u yeniden başlatın" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "Lütfen önce bir geçerli premiumize.me hesabı ekleyin ve pyLoad yeniden başlatın." -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "%d kredi kaldı" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "Captcha şifresini çözmek için pil ve tesseract yüklenmemiş ve hiçbir istemci bağlı değil" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "Kullanıcı ve grup kurma başarısız oldu: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/tr/LC_MESSAGES/pyLoadCli.po b/locale/tr/LC_MESSAGES/pyLoadCli.po index 19d122f60..923de377c 100644 --- a/locale/tr/LC_MESSAGES/pyLoadCli.po +++ b/locale/tr/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Komut satır arayüzü" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s İndirmeler:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Hız: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Büyüklük: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Bitiş zamanı: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "ID:" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "bekleniyor: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Durum" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "Duraklatıldı" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "çalışıyor" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "toplam hız" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Sıradaki Dosyalar" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Toplam" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Menü:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Linkleri Ekle" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "Kuyruğu Düzenle" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "Kolektörü Düzenle " -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "(Un)Sunucuyu Durdur" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "Sunucuyu Devredışı bırak" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "Çıkış" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Lütfen doğru eşleştirme metnini kullanın:Ekle " -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "%d Linkler Kontrol ediliyor" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Dosya bulunamadı" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad durdu" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "Sunucu durumunu yazdır" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "Kuyruktakileri yazdır" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "Kolektördekileri yazdır" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "Kuyruğa paket ekle" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "Kolektöre paket ekle" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "Dosyaları Kuyruktan/Kolektör'den sil" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "Paketleri Kuyruktan/Kolektör'den sil" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Paketleri Kuyruktan , Kolektöre taşı veya tam tersini yap" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Dosyaları yenile" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "Paketleri yenile" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "Yerel konteynerla çalıştıgını ve online olup olmadığını kontrol et" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "Konteyner dosyalarının çemrimiçi oldugunu kontrol et" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "Sunucuyu durdur" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "indirmelere devam et" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "Seçilenleri durdur/devam ettir" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "sunucuyu durdur yap" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "Komut listesi" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "Kullanıcı ayar dosyası yazılamadı" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "pyLoad çekirdeğine bağlanmak için py-opensll ye baglanmanız lazım" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "Adres: " -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Port:" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Kullanıcı adı: " -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Şifre: " -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "Giriş bilgileri yanlış" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "%(addr)s:%(port)s. ile bağlantı kurulamadı" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "pyLoad çekirdeğine bağlanmak için py-opensll ye baglanmanız lazım" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "Bazı komutları onayladınızdan beri , Çevrimdışı modu engellendi" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Paket ekle:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Yeni paketin adını girin" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Paket: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Eklemek isteniz linkleri çözümle" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Tip %s tamamlandı" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Eklenen linkler: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "Menüye geri dön" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "Paketleri Düzenle:" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Linkleri Düzenle:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "Neleri taşımak istersiniz?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Neleri silmek istersiniz?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "Neleri yenilemek istersiniz?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "Ne yapmak istediniz seçin veya paket numarası girin." -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "sil" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "taşı" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "yeniden başlat " -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - önceki" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "-Sonraki" diff --git a/locale/tr/LC_MESSAGES/setup.po b/locale/tr/LC_MESSAGES/setup.po index e12e79344..ddc5a5de8 100644 --- a/locale/tr/LC_MESSAGES/setup.po +++ b/locale/tr/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "e" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "h" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "PyLoad ayar sihirbazına hoşgeldiniz." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Sisteminizi kontrol edecek ve pyLoad'ın çalışması için bir temel kurulum yapacaktır." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "Parantez içindeki değerler [], her zaman varsayılan değerdir" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "değiştirmek istemediğinde yada neyi seçeceğinden emin değilsen, sadece enter'e bas." -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "Unutma: pyload.py -setup yada -s ekleyerek bu Asistanı her zaman yeniden başlatabilirsiniz." -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "Asistan ile herhangi bir sorun yaşarsanız STRG-C tuşuna basın," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "iptal etmek ve pyload.py ile otomatik başlatmamak için." -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "Eğer sistem kontrolü için hazırsanız, enter'a basın." -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "pyLoad'ı çalıştırmak için pycurl, sqlite ve python 2.5, 2.6 veya 2.7 gerekir." -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "Lütfen bunu düzeltin ve pyLoad'ı yeniden çalıştırın." -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "Kur şimdi kapanacak." -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "Sistem kontrolü tamamlandı, durum raporunu görmek için Enter tuşuna basın." -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "## Durum ##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "ssl bağlantısı" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "Arayüz" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Web arayüzü" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "genişletilmiş Click'N'Load" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "Mevcut Özellikler:" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "Eksik Özellikler:" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "SSL bulunmamaktadır" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "Sisteme yada Web arayüzüne güvenli bağlantı için bu gerekli." -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "pyLoad'a yanlızca yerel erişmek istiyorsanız, ssl önerilmez." -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "Kullanıcı Arayüzü mevcut değil" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "Grafiksel Kullanıcı Arayüzü." -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "JavaScript motoru bulunamadı" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "Bazı Click'N'Load bağlantıları için gerekli. Spidermonkey, ossp-js, pyv8 yada rhino yükleyin" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "Şuan kurulum iptal edebilir ve gerekiyorsa bazı bağımlılık gerektiren düzeltmeleri yapabilirsiniz." -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "Kurulum ile devam edilsin mi?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "Yapılandırma yolunu değiştirmek istiyor musunuz? Mevcut% s" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "Yapılandırma yolunu değiştirme?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "Giriş verileri ve temel ayarları yapılandırmak istiyor musunuz?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "Bu ilk çalışma için tavsiye edilir." -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "Temel kurulum yap" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "Ssl yapılandırmak istiyor musunuz?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "Ssl yapılandırması" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "Web arayüzünü yapılandırmak istiyor musunuz?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "Web arayüzü yapılandırması?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "Kur başarıyla tamamlandı." -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Çıkmak için Enter tuşuna basın ve pyLoad'ı yeniden başlatın" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "## Sistem Kontrol ##" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "Python sürümünüz çok yeni, Python 2.6/2.7 kullanın" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "Python sürümünüz çok eski, en az Python 2.5 kullanın" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "Python Versiyon: OK" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "Yüklü olan Jinja2 versiyonu %s çok eski görünüyor." -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "JS motoru" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "## Temel Kurulum ##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "Aşağıdaki giriş verileri geçerlidir şunlar için CLI, GUI ve webarayüzü." -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Kullanıcı Adı" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "Uzaktan Erişim" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Dil" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "İndirme klasörü" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "Max indirme sayısı" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "Bağlantı sıfırlama?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "Komut dosyası konumu yeniden bağlanın" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "## Web arayüzü Kurulumu ##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "Web arayüzü etkin?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "Adrese bak, eğer 127.0.0.1 veya localhost kullanıyorsanız, webinterface yerel olarak erişilebilir olacaktır." -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Adres" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Port" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad şimdi kısa bir açıklama sonrasında, birçok sunucu arka uçları sunmaktadır." -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "Tarafından kullanılabilmek için apache, lighttpd, sana onları konfigüre etmek gerektirir; ki bu çok da kolay bir iş değildir." -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "Buradan edinin: https://github.com/jonashaag/bjoern, onu derleyin" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "Dikkat: Bazı farklı durumlarda yerleşik sunucu çalışmıyorsa, eğer webarayüzüyle ilgili problem farke edersen" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "Buraya gel ve burada yerleşik sunucu dişli değiştir." -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Sunucu" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "## SSL Kurulumu ##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Bu komutlar ssl sertifikaları yapmak için pyLoad config klasöründen çalıştırın:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Eğer yaptıysan ve her şey iyi gittiyse, ssl'yi şimdi etkinleştirebilirsiniz." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "SSL Etkinleştir?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Eylem seçin" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Kullanıcı Oluştur / Düzenle" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Kullanıcıları listele" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Kullanıcı kaldır" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Çıkış" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Kullanıcılar" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "Yeni ayarlar yapılandırma yolu, eski ayarlar transfer edilmeyecek!" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "Yapılandırma yolu" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "Yapılandırma yolu değişti, kurulum şimdi kapanacak, devam etmek için yeniden başlatın." -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Çıkmak için Enter tuşuna basın." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Yapılandırma ayar yolu başarısız oldu: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "%s: eksik" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Şifre: " -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Şifre çok kısa. En az 4 sembol kullanın." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Şifre (tekrar):" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "Parolalar eşleşmedi." -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "evet" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "doğru" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "d" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "hayır" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "yanlış" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "y" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Geçersiz giriş" diff --git a/locale/uk/LC_MESSAGES/django.po b/locale/uk/LC_MESSAGES/django.po index 388d61f64..0209d315c 100644 --- a/locale/uk/LC_MESSAGES/django.po +++ b/locale/uk/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "викл" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "вкл" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "Невдало" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Ім’я" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Статус" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Розмір" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Логін" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Ім'я користувача" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Пароль" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Папка" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Підтвердити" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Загальні" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Облікові записи" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Плагін" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "дійсний" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Додати" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "Тип" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "Система" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "Параметри" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Призначення" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Закрити" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Скасувати" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "Адмін" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "необмежений" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/uk/LC_MESSAGES/pyLoad.po b/locale/uk/LC_MESSAGES/pyLoad.po index 2c1e6af57..20c9a1b17 100644 --- a/locale/uk/LC_MESSAGES/pyLoad.po +++ b/locale/uk/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "SSL-сертифікати не знайдено." -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "необмежений" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/uk/LC_MESSAGES/pyLoadCli.po b/locale/uk/LC_MESSAGES/pyLoadCli.po index 57cb147ef..10ac61deb 100644 --- a/locale/uk/LC_MESSAGES/pyLoadCli.po +++ b/locale/uk/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr " Інтерфейс командного рядка" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s завантажень:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr " Швидкість: " -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr " Розмір: " -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr " Закінчив у: " -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "ID: " -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "очікування: " -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "Стан:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "призупинено" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "загальна швидкість" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "Файли у черзі" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "Всього" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Меню:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr " Додати посилання" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr " Керування чергою" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr " Керувати колектором" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr " Вбити сервер" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr " Вийти" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "Будь ласка, використовуйте такий синтаксис: додати < ім'я Пакета > ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Перевірка %d посилання:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Файл не існує." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "Перемістити пакунки з черги у колектор і навпаки" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "Додати пакет:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "Введіть ім'я для нового пакета" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Посилання додано: " -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Керування посиланнями:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "Що ви хочете видалити?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "видалити" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "перезапустити" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " -попередній" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "" diff --git a/locale/uk/LC_MESSAGES/setup.po b/locale/uk/LC_MESSAGES/setup.po index 5693044f1..a06a623f9 100644 --- a/locale/uk/LC_MESSAGES/setup.po +++ b/locale/uk/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "Ласкаво просимо до асистенту установки." -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "Ввашу систему зараз буде перевірено і зробленобазові установки для того, щоб запустити pyLoad." -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "Значення у квадратних дужках [] завжди є значення за замовчанням" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "Натисніть enter щоб перезапустіть pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Ім'я користувача" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Мова/Language" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Адреса" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Порт" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Сервер" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "# # SSL налаштування # #" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "Виконати ці команди з папки pyLoad для того щоб зробити ssl сертифікати:" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "Якщо ви все зробили, і все пройшло добре, ви можете активувати ssl зараз." -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "Активувати SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "Вибрати дію" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1 - Створення та редагування користувач" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2 - Список користувачів" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3 - Видалити користувача" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4 - Вихід" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "Користувачі" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "Натисніть клавішу Enter, щоб закрити." -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "Не вдалося змінити шлях до налаштувань: %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "Пароль занадто короткий. Мінімальна довжина 4 символа." -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "Пароль (ще раз): " -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "Так" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "Ні" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "Невірний ввід" diff --git a/locale/vi/LC_MESSAGES/django.po b/locale/vi/LC_MESSAGES/django.po index 6bdce3925..16cbce3da 100644 --- a/locale/vi/LC_MESSAGES/django.po +++ b/locale/vi/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "" -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "tắt" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "trên" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "Tên" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "Tình trạng" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "Kích thước" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "Đăng nhập" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "Tên người dùng" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "Mật khẩu" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "" -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "" -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "" -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "Thư mục" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "" -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "" -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "Gửi" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "Chung" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "Tài khoản" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "Plugin" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "hợp lệ" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "Thêm" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "" -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "" -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "" -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "" -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "" -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "" -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "" -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "Điểm đến" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "" -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "" -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "Đóng" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "Hủy bỏ" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "" -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "" -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "không giới hạn" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/vi/LC_MESSAGES/pyLoad.po b/locale/vi/LC_MESSAGES/pyLoad.po index 90bf0609d..3f1e8e5c8 100644 --- a/locale/vi/LC_MESSAGES/pyLoad.po +++ b/locale/vi/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "" -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "" -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "" -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "không giới hạn" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/vi/LC_MESSAGES/pyLoadCli.po b/locale/vi/LC_MESSAGES/pyLoadCli.po index 0f79cabe8..a35b37295 100644 --- a/locale/vi/LC_MESSAGES/pyLoadCli.po +++ b/locale/vi/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "Giao diện Dòng lệnh" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "%s Tải xuống:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "Tốc độ:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "Kích thước:" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "Kết thúc trong:" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "ID:" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "chờ:" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "Danh Mục:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "Thêm liên kết" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "(Un)Tạm dừng máy chủ" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "Dừng máy chủ" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "Thoát" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "" -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "Đang kiểm tra %d liên kết:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "Tập tin không tồn tại." -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "in trạng thái máy chủ" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "in hàng đợi tải xuống" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "Khởi động lại các tập tin." -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "tạm dừng máy chủ" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "tiếp tục tải xuống" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "chuyển giữa tạm dừng/tiếp tục" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "dừng máy chủ" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "địa chỉ:" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "Cổng:" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "Tên người dùng:" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "Mật khẩu:" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "Gói: %s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "Phân tích liên kết bạn muốn thêm." -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "Nhập %s khi xong." -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "Liên kết đã thêm:" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "quay lại menu chính" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "Quản lý liên kết" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr "- quay lại" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "- kế tiếp" diff --git a/locale/vi/LC_MESSAGES/setup.po b/locale/vi/LC_MESSAGES/setup.po index a063269c2..c02da4262 100644 --- a/locale/vi/LC_MESSAGES/setup.po +++ b/locale/vi/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "" -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "Tên người dùng" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "Ngôn ngữ" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "Địa chỉ" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "Cổng" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "Máy chủ" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "" -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "Mật khẩu:" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "" diff --git a/locale/zh/LC_MESSAGES/django.po b/locale/zh/LC_MESSAGES/django.po index d34a347af..192ea08f1 100644 --- a/locale/zh/LC_MESSAGES/django.po +++ b/locale/zh/LC_MESSAGES/django.po @@ -12,673 +12,673 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/webui/translations.js:1 +#: pyload/webui/translations.js:1 msgid "New Captcha Request" msgstr "新验证请求" -#: module/webui/translations.js:2 module/webui/themes/default/tml/captcha.html:7 +#: pyload/webui/translations.js:2 pyload/webui/themes/default/tml/captcha.html:7 msgid "Please read the text on the captcha." msgstr "请读取验证码上的文本." -#: module/webui/translations.js:3 +#: pyload/webui/translations.js:3 msgid "pyLoad restarted" msgstr "pyLoad已经重启" -#: module/webui/translations.js:4 -#: module/webui/themes/default/tml/settings_item.html:16 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:4 +#: pyload/webui/themes/default/tml/settings_item.html:16 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "off" msgstr "關" -#: module/webui/translations.js:5 +#: pyload/webui/translations.js:5 msgid "Success" msgstr "成功" -#: module/webui/translations.js:6 -#: module/webui/themes/default/tml/settings_item.html:14 -#: module/webui/themes/default/tml/base.html:123 -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/translations.js:6 +#: pyload/webui/themes/default/tml/settings_item.html:14 +#: pyload/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:124 msgid "on" msgstr "開" -#: module/webui/translations.js:7 +#: pyload/webui/translations.js:7 msgid "You are really sure you want to quit pyLoad?" msgstr "确认要退出pyLoad吗?" -#: module/webui/translations.js:8 +#: pyload/webui/translations.js:8 msgid "Restart Link" msgstr "链接重新开始" -#: module/webui/translations.js:9 +#: pyload/webui/translations.js:9 msgid "Delete Link" msgstr "删除链接" -#: module/webui/translations.js:10 +#: pyload/webui/translations.js:10 msgid "Please Enter a packagename." msgstr "请输入下载包名字" -#: module/webui/translations.js:11 +#: pyload/webui/translations.js:11 msgid "Please click on the right captcha position." msgstr "请点击正确的验证码位置" -#: module/webui/translations.js:12 +#: pyload/webui/translations.js:12 msgid "Error occured." msgstr "错误发生了" -#: module/webui/translations.js:13 -#: module/webui/themes/default/tml/filemanager.html:65 -#: module/webui/themes/default/tml/folder.html:14 +#: pyload/webui/translations.js:13 +#: pyload/webui/themes/default/tml/filemanager.html:65 +#: pyload/webui/themes/default/tml/folder.html:14 msgid "Folder is empty" msgstr "文件夹为空" -#: module/webui/translations.js:14 +#: pyload/webui/translations.js:14 msgid "Failed" msgstr "失敗" -#: module/webui/translations.js:15 +#: pyload/webui/translations.js:15 msgid "No Captchas to read." msgstr "没有获取验证码" -#: module/webui/translations.js:16 +#: pyload/webui/translations.js:16 msgid "Passwords did not match." msgstr "密码不符" -#: module/webui/translations.js:17 +#: pyload/webui/translations.js:17 msgid "Settings saved." msgstr "设置已保存" -#: module/webui/translations.js:18 +#: pyload/webui/translations.js:18 msgid "New folder" msgstr "新文件夹" -#: module/webui/translations.js:19 +#: pyload/webui/translations.js:19 msgid "Are you sure you want to restart pyLoad?" msgstr "确定重启pyLoad吗?" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/webui/themes/default/tml/home.html:206 +#: pyload/webui/themes/default/tml/home.html:206 msgid "Active Downloads" msgstr "活动下载" -#: module/webui/themes/default/tml/home.html:211 -#: module/webui/themes/default/tml/base.html:84 +#: pyload/webui/themes/default/tml/home.html:211 +#: pyload/webui/themes/default/tml/base.html:84 msgid "Home" msgstr "首页" -#: module/webui/themes/default/tml/home.html:214 -#: module/webui/themes/default/tml/queue.html:15 -#: module/webui/themes/default/tml/window.html:34 -#: module/webui/themes/default/tml/base.html:87 +#: pyload/webui/themes/default/tml/home.html:214 +#: pyload/webui/themes/default/tml/queue.html:15 +#: pyload/webui/themes/default/tml/window.html:34 +#: pyload/webui/themes/default/tml/base.html:87 msgid "Queue" msgstr "" -#: module/webui/themes/default/tml/home.html:217 -#: module/webui/themes/default/tml/queue.html:17 -#: module/webui/themes/default/tml/window.html:36 -#: module/webui/themes/default/tml/base.html:90 +#: pyload/webui/themes/default/tml/home.html:217 +#: pyload/webui/themes/default/tml/queue.html:17 +#: pyload/webui/themes/default/tml/window.html:36 +#: pyload/webui/themes/default/tml/base.html:90 msgid "Collector" msgstr "" -#: module/webui/themes/default/tml/home.html:220 -#: module/webui/themes/default/tml/downloads.html:6 -#: module/webui/themes/default/tml/base.html:93 +#: pyload/webui/themes/default/tml/home.html:220 +#: pyload/webui/themes/default/tml/downloads.html:6 +#: pyload/webui/themes/default/tml/base.html:93 msgid "Downloads" msgstr "已下载" -#: module/webui/themes/default/tml/home.html:226 -#: module/webui/themes/default/tml/logs.html:3 -#: module/webui/themes/default/tml/logs.html:4 -#: module/webui/themes/default/tml/base.html:99 +#: pyload/webui/themes/default/tml/home.html:226 +#: pyload/webui/themes/default/tml/logs.html:3 +#: pyload/webui/themes/default/tml/logs.html:4 +#: pyload/webui/themes/default/tml/base.html:99 msgid "Logs" msgstr "日志" -#: module/webui/themes/default/tml/home.html:229 -#: module/webui/themes/default/tml/settings.html:3 -#: module/webui/themes/default/tml/settings.html:4 -#: module/webui/themes/default/tml/base.html:102 +#: pyload/webui/themes/default/tml/home.html:229 +#: pyload/webui/themes/default/tml/settings.html:3 +#: pyload/webui/themes/default/tml/settings.html:4 +#: pyload/webui/themes/default/tml/base.html:102 msgid "Config" msgstr "配置" -#: module/webui/themes/default/tml/home.html:237 -#: module/webui/themes/default/tml/queue.html:82 -#: module/webui/themes/default/tml/settings.html:91 -#: module/webui/themes/default/tml/window.html:7 -#: module/webui/themes/default/tml/admin.html:25 +#: pyload/webui/themes/default/tml/home.html:237 +#: pyload/webui/themes/default/tml/queue.html:82 +#: pyload/webui/themes/default/tml/settings.html:91 +#: pyload/webui/themes/default/tml/window.html:7 +#: pyload/webui/themes/default/tml/admin.html:25 msgid "Name" msgstr "名稱" -#: module/webui/themes/default/tml/home.html:238 -#: module/webui/themes/default/tml/settings.html:93 +#: pyload/webui/themes/default/tml/home.html:238 +#: pyload/webui/themes/default/tml/settings.html:93 msgid "Status" msgstr "狀態" -#: module/webui/themes/default/tml/home.html:239 -#: module/webui/themes/default/tml/info.html:14 -#: module/webui/themes/default/tml/info.html:15 +#: pyload/webui/themes/default/tml/home.html:239 +#: pyload/webui/themes/default/tml/info.html:14 +#: pyload/webui/themes/default/tml/info.html:15 msgid "Information" msgstr "信息" -#: module/webui/themes/default/tml/home.html:240 +#: pyload/webui/themes/default/tml/home.html:240 msgid "Size" msgstr "大小" -#: module/webui/themes/default/tml/home.html:241 +#: pyload/webui/themes/default/tml/home.html:241 msgid "Progress" msgstr "进度" -#: module/webui/themes/default/tml/login.html:3 -#: module/webui/themes/default/tml/settings.html:178 +#: pyload/webui/themes/default/tml/login.html:3 +#: pyload/webui/themes/default/tml/settings.html:178 msgid "Login" msgstr "登入" -#: module/webui/themes/default/tml/login.html:14 +#: pyload/webui/themes/default/tml/login.html:14 msgid "Username" msgstr "使用者名稱" -#: module/webui/themes/default/tml/login.html:19 -#: module/webui/themes/default/tml/queue.html:92 -#: module/webui/themes/default/tml/settings.html:92 -#: module/webui/themes/default/tml/settings.html:183 -#: module/webui/themes/default/tml/window.html:21 +#: pyload/webui/themes/default/tml/login.html:19 +#: pyload/webui/themes/default/tml/queue.html:92 +#: pyload/webui/themes/default/tml/settings.html:92 +#: pyload/webui/themes/default/tml/settings.html:183 +#: pyload/webui/themes/default/tml/window.html:21 msgid "Password" msgstr "密碼" -#: module/webui/themes/default/tml/login.html:29 +#: pyload/webui/themes/default/tml/login.html:29 msgid "Your username and password didn't match. Please try again." msgstr "您的用户名和密码不匹配, 请再试一次." -#: module/webui/themes/default/tml/login.html:30 +#: pyload/webui/themes/default/tml/login.html:30 msgid "To reset your login data or add an user run:" msgstr "要重置您的登录数据或添加一个用户, 请运行:" -#: module/webui/themes/default/tml/queue.html:25 +#: pyload/webui/themes/default/tml/queue.html:25 msgid "Delete Finished" msgstr "删除完成" -#: module/webui/themes/default/tml/queue.html:26 +#: pyload/webui/themes/default/tml/queue.html:26 msgid "Restart Failed" msgstr "重启出错" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Folder:" msgstr "文件夹:" -#: module/webui/themes/default/tml/queue.html:65 +#: pyload/webui/themes/default/tml/queue.html:65 msgid "Password:" msgstr "密码:" -#: module/webui/themes/default/tml/queue.html:79 +#: pyload/webui/themes/default/tml/queue.html:79 msgid "Edit Package" msgstr "编辑下载" -#: module/webui/themes/default/tml/queue.html:80 +#: pyload/webui/themes/default/tml/queue.html:80 msgid "Edit the package detais below." msgstr "修改文件包详细注释信息." -#: module/webui/themes/default/tml/queue.html:83 +#: pyload/webui/themes/default/tml/queue.html:83 msgid "The name of the package." msgstr "文件名." -#: module/webui/themes/default/tml/queue.html:87 +#: pyload/webui/themes/default/tml/queue.html:87 msgid "Folder" msgstr "目錄" -#: module/webui/themes/default/tml/queue.html:88 +#: pyload/webui/themes/default/tml/queue.html:88 msgid "Name of subfolder for these downloads." msgstr "此下载的子目录名." -#: module/webui/themes/default/tml/queue.html:93 +#: pyload/webui/themes/default/tml/queue.html:93 msgid "List of passwords used for unrar." msgstr "UNRAR解压缩密码列表." -#: module/webui/themes/default/tml/queue.html:97 -#: module/webui/themes/default/tml/settings.html:167 -#: module/webui/themes/default/tml/captcha.html:33 -#: module/webui/themes/default/tml/admin.html:61 -#: module/webui/themes/default/tml/admin.html:91 +#: pyload/webui/themes/default/tml/queue.html:97 +#: pyload/webui/themes/default/tml/settings.html:167 +#: pyload/webui/themes/default/tml/captcha.html:33 +#: pyload/webui/themes/default/tml/admin.html:61 +#: pyload/webui/themes/default/tml/admin.html:91 msgid "Submit" msgstr "同意" -#: module/webui/themes/default/tml/queue.html:98 -#: module/webui/themes/default/tml/settings.html:198 -#: module/webui/themes/default/tml/window.html:41 -#: module/webui/themes/default/tml/admin.html:92 +#: pyload/webui/themes/default/tml/queue.html:98 +#: pyload/webui/themes/default/tml/settings.html:198 +#: pyload/webui/themes/default/tml/window.html:41 +#: pyload/webui/themes/default/tml/admin.html:92 msgid "Reset" msgstr "重置" -#: module/webui/themes/default/tml/logout.html:8 +#: pyload/webui/themes/default/tml/logout.html:8 msgid "You were successfully logged out." msgstr "您已成功注销." -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "Path" msgstr "路径" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "absolute" msgstr "绝对" -#: module/webui/themes/default/tml/pathchooser.html:39 -#: module/webui/themes/default/tml/pathchooser.html:41 +#: pyload/webui/themes/default/tml/pathchooser.html:39 +#: pyload/webui/themes/default/tml/pathchooser.html:41 msgid "relative" msgstr "相对" -#: module/webui/themes/default/tml/pathchooser.html:46 +#: pyload/webui/themes/default/tml/pathchooser.html:46 msgid "name" msgstr "名称" -#: module/webui/themes/default/tml/pathchooser.html:47 +#: pyload/webui/themes/default/tml/pathchooser.html:47 msgid "size" msgstr "大小" -#: module/webui/themes/default/tml/pathchooser.html:48 +#: pyload/webui/themes/default/tml/pathchooser.html:48 msgid "type" msgstr "类型" -#: module/webui/themes/default/tml/pathchooser.html:49 +#: pyload/webui/themes/default/tml/pathchooser.html:49 msgid "last modified" msgstr "最后修改" -#: module/webui/themes/default/tml/pathchooser.html:54 +#: pyload/webui/themes/default/tml/pathchooser.html:54 msgid "parent directory" msgstr "父目录" -#: module/webui/themes/default/tml/pathchooser.html:70 +#: pyload/webui/themes/default/tml/pathchooser.html:70 msgid "no content" msgstr "没有内容" -#: module/webui/themes/default/tml/settings.html:16 +#: pyload/webui/themes/default/tml/settings.html:16 msgid "General" msgstr "一般設定" -#: module/webui/themes/default/tml/settings.html:17 +#: pyload/webui/themes/default/tml/settings.html:17 msgid "Plugins" msgstr "插件" -#: module/webui/themes/default/tml/settings.html:18 +#: pyload/webui/themes/default/tml/settings.html:18 msgid "Accounts" msgstr "帳戶" -#: module/webui/themes/default/tml/settings.html:45 -#: module/webui/themes/default/tml/settings.html:74 +#: pyload/webui/themes/default/tml/settings.html:45 +#: pyload/webui/themes/default/tml/settings.html:74 msgid "Choose a section from the menu" msgstr "从菜单中选择一项目" -#: module/webui/themes/default/tml/settings.html:90 +#: pyload/webui/themes/default/tml/settings.html:90 msgid "Plugin" msgstr "外掛" -#: module/webui/themes/default/tml/settings.html:94 +#: pyload/webui/themes/default/tml/settings.html:94 msgid "Premium" msgstr "高级帐号" -#: module/webui/themes/default/tml/settings.html:95 +#: pyload/webui/themes/default/tml/settings.html:95 msgid "Valid until" msgstr "有效期至" -#: module/webui/themes/default/tml/settings.html:96 +#: pyload/webui/themes/default/tml/settings.html:96 msgid "Traffic left" msgstr "剩余流量" -#: module/webui/themes/default/tml/settings.html:97 +#: pyload/webui/themes/default/tml/settings.html:97 msgid "Time" msgstr "时间" -#: module/webui/themes/default/tml/settings.html:98 +#: pyload/webui/themes/default/tml/settings.html:98 msgid "Max Parallel" msgstr "最大连接数" -#: module/webui/themes/default/tml/settings.html:99 +#: pyload/webui/themes/default/tml/settings.html:99 msgid "Delete?" msgstr "确认删除?" -#: module/webui/themes/default/tml/settings.html:121 +#: pyload/webui/themes/default/tml/settings.html:121 msgid "valid" msgstr "有效的" -#: module/webui/themes/default/tml/settings.html:124 +#: pyload/webui/themes/default/tml/settings.html:124 msgid "not valid" msgstr "无效" -#: module/webui/themes/default/tml/settings.html:131 +#: pyload/webui/themes/default/tml/settings.html:131 msgid "yes" msgstr "是" -#: module/webui/themes/default/tml/settings.html:134 +#: pyload/webui/themes/default/tml/settings.html:134 msgid "no" msgstr "否" -#: module/webui/themes/default/tml/settings.html:168 -#: module/webui/themes/default/tml/settings.html:197 -#: module/webui/themes/default/tml/base.html:117 +#: pyload/webui/themes/default/tml/settings.html:168 +#: pyload/webui/themes/default/tml/settings.html:197 +#: pyload/webui/themes/default/tml/base.html:117 msgid "Add" msgstr "增加" -#: module/webui/themes/default/tml/settings.html:176 +#: pyload/webui/themes/default/tml/settings.html:176 msgid "Add Account" msgstr "新增帳號" -#: module/webui/themes/default/tml/settings.html:177 +#: pyload/webui/themes/default/tml/settings.html:177 msgid "Enter your account data to use premium features." msgstr "输入您的帐户资料来使用高级功能." -#: module/webui/themes/default/tml/settings.html:179 -#: module/webui/themes/default/tml/admin.html:71 +#: pyload/webui/themes/default/tml/settings.html:179 +#: pyload/webui/themes/default/tml/admin.html:71 msgid "Your username." msgstr "您的用户名." -#: module/webui/themes/default/tml/settings.html:184 -#: module/webui/themes/default/tml/admin.html:76 +#: pyload/webui/themes/default/tml/settings.html:184 +#: pyload/webui/themes/default/tml/admin.html:76 msgid "The password for this account." msgstr "当前密码仅为此帐号所用." -#: module/webui/themes/default/tml/settings.html:188 +#: pyload/webui/themes/default/tml/settings.html:188 msgid "Type" msgstr "種類" -#: module/webui/themes/default/tml/settings.html:189 +#: pyload/webui/themes/default/tml/settings.html:189 msgid "Choose the hoster for your account." msgstr "请选择您帐号对应的网盘类型." -#: module/webui/themes/default/tml/logs.html:12 -#: module/webui/themes/default/tml/base.html:114 +#: pyload/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/base.html:114 msgid "Start" msgstr "启动" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "prev" msgstr "上一页" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "next" msgstr "下一页" -#: module/webui/themes/default/tml/logs.html:12 +#: pyload/webui/themes/default/tml/logs.html:12 msgid "End" msgstr "完成" -#: module/webui/themes/default/tml/info.html:18 +#: pyload/webui/themes/default/tml/info.html:18 msgid "News" msgstr "新闻" -#: module/webui/themes/default/tml/info.html:21 +#: pyload/webui/themes/default/tml/info.html:21 msgid "Support" msgstr "技术支持" -#: module/webui/themes/default/tml/info.html:37 +#: pyload/webui/themes/default/tml/info.html:37 msgid "System" msgstr "系統" -#: module/webui/themes/default/tml/info.html:40 +#: pyload/webui/themes/default/tml/info.html:40 msgid "Python:" msgstr "" -#: module/webui/themes/default/tml/info.html:44 +#: pyload/webui/themes/default/tml/info.html:44 msgid "OS:" msgstr "操作系统:" -#: module/webui/themes/default/tml/info.html:48 +#: pyload/webui/themes/default/tml/info.html:48 msgid "pyLoad version:" msgstr "pyLoad 版本:" -#: module/webui/themes/default/tml/info.html:52 +#: pyload/webui/themes/default/tml/info.html:52 msgid "Installation Folder:" msgstr "安装文件夹:" -#: module/webui/themes/default/tml/info.html:56 +#: pyload/webui/themes/default/tml/info.html:56 msgid "Config Folder:" msgstr "配置文件夹:" -#: module/webui/themes/default/tml/info.html:60 +#: pyload/webui/themes/default/tml/info.html:60 msgid "Download Folder:" msgstr "下载文件夹:" -#: module/webui/themes/default/tml/info.html:64 +#: pyload/webui/themes/default/tml/info.html:64 msgid "Free Space:" msgstr "空闲空间:" -#: module/webui/themes/default/tml/info.html:68 +#: pyload/webui/themes/default/tml/info.html:68 msgid "Language:" msgstr "语言:" -#: module/webui/themes/default/tml/info.html:72 +#: pyload/webui/themes/default/tml/info.html:72 msgid "Webinterface Port:" msgstr "Web界面端口:" -#: module/webui/themes/default/tml/info.html:76 +#: pyload/webui/themes/default/tml/info.html:76 msgid "Remote Interface Port:" msgstr "远程接口端口:" -#: module/webui/themes/default/tml/setup.html:3 -#: module/webui/themes/default/tml/setup.html:4 +#: pyload/webui/themes/default/tml/setup.html:3 +#: pyload/webui/themes/default/tml/setup.html:4 msgid "Setup" msgstr "設定" -#: module/webui/themes/default/tml/filemanager.html:19 +#: pyload/webui/themes/default/tml/filemanager.html:19 msgid "FileManager" msgstr "文件管理器" -#: module/webui/themes/default/tml/window.html:5 -#: module/webui/themes/default/tml/window.html:40 +#: pyload/webui/themes/default/tml/window.html:5 +#: pyload/webui/themes/default/tml/window.html:40 msgid "Add Package" msgstr "添加下载" -#: module/webui/themes/default/tml/window.html:6 +#: pyload/webui/themes/default/tml/window.html:6 msgid "Paste your links or upload a container." msgstr "粘贴链接或者上传一容器." -#: module/webui/themes/default/tml/window.html:8 +#: pyload/webui/themes/default/tml/window.html:8 msgid "The name of the new package." msgstr "新建下载的名字." -#: module/webui/themes/default/tml/window.html:12 +#: pyload/webui/themes/default/tml/window.html:12 msgid "Links" msgstr "链接" -#: module/webui/themes/default/tml/window.html:13 +#: pyload/webui/themes/default/tml/window.html:13 msgid "Paste your links here or any text and press the filter button." msgstr "在这里粘贴您的链接或任何文本内容, 然后按\"过滤\"按钮." -#: module/webui/themes/default/tml/window.html:14 +#: pyload/webui/themes/default/tml/window.html:14 msgid "Filter urls" msgstr "过滤" -#: module/webui/themes/default/tml/window.html:22 +#: pyload/webui/themes/default/tml/window.html:22 msgid "Password for RAR-Archive" msgstr "RAR压缩包密码" -#: module/webui/themes/default/tml/window.html:26 +#: pyload/webui/themes/default/tml/window.html:26 msgid "File" msgstr "文件" -#: module/webui/themes/default/tml/window.html:27 +#: pyload/webui/themes/default/tml/window.html:27 msgid "Upload a container." msgstr "上传一容器." -#: module/webui/themes/default/tml/window.html:31 +#: pyload/webui/themes/default/tml/window.html:31 msgid "Destination" msgstr "目的地" -#: module/webui/themes/default/tml/captcha.html:6 +#: pyload/webui/themes/default/tml/captcha.html:6 msgid "Captcha reading" msgstr "验证码读取中..." -#: module/webui/themes/default/tml/captcha.html:13 +#: pyload/webui/themes/default/tml/captcha.html:13 msgid "Captcha" msgstr "验证码" -#: module/webui/themes/default/tml/captcha.html:14 +#: pyload/webui/themes/default/tml/captcha.html:14 msgid "The captcha." msgstr "验证码." -#: module/webui/themes/default/tml/captcha.html:20 +#: pyload/webui/themes/default/tml/captcha.html:20 msgid "Text" msgstr "文本" -#: module/webui/themes/default/tml/captcha.html:21 +#: pyload/webui/themes/default/tml/captcha.html:21 msgid "Input the text on the captcha." msgstr "输入验证码上的文本." -#: module/webui/themes/default/tml/captcha.html:34 +#: pyload/webui/themes/default/tml/captcha.html:34 msgid "Close" msgstr "關閉" -#: module/webui/themes/default/tml/base.html:20 -#: module/webui/themes/default/tml/base.html:139 +#: pyload/webui/themes/default/tml/base.html:20 +#: pyload/webui/themes/default/tml/base.html:139 msgid "Webinterface" msgstr "Web界面" -#: module/webui/themes/default/tml/base.html:39 +#: pyload/webui/themes/default/tml/base.html:39 msgid "pyLoad Update available!" msgstr "pyLoad 更新可用!" -#: module/webui/themes/default/tml/base.html:46 +#: pyload/webui/themes/default/tml/base.html:46 msgid "Plugins updated, please restart!" msgstr "插件已更新, 请重新启动程序!" -#: module/webui/themes/default/tml/base.html:52 +#: pyload/webui/themes/default/tml/base.html:52 msgid "Captcha waiting" msgstr "验证码等待中" -#: module/webui/themes/default/tml/base.html:57 +#: pyload/webui/themes/default/tml/base.html:57 msgid "Logout" msgstr "注销" -#: module/webui/themes/default/tml/base.html:59 -#: module/webui/themes/default/tml/admin.html:8 -#: module/webui/themes/default/tml/admin.html:9 +#: pyload/webui/themes/default/tml/base.html:59 +#: pyload/webui/themes/default/tml/admin.html:8 +#: pyload/webui/themes/default/tml/admin.html:9 msgid "Administrate" msgstr "管理" -#: module/webui/themes/default/tml/base.html:61 +#: pyload/webui/themes/default/tml/base.html:61 msgid "Info" msgstr "信息" -#: module/webui/themes/default/tml/base.html:65 +#: pyload/webui/themes/default/tml/base.html:65 msgid "Please Login!" msgstr "请登录!" -#: module/webui/themes/default/tml/base.html:115 +#: pyload/webui/themes/default/tml/base.html:115 msgid "Stop" msgstr "停止" -#: module/webui/themes/default/tml/base.html:116 +#: pyload/webui/themes/default/tml/base.html:116 msgid "Cancel" msgstr "取消" -#: module/webui/themes/default/tml/base.html:123 +#: pyload/webui/themes/default/tml/base.html:123 msgid "Download:" msgstr "下载:" -#: module/webui/themes/default/tml/base.html:124 +#: pyload/webui/themes/default/tml/base.html:124 msgid "Reconnect:" msgstr "重新连接:" -#: module/webui/themes/default/tml/base.html:125 +#: pyload/webui/themes/default/tml/base.html:125 msgid "Speed:" msgstr "速度:" -#: module/webui/themes/default/tml/base.html:126 +#: pyload/webui/themes/default/tml/base.html:126 msgid "Active:" msgstr "活动:" -#: module/webui/themes/default/tml/base.html:127 +#: pyload/webui/themes/default/tml/base.html:127 msgid "Reload page" msgstr "刷新页面" -#: module/webui/themes/default/tml/base.html:157 +#: pyload/webui/themes/default/tml/base.html:157 msgid "loading" msgstr "加载中" -#: module/webui/themes/default/tml/base.html:166 +#: pyload/webui/themes/default/tml/base.html:166 msgid "Back to top" msgstr "返回顶部" -#: module/webui/themes/default/tml/admin.html:13 +#: pyload/webui/themes/default/tml/admin.html:13 msgid "Quit pyLoad" msgstr "退出pyLoad" -#: module/webui/themes/default/tml/admin.html:14 +#: pyload/webui/themes/default/tml/admin.html:14 msgid "Restart pyLoad" msgstr "重启pyLoad" -#: module/webui/themes/default/tml/admin.html:18 +#: pyload/webui/themes/default/tml/admin.html:18 msgid "To add user or change passwords use:" msgstr "添加用户或更改密码请使用:" -#: module/webui/themes/default/tml/admin.html:19 +#: pyload/webui/themes/default/tml/admin.html:19 msgid "Important: Admin user have always all permissions!" msgstr "重要提示:管理员账户具有所有操作权限!" -#: module/webui/themes/default/tml/admin.html:28 -#: module/webui/themes/default/tml/admin.html:67 +#: pyload/webui/themes/default/tml/admin.html:28 +#: pyload/webui/themes/default/tml/admin.html:67 msgid "Change Password" msgstr "更改密码" -#: module/webui/themes/default/tml/admin.html:31 +#: pyload/webui/themes/default/tml/admin.html:31 msgid "Admin" msgstr "" -#: module/webui/themes/default/tml/admin.html:34 +#: pyload/webui/themes/default/tml/admin.html:34 msgid "Permissions" msgstr "许可" -#: module/webui/themes/default/tml/admin.html:41 +#: pyload/webui/themes/default/tml/admin.html:41 msgid "change" msgstr "更改" -#: module/webui/themes/default/tml/admin.html:69 +#: pyload/webui/themes/default/tml/admin.html:69 msgid "Enter your current and desired Password." msgstr "请输入您当前以及需要修改的密码." -#: module/webui/themes/default/tml/admin.html:70 +#: pyload/webui/themes/default/tml/admin.html:70 msgid "User" msgstr "用户" -#: module/webui/themes/default/tml/admin.html:75 +#: pyload/webui/themes/default/tml/admin.html:75 msgid "Current password" msgstr "当前密码" -#: module/webui/themes/default/tml/admin.html:80 +#: pyload/webui/themes/default/tml/admin.html:80 msgid "New password" msgstr "新密码" -#: module/webui/themes/default/tml/admin.html:81 +#: pyload/webui/themes/default/tml/admin.html:81 msgid "The new password." msgstr "新的密码." -#: module/webui/themes/default/tml/admin.html:85 +#: pyload/webui/themes/default/tml/admin.html:85 msgid "New password (repeat)" msgstr "新密码 (重复)" -#: module/webui/themes/default/tml/admin.html:86 +#: pyload/webui/themes/default/tml/admin.html:86 msgid "Please repeat the new password." msgstr "请确认您的新密码." -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "無限制" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" diff --git a/locale/zh/LC_MESSAGES/pyLoad.po b/locale/zh/LC_MESSAGES/pyLoad.po index 19a8a1487..c8d759aab 100644 --- a/locale/zh/LC_MESSAGES/pyLoad.po +++ b/locale/zh/LC_MESSAGES/pyLoad.po @@ -12,854 +12,854 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/Core.py:182 +#: pyload/Core.py:182 msgid "Received Quit signal" msgstr "收到退出訊號" -#: module/Core.py:303 +#: pyload/Core.py:303 #, python-format msgid "pyLoad already running with pid %s" msgstr "pyLoad已經在執行,pid %s" -#: module/Core.py:317 +#: pyload/Core.py:317 #, python-format msgid "Failed changing group: %s" msgstr "無法改變群組: %s" -#: module/Core.py:327 +#: pyload/Core.py:327 #, python-format msgid "Failed changing user: %s" msgstr "無法改變使用者: %s" -#: module/Core.py:329 +#: pyload/Core.py:329 msgid "folder for logs" msgstr "LOG文件夹" -#: module/Core.py:340 +#: pyload/Core.py:340 msgid "Starting" msgstr "開始" -#: module/Core.py:341 +#: pyload/Core.py:341 #, python-format msgid "Using home directory: %s" msgstr "使用家目錄: %s" -#: module/Core.py:350 +#: pyload/Core.py:350 msgid "pycrypto to decode container files" msgstr "使用pycrypto解密文件" -#: module/Core.py:353 +#: pyload/Core.py:353 msgid "folder for temporary files" msgstr "临时文件夹" -#: module/Core.py:358 +#: pyload/Core.py:358 msgid "folder for downloads" msgstr "下载文件夹" -#: module/Core.py:361 +#: pyload/Core.py:361 msgid "OpenSSL for secure connection" msgstr "使用OpenSSL安全登陆" -#: module/Core.py:365 +#: pyload/Core.py:365 msgid "Moving old user config to DB" msgstr "将旧用户设定移入数据库" -#: module/Core.py:368 +#: pyload/Core.py:368 msgid "Please check your logindata with ./pyload.py -u" msgstr "请执行./pyload.py -u 来确认你的logindata" -#: module/Core.py:371 +#: pyload/Core.py:371 msgid "All links removed" msgstr "刪除所有連結" -#: module/Core.py:402 +#: pyload/Core.py:402 #, python-format msgid "Downloadtime: %s" msgstr "下载时间:%s" -#: module/Core.py:412 +#: pyload/Core.py:412 #, python-format msgid "Free space: %s" msgstr "剩餘空間: %s" -#: module/Core.py:432 +#: pyload/Core.py:432 msgid "Activating Accounts..." msgstr "啟動帳戶..." -#: module/Core.py:438 +#: pyload/Core.py:438 msgid "Activating Plugins..." msgstr "激活插件中..." -#: module/Core.py:441 +#: pyload/Core.py:441 msgid "pyLoad is up and running" msgstr "pyLoad已是最新的狀態" -#: module/Core.py:460 +#: pyload/Core.py:460 msgid "restarting pyLoad" msgstr "重新啟動pyLoad" -#: module/Core.py:464 +#: pyload/Core.py:464 msgid "pyLoad quits" msgstr "離開pyLoad" -#: module/Core.py:521 +#: pyload/Core.py:521 #, python-format msgid "Install %s" msgstr "安装 %s" -#: module/Core.py:557 +#: pyload/Core.py:557 #, python-format msgid "could not find %(desc)s: %(name)s" msgstr "无法找到%(desc)s: %(name)s" -#: module/Core.py:559 +#: pyload/Core.py:559 #, python-format msgid "could not create %(desc)s: %(name)s" msgstr "无法创建%(desc)s: %(name)s" -#: module/Core.py:580 +#: pyload/Core.py:580 msgid "shutting down..." msgstr "關閉..." -#: module/Core.py:597 +#: pyload/Core.py:597 msgid "error while shutting down" msgstr "關閉時出現錯誤" -#: module/Core.py:661 +#: pyload/Core.py:661 msgid "killed pyLoad from Terminal" msgstr "" -#: module/database/DatabaseBackend.py:174 +#: pyload/database/DatabaseBackend.py:174 msgid "Filedatabase was deleted due to incompatible version." msgstr "" -#: module/database/DatabaseBackend.py:189 +#: pyload/database/DatabaseBackend.py:189 msgid "Filedatabase could NOT be converted." msgstr "" -#: module/database/DatabaseBackend.py:198 +#: pyload/database/DatabaseBackend.py:198 msgid "Database was converted from v2 to v3." msgstr "" -#: module/database/DatabaseBackend.py:206 +#: pyload/database/DatabaseBackend.py:206 msgid "Database was converted from v3 to v4." msgstr "" -#: module/database/DatabaseBackend.py:252 +#: pyload/database/DatabaseBackend.py:252 msgid "Converting old Django DB" msgstr "" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "finished" msgstr "已完成" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "offline" msgstr "離線" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "online" msgstr "線上" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "queued" msgstr "佇列" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "skipped" msgstr "跳過" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "waiting" msgstr "等待中" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "temp. offline" msgstr "暫時離線" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "starting" msgstr "開始" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "failed" msgstr "失敗" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "aborted" msgstr "中止" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "decrypting" msgstr "解析" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "custom" msgstr "自訂" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "downloading" msgstr "下載中" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "processing" msgstr "處理中" -#: module/database/FileDatabase.py:45 +#: pyload/database/FileDatabase.py:45 msgid "unknown" msgstr "未知" -#: module/database/FileDatabase.py:531 module/plugins/hooks/IRCInterface.py:74 -#: module/plugins/hooks/XMPPInterface.py:83 +#: pyload/database/FileDatabase.py:531 pyload/plugins/hooks/IRCInterface.py:74 +#: pyload/plugins/hooks/XMPPInterface.py:83 #, python-format msgid "Package finished: %s" msgstr "套件已完成: %s" -#: module/remote/ThriftBackend.py:39 +#: pyload/remote/ThriftBackend.py:39 msgid "Using SSL ThriftBackend" msgstr "" -#: module/remote/RemoteManager.py:35 +#: pyload/remote/RemoteManager.py:35 #, python-format msgid "Remote backend error: %s" msgstr "遠端錯誤: %s" -#: module/remote/RemoteManager.py:82 +#: pyload/remote/RemoteManager.py:82 #, python-format msgid "Starting %(name)s: %(addr)s:%(port)s" msgstr "%(name)s :%(addr)s:%(port)s 啟動中" -#: module/remote/RemoteManager.py:84 +#: pyload/remote/RemoteManager.py:84 #, python-format msgid "Failed loading backend %(name)s | %(error)s" msgstr "無法載入 %(name)s: %(error)s" -#: module/webui/app/json.py:57 +#: pyload/webui/app/json.py:57 #, python-format msgid "waiting %s" msgstr "" -#: module/threads/ServerThread.py:35 +#: pyload/threads/ServerThread.py:35 msgid "SSL certificates not found." msgstr "沒有找到SSL憑證" -#: module/threads/ServerThread.py:39 +#: pyload/threads/ServerThread.py:39 #, python-format msgid "Sorry, we dropped support for starting %s directly within pyLoad" msgstr "" -#: module/threads/ServerThread.py:40 +#: pyload/threads/ServerThread.py:40 msgid "You can use the threaded server which offers good performance and ssl," msgstr "" -#: module/threads/ServerThread.py:41 +#: pyload/threads/ServerThread.py:41 #, python-format msgid "of course you can still use your existing %s with pyLoads fastcgi server" msgstr "" -#: module/threads/ServerThread.py:42 -msgid "sample configs are located in the module/webui/servers directory" +#: pyload/threads/ServerThread.py:42 +msgid "sample configs are located in the pyload/webui/servers directory" msgstr "" -#: module/threads/ServerThread.py:49 +#: pyload/threads/ServerThread.py:49 #, python-format msgid "Can't use %(server)s, python-flup is not installed!" msgstr "" -#: module/threads/ServerThread.py:56 +#: pyload/threads/ServerThread.py:56 #, python-format msgid "Error importing lightweight server: %s" msgstr "" -#: module/threads/ServerThread.py:57 +#: pyload/threads/ServerThread.py:57 msgid "You need to download and compile bjoern, https://github.com/jonashaag/bjoern" msgstr "" -#: module/threads/ServerThread.py:58 -msgid "Copy the boern.so to module/lib folder or use setup.py install" +#: pyload/threads/ServerThread.py:58 +msgid "Copy the boern.so to pyload/lib folder or use setup.py install" msgstr "" -#: module/threads/ServerThread.py:59 +#: pyload/threads/ServerThread.py:59 msgid "Of course you need to be familiar with linux and know how to compile software" msgstr "" -#: module/threads/ServerThread.py:63 +#: pyload/threads/ServerThread.py:63 msgid "Server set to threaded, due to known performance problems on windows." msgstr "" -#: module/threads/ServerThread.py:80 module/threads/ServerThread.py:103 +#: pyload/threads/ServerThread.py:80 pyload/threads/ServerThread.py:103 msgid "This server offers no SSL, please consider using threaded instead" msgstr "目前的服務器不支援SSL,請將伺服器模式改為Threaded" -#: module/threads/ServerThread.py:82 +#: pyload/threads/ServerThread.py:82 #, python-format msgid "Starting builtin webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:87 +#: pyload/threads/ServerThread.py:87 #, python-format msgid "Starting threaded SSL webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:91 +#: pyload/threads/ServerThread.py:91 #, python-format msgid "Starting threaded webserver: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:97 +#: pyload/threads/ServerThread.py:97 #, python-format msgid "Starting fastcgi server: %(host)s:%(port)d" msgstr "" -#: module/threads/ServerThread.py:105 +#: pyload/threads/ServerThread.py:105 #, python-format msgid "Starting lightweight webserver (bjoern): %(host)s:%(port)d" msgstr "" -#: module/webui/app/pyload.py:125 +#: pyload/webui/app/pyload.py:125 msgid "You dont have permission to access this page." msgstr "" -#: module/webui/app/pyload.py:193 +#: pyload/webui/app/pyload.py:193 msgid "Download directory not found." msgstr "" -#: module/webui/app/pyload.py:260 module/webui/app/pyload.py:267 +#: pyload/webui/app/pyload.py:260 pyload/webui/app/pyload.py:267 msgid "unlimited" msgstr "無限制" -#: module/webui/app/pyload.py:262 module/webui/app/pyload.py:269 +#: pyload/webui/app/pyload.py:262 pyload/webui/app/pyload.py:269 msgid "not available" msgstr "" -#: module/webui/app/pyload.py:508 +#: pyload/webui/app/pyload.py:508 msgid "Run pyload.py -s to access the setup." msgstr "" -#: module/network/HTTPDownload.py:245 +#: pyload/network/HTTPDownload.py:245 #, python-format msgid "Download chunks failed, fallback to single connection | %s" msgstr "分區下載失敗,採用單一連接下載|%s" -#: module/threads/PluginThread.py:183 +#: pyload/threads/PluginThread.py:183 #, python-format msgid "Download starts: %s" msgstr "開始下載 %s" -#: module/threads/PluginThread.py:189 +#: pyload/threads/PluginThread.py:189 #, python-format msgid "Download finished: %s" msgstr "%s 下載完成" -#: module/threads/PluginThread.py:194 module/threads/PluginThread.py:365 +#: pyload/threads/PluginThread.py:194 pyload/threads/PluginThread.py:365 #, python-format msgid "Plugin %s is missing a function." msgstr "%s 模組缺少相關功能" -#: module/threads/PluginThread.py:202 module/threads/PluginThread.py:265 -#: module/threads/PluginThread.py:382 +#: pyload/threads/PluginThread.py:202 pyload/threads/PluginThread.py:265 +#: pyload/threads/PluginThread.py:382 #, python-format msgid "Download aborted: %s" msgstr "取消下載 %s" -#: module/threads/PluginThread.py:222 +#: pyload/threads/PluginThread.py:222 #, python-format msgid "Download restarted: %(name)s | %(msg)s" msgstr "重新下載%(name)s |%(msg)s" -#: module/threads/PluginThread.py:231 module/threads/PluginThread.py:373 +#: pyload/threads/PluginThread.py:231 pyload/threads/PluginThread.py:373 #, python-format msgid "Download is offline: %s" msgstr "下載任務斷線:%s" -#: module/threads/PluginThread.py:234 +#: pyload/threads/PluginThread.py:234 #, python-format msgid "Download is temporary offline: %s" msgstr "下載任務暫時斷線:%s" -#: module/threads/PluginThread.py:237 module/threads/PluginThread.py:304 +#: pyload/threads/PluginThread.py:237 pyload/threads/PluginThread.py:304 #, python-format msgid "Download failed: %(name)s | %(msg)s" msgstr "%(name)s 下載失敗|%(msg)s" -#: module/threads/PluginThread.py:254 +#: pyload/threads/PluginThread.py:254 msgid "Couldn't connect to host or connection reset, waiting 1 minute and retry." msgstr "無法連線至host,一分鐘後重試" -#: module/threads/PluginThread.py:290 +#: pyload/threads/PluginThread.py:290 #, python-format msgid "Download skipped: %(name)s due to %(plugin)s" msgstr "%(name)s 取消下載,由於 %(plugin)s" -#: module/threads/PluginThread.py:361 +#: pyload/threads/PluginThread.py:361 #, python-format msgid "Decrypting starts: %s" msgstr "" -#: module/threads/PluginThread.py:376 module/threads/PluginThread.py:394 +#: pyload/threads/PluginThread.py:376 pyload/threads/PluginThread.py:394 #, python-format msgid "Decrypting failed: %(name)s | %(msg)s" msgstr "" -#: module/threads/PluginThread.py:388 +#: pyload/threads/PluginThread.py:388 #, python-format msgid "Retrying %s" msgstr "" -#: module/threads/PluginThread.py:635 +#: pyload/threads/PluginThread.py:635 #, python-format msgid "Info Fetching for %(name)s failed | %(err)s" msgstr "取得 %(name)s的錯誤資訊|%(err)s" -#: module/HookManager.py:90 module/plugins/Hook.py:102 +#: pyload/HookManager.py:90 pyload/plugins/Hook.py:102 #, python-format msgid "Error executing hooks: %s" msgstr "" -#: module/HookManager.py:140 +#: pyload/HookManager.py:140 #, python-format msgid "Failed activating %(name)s" msgstr "啟用 %(name)s 時發生錯誤" -#: module/HookManager.py:144 +#: pyload/HookManager.py:144 #, python-format msgid "Activated plugins: %s" msgstr "" -#: module/HookManager.py:145 +#: pyload/HookManager.py:145 #, python-format msgid "Deactivate plugins: %s" msgstr "" -#: module/ThreadManager.py:137 +#: pyload/ThreadManager.py:137 #, python-format msgid "Reconnect Failed: %s" msgstr "重新連接失敗: %s" -#: module/ThreadManager.py:176 +#: pyload/ThreadManager.py:176 msgid "Reconnect script not found!" msgstr "重新連接腳本未找到 !" -#: module/ThreadManager.py:182 +#: pyload/ThreadManager.py:182 msgid "Starting reconnect" msgstr "開始重試" -#: module/ThreadManager.py:196 +#: pyload/ThreadManager.py:196 msgid "Failed executing reconnect script!" msgstr "執行重試腳本失敗" -#: module/ThreadManager.py:208 +#: pyload/ThreadManager.py:208 #, python-format msgid "Reconnected, new IP: %s" msgstr "使用新IP: %s 重試" -#: module/ThreadManager.py:288 +#: pyload/ThreadManager.py:288 msgid "Not enough space left on device" msgstr "儲存空間不足" -#: module/plugins/Account.py:85 module/plugins/Account.py:91 +#: pyload/plugins/Account.py:85 pyload/plugins/Account.py:91 #, python-format msgid "Could not login with account %(user)s | %(msg)s" msgstr "無法登入%(user)s |%(msg)s" -#: module/plugins/Account.py:86 +#: pyload/plugins/Account.py:86 msgid "Wrong Password" msgstr "密碼錯誤" -#: module/plugins/Account.py:240 +#: pyload/plugins/Account.py:240 #, python-format msgid "Your Time %s has wrong format, use: 1:22-3:44" msgstr "" -#: module/plugins/Account.py:266 +#: pyload/plugins/Account.py:266 #, python-format msgid "Account %s has not enough traffic, checking again in 30min" msgstr "帳戶 %s 流量用鑿,30分鐘後重新檢查" -#: module/plugins/Account.py:273 +#: pyload/plugins/Account.py:273 #, python-format msgid "Account %s is expired, checking again in 1h" msgstr "帳戶 %s 已過期,一小時後重試" -#: module/plugins/crypter/SerienjunkiesOrg.py:128 +#: pyload/plugins/crypter/SerienjunkiesOrg.py:128 msgid "Downloadlimit reached" msgstr "已達到下載流量上限" -#: module/plugins/PluginManager.py:153 +#: pyload/plugins/PluginManager.py:153 #, python-format msgid "%s has a invalid pattern." msgstr "" -#: module/plugins/PluginManager.py:272 +#: pyload/plugins/PluginManager.py:272 #, python-format msgid "Error importing %(name)s: %(msg)s" msgstr "發現錯誤 %(name)s: %(msg)s" -#: module/plugins/internal/MultiHoster.py:133 +#: pyload/plugins/internal/MultiHoster.py:133 msgid "No Hoster loaded" msgstr "找不到任何Hoster" -#: module/plugins/accounts/BitshareCom.py:37 +#: pyload/plugins/accounts/BitshareCom.py:37 msgid "Activate direct Download in your Bitshare Account" msgstr "從您的Bitshare帳號中直接下載" -#: module/plugins/container/LinkList.py:65 +#: pyload/plugins/container/LinkList.py:65 msgid "LinkList could not be cleared." msgstr "" -#: module/plugins/AccountManager.py:88 +#: pyload/plugins/AccountManager.py:88 msgid "Account settings deleted, due to new config format." msgstr "" -#: module/plugins/hoster/BasePlugin.py:65 +#: pyload/plugins/hoster/BasePlugin.py:65 msgid "Authorization required (username:password)" msgstr "需要認證(帳號:密碼)" -#: module/plugins/hoster/SimplydebridCom.py:25 -#: module/plugins/hoster/RealdebridCom.py:41 -#: module/plugins/hoster/FreeWayMe.py:38 module/plugins/hoster/ZeveraCom.py:22 -#: module/plugins/hoster/UnrestrictLi.py:53 -#: module/plugins/hoster/Premium4Me.py:28 module/plugins/hoster/FastixRu.py:36 -#: module/plugins/hoster/AlldebridCom.py:38 -#: module/plugins/hoster/DebridItaliaCom.py:40 -#: module/plugins/hoster/RPNetBiz.py:26 -#: module/plugins/hoster/MultiDebridCom.py:41 -#: module/plugins/hoster/ReloadCc.py:24 module/plugins/hoster/RehostTo.py:26 -#: module/plugins/hoster/PremiumizeMe.py:22 -#: module/plugins/hooks/RPNetBiz.py:43 +#: pyload/plugins/hoster/SimplydebridCom.py:25 +#: pyload/plugins/hoster/RealdebridCom.py:41 +#: pyload/plugins/hoster/FreeWayMe.py:38 pyload/plugins/hoster/ZeveraCom.py:22 +#: pyload/plugins/hoster/UnrestrictLi.py:53 +#: pyload/plugins/hoster/Premium4Me.py:28 pyload/plugins/hoster/FastixRu.py:36 +#: pyload/plugins/hoster/AlldebridCom.py:38 +#: pyload/plugins/hoster/DebridItaliaCom.py:40 +#: pyload/plugins/hoster/RPNetBiz.py:26 +#: pyload/plugins/hoster/MultiDebridCom.py:41 +#: pyload/plugins/hoster/ReloadCc.py:24 pyload/plugins/hoster/RehostTo.py:26 +#: pyload/plugins/hoster/PremiumizeMe.py:22 +#: pyload/plugins/hooks/RPNetBiz.py:43 #, python-format msgid "Please enter your %s account or deactivate this plugin" msgstr "請輸入你的帳戶或是停用此模組" -#: module/plugins/hoster/FilesMailRu.py:99 +#: pyload/plugins/hoster/FilesMailRu.py:99 #, python-format msgid "There was HTML Code in the Downloaded File (%s)...redirect error? The Download will be restarted." msgstr "下載檔案中包含HTML語法,解析錯誤嗎?準備重試" -#: module/plugins/hoster/NetloadIn.py:146 -#: module/plugins/hoster/NetloadIn.py:170 +#: pyload/plugins/hoster/NetloadIn.py:146 +#: pyload/plugins/hoster/NetloadIn.py:170 msgid "File temporarily not available" msgstr "檔案暫時無法下載" -#: module/plugins/hoster/NetloadIn.py:183 +#: pyload/plugins/hoster/NetloadIn.py:183 #, python-format msgid "Netload: waiting between downloads %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:214 +#: pyload/plugins/hoster/NetloadIn.py:214 #, python-format msgid "Netload: waiting for captcha %d s." msgstr "" -#: module/plugins/hoster/NetloadIn.py:252 +#: pyload/plugins/hoster/NetloadIn.py:252 msgid "Downloaded File was empty" msgstr "下載的檔案是空的" -#: module/plugins/hoster/UploadedTo.py:129 +#: pyload/plugins/hoster/UploadedTo.py:129 msgid "API key invalid" msgstr "API金鑰無效" -#: module/plugins/hoster/UploadedTo.py:153 +#: pyload/plugins/hoster/UploadedTo.py:153 #, python-format msgid "%s: Not enough traffic left" msgstr "%s: 流量已用完" -#: module/plugins/hoster/UploadedTo.py:156 +#: pyload/plugins/hoster/UploadedTo.py:156 msgid "Traffic exceeded" msgstr "超出流量限制" -#: module/plugins/hoster/RapidshareCom.py:100 +#: pyload/plugins/hoster/RapidshareCom.py:100 msgid "Rapidshare: Traffic Share (direct download)" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:127 -#: module/plugins/hoster/RapidshareCom.py:194 +#: pyload/plugins/hoster/RapidshareCom.py:127 +#: pyload/plugins/hoster/RapidshareCom.py:194 msgid "Already downloading from this ip address, waiting 60 seconds" msgstr "此IP位址已在下載另一項目,請等待六十秒後重試" -#: module/plugins/hoster/RapidshareCom.py:131 +#: pyload/plugins/hoster/RapidshareCom.py:131 msgid "Invalid Auth Code, download will be restarted" msgstr "驗證失敗,任務即將重試" -#: module/plugins/hoster/RapidshareCom.py:199 +#: pyload/plugins/hoster/RapidshareCom.py:199 msgid "RapidShareCom: No free slots" msgstr "" -#: module/plugins/hoster/RapidshareCom.py:202 +#: pyload/plugins/hoster/RapidshareCom.py:202 msgid "You need a premium account for this file" msgstr "此檔案需要高級用戶才能下載" -#: module/plugins/hoster/RapidshareCom.py:204 +#: pyload/plugins/hoster/RapidshareCom.py:204 msgid "Filename reported invalid" msgstr "不正確的檔名" -#: module/plugins/hoster/FileserveCom.py:99 +#: pyload/plugins/hoster/FileserveCom.py:99 msgid "Parallel download error, now waiting 60s." msgstr "同時下載錯誤,60秒後重試" -#: module/plugins/hoster/FileserveCom.py:215 +#: pyload/plugins/hoster/FileserveCom.py:215 msgid "Not logged in." msgstr "未登入" -#: module/plugins/hoster/MegaNz.py:56 +#: pyload/plugins/hoster/MegaNz.py:56 msgid "Decryption failed" msgstr "解析失敗" -#: module/plugins/hoster/MegaNz.py:106 +#: pyload/plugins/hoster/MegaNz.py:106 msgid "No file key provided in the URL" msgstr "URL未提供金鑰" -#: module/plugins/hoster/MegaNz.py:118 +#: pyload/plugins/hoster/MegaNz.py:118 msgid "Error code:" msgstr "錯誤碼:" -#: module/plugins/Container.py:68 +#: pyload/plugins/Container.py:68 msgid "File not exists." msgstr "" -#: module/plugins/hooks/UpdateManager.py:74 +#: pyload/plugins/hooks/UpdateManager.py:74 msgid "*** Plugins have been updated, please restart pyLoad ***" msgstr "***外掛已更新,請重新啟動pyLoad***" -#: module/plugins/hooks/UpdateManager.py:76 +#: pyload/plugins/hooks/UpdateManager.py:76 msgid "Plugins updated and reloaded" msgstr "外掛已更新" -#: module/plugins/hooks/UpdateManager.py:79 +#: pyload/plugins/hooks/UpdateManager.py:79 msgid "No plugin updates available" msgstr "外掛沒有可用的更新" -#: module/plugins/hooks/UpdateManager.py:96 +#: pyload/plugins/hooks/UpdateManager.py:96 msgid "No Updates for pyLoad" msgstr "pyLoad沒有可用的更新" -#: module/plugins/hooks/UpdateManager.py:100 +#: pyload/plugins/hooks/UpdateManager.py:100 #, python-format msgid "*** New pyLoad Version %s available ***" msgstr "***pyLoad有新版本%s可使用***" -#: module/plugins/hooks/UpdateManager.py:101 +#: pyload/plugins/hooks/UpdateManager.py:101 msgid "*** Get it here: http://pyload.org/download ***" msgstr "*** 請從此下載 http://pyload.org/download ***" -#: module/plugins/hooks/UpdateManager.py:104 +#: pyload/plugins/hooks/UpdateManager.py:104 msgid "Not able to connect server for updates" msgstr "無法連線至更新伺服器" -#: module/plugins/hooks/UpdateManager.py:148 +#: pyload/plugins/hooks/UpdateManager.py:148 #, python-format msgid "New version of %(type)s|%(name)s : %(version).2f" msgstr "新版本 %(type)s|%(name)s : %(version).2f" -#: module/plugins/hooks/UpdateManager.py:157 -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:157 +#: pyload/plugins/hooks/UpdateManager.py:162 #, python-format msgid "Error when updating %s" msgstr "更新 %s 時發生錯誤" -#: module/plugins/hooks/UpdateManager.py:162 +#: pyload/plugins/hooks/UpdateManager.py:162 msgid "Version mismatch" msgstr "版本不合" -#: module/plugins/hooks/IRCInterface.py:82 +#: pyload/plugins/hooks/IRCInterface.py:82 #, python-format msgid "Download finished: %(name)s @ %(plugin)s " msgstr "%(name)s @ %(plugin)s 已完成" -#: module/plugins/hooks/IRCInterface.py:95 +#: pyload/plugins/hooks/IRCInterface.py:95 #, python-format msgid "New Captcha Request: %s" msgstr "驗證碼請求: %s" -#: module/plugins/hooks/IRCInterface.py:96 +#: pyload/plugins/hooks/IRCInterface.py:96 #, python-format msgid "Answer with 'c %s text on the captcha'" msgstr "請輸入驗證碼上的文字 %s" -#: module/plugins/hooks/Premium4Me.py:29 +#: pyload/plugins/hooks/Premium4Me.py:29 msgid "Please add your premium.to account first and restart pyLoad" msgstr "請先添加premium.to帳戶並重新啟動pyLoad" -#: module/plugins/hooks/HotFolder.py:82 +#: pyload/plugins/hooks/HotFolder.py:82 #, python-format msgid "Added %s from HotFolder" msgstr "從HotFolder增加 %s" -#: module/plugins/hooks/ExtractArchive.py:95 +#: pyload/plugins/hooks/ExtractArchive.py:95 #, python-format msgid "No %s installed" msgstr "未安裝 %s" -#: module/plugins/hooks/ExtractArchive.py:97 -#: module/plugins/hooks/ExtractArchive.py:102 +#: pyload/plugins/hooks/ExtractArchive.py:97 +#: pyload/plugins/hooks/ExtractArchive.py:102 #, python-format msgid "Could not activate %s" msgstr "無法啟用 %s" -#: module/plugins/hooks/ExtractArchive.py:107 +#: pyload/plugins/hooks/ExtractArchive.py:107 msgid "Activated" msgstr "已啟用" -#: module/plugins/hooks/ExtractArchive.py:109 +#: pyload/plugins/hooks/ExtractArchive.py:109 msgid "No Extract plugins activated" msgstr "解壓縮外掛未啟用" -#: module/plugins/hooks/ExtractArchive.py:121 +#: pyload/plugins/hooks/ExtractArchive.py:121 #, python-format msgid "Package %s queued for later extracting" msgstr "任務 %s 已排入解壓佇列" -#: module/plugins/hooks/ExtractArchive.py:144 +#: pyload/plugins/hooks/ExtractArchive.py:144 #, python-format msgid "Check package %s" msgstr "檢查下載任務 %s" -#: module/plugins/hooks/ExtractArchive.py:185 +#: pyload/plugins/hooks/ExtractArchive.py:185 #, python-format msgid "Extract to %s" msgstr "解壓縮至 %s" -#: module/plugins/hooks/ExtractArchive.py:200 +#: pyload/plugins/hooks/ExtractArchive.py:200 msgid "No files found to extract" msgstr "無法找到壓縮檔" -#: module/plugins/hooks/ExtractArchive.py:207 +#: pyload/plugins/hooks/ExtractArchive.py:207 msgid "extracting" msgstr "解壓縮中" -#: module/plugins/hooks/ExtractArchive.py:218 +#: pyload/plugins/hooks/ExtractArchive.py:218 msgid "Password protected" msgstr "被加密的壓縮檔" -#: module/plugins/hooks/ExtractArchive.py:239 +#: pyload/plugins/hooks/ExtractArchive.py:239 msgid "Wrong password" msgstr "密碼錯誤" -#: module/plugins/hooks/ExtractArchive.py:247 +#: pyload/plugins/hooks/ExtractArchive.py:247 #, python-format msgid "Deleting %s files" msgstr "刪除檔案 %s" -#: module/plugins/hooks/ExtractArchive.py:254 +#: pyload/plugins/hooks/ExtractArchive.py:254 msgid "Extracting finished" msgstr "解壓縮完成" -#: module/plugins/hooks/ExtractArchive.py:260 +#: pyload/plugins/hooks/ExtractArchive.py:260 msgid "Archive Error" msgstr "壓縮檔損毀" -#: module/plugins/hooks/ExtractArchive.py:262 +#: pyload/plugins/hooks/ExtractArchive.py:262 msgid "CRC Mismatch" msgstr "CRC不正確" -#: module/plugins/hooks/ExtractArchive.py:266 +#: pyload/plugins/hooks/ExtractArchive.py:266 msgid "Unknown Error" msgstr "未知錯誤" -#: module/plugins/hooks/ExtractArchive.py:318 +#: pyload/plugins/hooks/ExtractArchive.py:318 msgid "Setting User and Group failed" msgstr "設定使用者及群組失敗" -#: module/plugins/hooks/ClickAndLoad.py:75 +#: pyload/plugins/hooks/ClickAndLoad.py:75 msgid "Click'N'Load: Port 9666 already in use" msgstr "Click'N'Load: 9666阜已被使用" -#: module/plugins/hooks/CaptchaTrader.py:69 -#: module/plugins/hooks/Captcha9kw.py:59 -#: module/plugins/hooks/ExpertDecoders.py:50 +#: pyload/plugins/hooks/CaptchaTrader.py:69 +#: pyload/plugins/hooks/Captcha9kw.py:59 +#: pyload/plugins/hooks/ExpertDecoders.py:50 #, python-format msgid "%s credits left" msgstr "額度剩餘 %s" -#: module/plugins/hooks/CaptchaTrader.py:117 +#: pyload/plugins/hooks/CaptchaTrader.py:117 msgid "Could not send response." msgstr "無法發送回應。" -#: module/plugins/hooks/CaptchaTrader.py:135 +#: pyload/plugins/hooks/CaptchaTrader.py:135 msgid "Your CaptchaTrader Account has not enough credits" msgstr "CaptchaTrader帳戶額度不足" -#: module/plugins/hooks/LinkdecrypterCom.py:43 +#: pyload/plugins/hooks/LinkdecrypterCom.py:43 msgid "Crypter list not found" msgstr "未找到Crypter清單" -#: module/plugins/hooks/LinkdecrypterCom.py:57 +#: pyload/plugins/hooks/LinkdecrypterCom.py:57 msgid "Crypter list is empty" msgstr "Crypter清單是空的" -#: module/plugins/hooks/XMPPInterface.py:91 +#: pyload/plugins/hooks/XMPPInterface.py:91 #, python-format msgid "Download finished: %(name)s @ %(plugin)s" msgstr "%(name)s @ %(plugin)s 完成" -#: module/plugins/hooks/Captcha9kw.py:93 +#: pyload/plugins/hooks/Captcha9kw.py:93 #, python-format msgid "New CaptchaID from upload: %s : %s" msgstr "上傳新的CaptchaID:%s:%s" -#: module/plugins/hooks/Captcha9kw.py:129 +#: pyload/plugins/hooks/Captcha9kw.py:129 msgid "Your Captcha 9kw.eu Account has not enough credits" msgstr "9kw.eu帳戶額度不足" -#: module/plugins/hooks/ExternalScripts.py:54 +#: pyload/plugins/hooks/ExternalScripts.py:54 #, python-format msgid "Installed scripts for %s: " msgstr "%s 已安裝的腳本" -#: module/plugins/hooks/ExternalScripts.py:69 +#: pyload/plugins/hooks/ExternalScripts.py:69 msgid "Script not executable:" msgstr "無法執行腳本" -#: module/plugins/hooks/ExternalScripts.py:80 +#: pyload/plugins/hooks/ExternalScripts.py:80 #, python-format msgid "Error in %(script)s: %(error)s" msgstr "%(script)s: %(error)s" -#: module/plugins/hooks/ExpertDecoders.py:95 +#: pyload/plugins/hooks/ExpertDecoders.py:95 msgid "Your ExpertDecoders Account has not enough credits" msgstr "ExpertDecoders帳戶額度不足" -#: module/plugins/hooks/RehostTo.py:32 +#: pyload/plugins/hooks/RehostTo.py:32 msgid "Please add your rehost.to account first and restart pyLoad" msgstr "請先添加rehost.to帳戶並重新啟動pyLoad" -#: module/plugins/hooks/PremiumizeMe.py:48 +#: pyload/plugins/hooks/PremiumizeMe.py:48 msgid "Please add a valid premiumize.me account first and restart pyLoad." msgstr "請先設定premiumize.me帳戶並重新啟動pyLoad" -#: module/plugins/hooks/CaptchaBrotherhood.py:69 +#: pyload/plugins/hooks/CaptchaBrotherhood.py:69 #, python-format msgid "%d credits left" msgstr "額度剩下 %d" -#: module/plugins/Plugin.py:389 +#: pyload/plugins/Plugin.py:389 msgid "Pil and tesseract not installed and no Client connected for captcha decrypting" msgstr "尚未安裝Pil及tesseract,尚未連接至需要解析的客戶端" -#: module/plugins/Plugin.py:393 +#: pyload/plugins/Plugin.py:393 msgid "No captcha result obtained in appropiate time by any of the plugins." msgstr "" -#: module/plugins/Plugin.py:498 module/plugins/Plugin.py:532 +#: pyload/plugins/Plugin.py:498 pyload/plugins/Plugin.py:532 #, python-format msgid "Setting User and Group failed: %s" msgstr "設置使用者和組失敗: %s" -#: module/CaptchaManager.py:78 +#: pyload/CaptchaManager.py:78 msgid "No Client connected for captcha decrypting" msgstr "" -#: module/Api.py:330 +#: pyload/Api.py:330 #, python-format msgid "Added package %(name)s containing %(count)d links" msgstr "" -#: module/Api.py:593 +#: pyload/Api.py:593 #, python-format msgid "Added %(count)d links to package #%(package)d " msgstr "" -#: module/common/JsEngine.py:156 +#: pyload/common/JsEngine.py:156 msgid "No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" diff --git a/locale/zh/LC_MESSAGES/pyLoadCli.po b/locale/zh/LC_MESSAGES/pyLoadCli.po index 47d8acb01..fd5ebd330 100644 --- a/locale/zh/LC_MESSAGES/pyLoadCli.po +++ b/locale/zh/LC_MESSAGES/pyLoadCli.po @@ -12,284 +12,284 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/cli/Cli.py:75 module/cli/Cli.py:133 +#: pyload/cli/Cli.py:75 pyload/cli/Cli.py:133 msgid " Command Line Interface" msgstr "命令列介面" -#: module/cli/Cli.py:165 +#: pyload/cli/Cli.py:165 #, python-format msgid "%s Downloads:" msgstr "已下載 %s:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Speed: " msgstr "速度:" -#: module/cli/Cli.py:177 +#: pyload/cli/Cli.py:177 msgid " Size: " msgstr "大小:" -#: module/cli/Cli.py:178 +#: pyload/cli/Cli.py:178 msgid " Finished in: " msgstr "距離完成:" -#: module/cli/Cli.py:179 +#: pyload/cli/Cli.py:179 msgid " ID: " msgstr "編號:" -#: module/cli/Cli.py:184 +#: pyload/cli/Cli.py:184 msgid "waiting: " msgstr "等待中:" -#: module/cli/Cli.py:191 module/cli/Cli.py:193 +#: pyload/cli/Cli.py:191 pyload/cli/Cli.py:193 msgid "Status:" msgstr "狀態:" -#: module/cli/Cli.py:191 +#: pyload/cli/Cli.py:191 msgid "paused" msgstr "已暫停" -#: module/cli/Cli.py:193 +#: pyload/cli/Cli.py:193 msgid "running" msgstr "執行中" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "total Speed" msgstr "總速度" -#: module/cli/Cli.py:196 +#: pyload/cli/Cli.py:196 msgid "Files in queue" msgstr "佇列中檔案" -#: module/cli/Cli.py:197 +#: pyload/cli/Cli.py:197 msgid "Total" msgstr "總計" -#: module/cli/Cli.py:203 +#: pyload/cli/Cli.py:203 msgid "Menu:" msgstr "表單:" -#: module/cli/Cli.py:205 +#: pyload/cli/Cli.py:205 msgid " Add Links" msgstr "加入連結" -#: module/cli/Cli.py:206 +#: pyload/cli/Cli.py:206 msgid " Manage Queue" msgstr "佇列管理" -#: module/cli/Cli.py:207 +#: pyload/cli/Cli.py:207 msgid " Manage Collector" msgstr "收集器管理" -#: module/cli/Cli.py:208 +#: pyload/cli/Cli.py:208 msgid " (Un)Pause Server" msgstr "暫停/啟動 伺服器" -#: module/cli/Cli.py:209 +#: pyload/cli/Cli.py:209 msgid " Kill Server" msgstr "終止伺服器" -#: module/cli/Cli.py:210 +#: pyload/cli/Cli.py:210 msgid " Quit" msgstr "離開" -#: module/cli/Cli.py:289 module/cli/Cli.py:296 +#: pyload/cli/Cli.py:289 pyload/cli/Cli.py:296 msgid "Please use this syntax: add ..." msgstr "請使用此語法: add 任務名稱> <連結> <連結2> ..." -#: module/cli/Cli.py:315 +#: pyload/cli/Cli.py:315 #, python-format msgid "Checking %d links:" msgstr "檢查 %d 連結:" -#: module/cli/Cli.py:324 +#: pyload/cli/Cli.py:324 msgid "File does not exists." msgstr "檔案不存在。" -#: module/cli/Cli.py:385 +#: pyload/cli/Cli.py:385 msgid "pyLoad was terminated" msgstr "pyLoad 已終止" -#: module/cli/Cli.py:443 +#: pyload/cli/Cli.py:443 msgid "Prints server status" msgstr "顯示伺服器狀態" -#: module/cli/Cli.py:444 +#: pyload/cli/Cli.py:444 msgid "Prints downloads in queue" msgstr "顯示佇列中下載項目" -#: module/cli/Cli.py:445 +#: pyload/cli/Cli.py:445 msgid "Prints downloads in collector" msgstr "顯示收集器中下載項目" -#: module/cli/Cli.py:446 +#: pyload/cli/Cli.py:446 msgid "Adds package to queue" msgstr "新增任務到佇列" -#: module/cli/Cli.py:447 +#: pyload/cli/Cli.py:447 msgid "Adds package to collector" msgstr "新增任務到收集器" -#: module/cli/Cli.py:448 +#: pyload/cli/Cli.py:448 msgid "Delete Files from Queue/Collector" msgstr "從佇列/收集器中刪除檔案" -#: module/cli/Cli.py:449 +#: pyload/cli/Cli.py:449 msgid "Delete Packages from Queue/Collector" msgstr "從佇列/收集器中刪除任務" -#: module/cli/Cli.py:450 +#: pyload/cli/Cli.py:450 msgid "Move Packages from Queue to Collector or vice versa" msgstr "在佇列或收集器中移動任務" -#: module/cli/Cli.py:451 +#: pyload/cli/Cli.py:451 msgid "Restart files" msgstr "重新開始檔案" -#: module/cli/Cli.py:452 +#: pyload/cli/Cli.py:452 msgid "Restart packages" msgstr "重新開始任務" -#: module/cli/Cli.py:453 +#: pyload/cli/Cli.py:453 msgid "Check online status, works with local container" msgstr "查看線上狀態,工作與本機容器" -#: module/cli/Cli.py:454 +#: pyload/cli/Cli.py:454 msgid "Checks online status of a container file" msgstr "檢查容器內檔案上線狀態" -#: module/cli/Cli.py:455 +#: pyload/cli/Cli.py:455 msgid "Pause the server" msgstr "暫停伺服器" -#: module/cli/Cli.py:456 +#: pyload/cli/Cli.py:456 msgid "continue downloads" msgstr "繼續下載" -#: module/cli/Cli.py:457 +#: pyload/cli/Cli.py:457 msgid "Toggle pause/unpause" msgstr "暫停/繼續" -#: module/cli/Cli.py:458 +#: pyload/cli/Cli.py:458 msgid "kill server" msgstr "終止伺服器" -#: module/cli/Cli.py:460 +#: pyload/cli/Cli.py:460 msgid "List of commands:" msgstr "命令清單:" -#: module/cli/Cli.py:473 +#: pyload/cli/Cli.py:473 msgid "Couldn't write user config file" msgstr "不能寫入使用者設定檔" -#: module/cli/Cli.py:548 +#: pyload/cli/Cli.py:548 msgid "You need py-openssl to connect to this pyLoad Core." msgstr "您需要安装py-openssl来连接这个pyLoad核心。" -#: module/cli/Cli.py:555 +#: pyload/cli/Cli.py:555 msgid "Address: " msgstr "位址:" -#: module/cli/Cli.py:556 +#: pyload/cli/Cli.py:556 msgid "Port: " msgstr "連接埠:" -#: module/cli/Cli.py:557 +#: pyload/cli/Cli.py:557 msgid "Username: " msgstr "使用者名稱:" -#: module/cli/Cli.py:561 +#: pyload/cli/Cli.py:561 msgid "Password: " msgstr "密碼:" -#: module/cli/Cli.py:566 module/cli/Cli.py:575 +#: pyload/cli/Cli.py:566 pyload/cli/Cli.py:575 msgid "Login data is wrong." msgstr "登入資訊錯誤。" -#: module/cli/Cli.py:568 module/cli/Cli.py:577 +#: pyload/cli/Cli.py:568 pyload/cli/Cli.py:577 #, python-format msgid "Could not establish connection to %(addr)s:%(port)s." msgstr "無法建立 %(addr)s:%(port)s 連線。" -#: module/cli/Cli.py:580 +#: pyload/cli/Cli.py:580 msgid "You need py-openssl to connect to this pyLoad core." msgstr "您需要 py-openssl 來連接 pyLoad 核心。" -#: module/cli/Cli.py:582 +#: pyload/cli/Cli.py:582 msgid "Interactive mode ignored since you passed some commands." msgstr "執行命令中,忽略互動模式。" -#: module/cli/AddPackage.py:48 +#: pyload/cli/AddPackage.py:48 msgid "Add Package:" msgstr "新增下載任務:" -#: module/cli/AddPackage.py:53 +#: pyload/cli/AddPackage.py:53 msgid "Enter a name for the new package" msgstr "輸入新任務名稱" -#: module/cli/AddPackage.py:57 +#: pyload/cli/AddPackage.py:57 #, python-format msgid "Package: %s" msgstr "任務:%s" -#: module/cli/AddPackage.py:58 +#: pyload/cli/AddPackage.py:58 msgid "Parse the links you want to add." msgstr "分析你想加入的連結。" -#: module/cli/AddPackage.py:59 +#: pyload/cli/AddPackage.py:59 #, python-format msgid "Type %s when done." msgstr "完成後請輸入 %s" -#: module/cli/AddPackage.py:60 +#: pyload/cli/AddPackage.py:60 msgid "Links added: " msgstr "加入的連結:" -#: module/cli/AddPackage.py:64 module/cli/ManageFiles.py:149 +#: pyload/cli/AddPackage.py:64 pyload/cli/ManageFiles.py:149 msgid " back to main menu" msgstr "回到主選單" -#: module/cli/ManageFiles.py:97 +#: pyload/cli/ManageFiles.py:97 msgid "Manage Packages:" msgstr "管理任務" -#: module/cli/ManageFiles.py:99 +#: pyload/cli/ManageFiles.py:99 msgid "Manage Links:" msgstr "管理連結:" -#: module/cli/ManageFiles.py:104 +#: pyload/cli/ManageFiles.py:104 msgid "What do you want to move?" msgstr "你想要移動?" -#: module/cli/ManageFiles.py:106 +#: pyload/cli/ManageFiles.py:106 msgid "What do you want to delete?" msgstr "你想要刪除?" -#: module/cli/ManageFiles.py:108 +#: pyload/cli/ManageFiles.py:108 msgid "What do you want to restart?" msgstr "你想要重啟?" -#: module/cli/ManageFiles.py:113 +#: pyload/cli/ManageFiles.py:113 msgid "Choose what yout want to do or enter package number." msgstr "" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "delete" msgstr "刪除" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "move" msgstr "移動" -#: module/cli/ManageFiles.py:115 +#: pyload/cli/ManageFiles.py:115 msgid "restart" msgstr "重啟" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - previous" msgstr " - 上一頁" -#: module/cli/ManageFiles.py:148 +#: pyload/cli/ManageFiles.py:148 msgid " - next" msgstr "- 下一頁" diff --git a/locale/zh/LC_MESSAGES/setup.po b/locale/zh/LC_MESSAGES/setup.po index 323d06cea..4496c4010 100644 --- a/locale/zh/LC_MESSAGES/setup.po +++ b/locale/zh/LC_MESSAGES/setup.po @@ -12,448 +12,448 @@ msgstr "Project-Id-Version: pyload\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.net\n" -#: module/setup.py:51 +#: pyload/setup.py:51 msgid "y" msgstr "是" -#: module/setup.py:53 +#: pyload/setup.py:53 msgid "n" msgstr "否" -#: module/setup.py:72 +#: pyload/setup.py:72 msgid "Welcome to the pyLoad Configuration Assistent." msgstr "歡迎使用pyLoad設定助手" -#: module/setup.py:73 +#: pyload/setup.py:73 msgid "It will check your system and make a basic setup in order to run pyLoad." msgstr "它將會檢查您的系統並完成基本設定" -#: module/setup.py:75 +#: pyload/setup.py:75 msgid "The value in brackets [] always is the default value," msgstr "中括弧內的值為預設值" -#: module/setup.py:76 +#: pyload/setup.py:76 msgid "in case you don't want to change it or you are unsure what to choose, just hit enter." msgstr "如果您不知道該如何設定或是不需改變,請直接按下Enter" -#: module/setup.py:78 +#: pyload/setup.py:78 msgid "Don't forget: You can always rerun this assistent with --setup or -s parameter, when you start pyload.py ." msgstr "小提醒: 您以後可以透過pyLoadCore -s 或是 pyload.py --setup重新執行設定助手" -#: module/setup.py:79 +#: pyload/setup.py:79 msgid "If you have any problems with this assistent hit STRG-C," msgstr "如果你对本助理有任何疑问,请摁STRG-C," -#: module/setup.py:80 +#: pyload/setup.py:80 msgid "to abort and don't let him start with pyload.py automatically anymore." msgstr "不再讓設定助手與pyLoad同時啟動" -#: module/setup.py:82 +#: pyload/setup.py:82 msgid "When you are ready for system check, hit enter." msgstr "按下確定後開始檢查系統狀態" -#: module/setup.py:89 +#: pyload/setup.py:89 msgid "You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad." msgstr "你需要pycurl,sqlite以及python 2.5,2.6或是2.7来运行pyLoad。" -#: module/setup.py:90 +#: pyload/setup.py:90 msgid "Please correct this and re-run pyLoad." msgstr "请修改后重新运行pyLoad" -#: module/setup.py:91 +#: pyload/setup.py:91 msgid "Setup will now close." msgstr "安装向导关闭。" -#: module/setup.py:95 +#: pyload/setup.py:95 msgid "System check finished, hit enter to see your status report." msgstr "系统检查完毕,恩下回车以查看系统报告。" -#: module/setup.py:97 +#: pyload/setup.py:97 msgid "## Status ##" msgstr "##进程##" -#: module/setup.py:101 +#: pyload/setup.py:101 msgid "container decrypting" msgstr "" -#: module/setup.py:102 +#: pyload/setup.py:102 msgid "ssl connection" msgstr "" -#: module/setup.py:103 +#: pyload/setup.py:103 msgid "automatic captcha decryption" msgstr "" -#: module/setup.py:104 +#: pyload/setup.py:104 msgid "GUI" msgstr "" -#: module/setup.py:105 +#: pyload/setup.py:105 msgid "Webinterface" msgstr "Web界面" -#: module/setup.py:106 +#: pyload/setup.py:106 msgid "extended Click'N'Load" msgstr "" -#: module/setup.py:113 +#: pyload/setup.py:113 msgid "Features available:" msgstr "" -#: module/setup.py:117 +#: pyload/setup.py:117 msgid "Featues missing: " msgstr "" -#: module/setup.py:121 +#: pyload/setup.py:121 msgid "no py-crypto available" msgstr "" -#: module/setup.py:122 +#: pyload/setup.py:122 msgid "You need this if you want to decrypt container files." msgstr "" -#: module/setup.py:126 +#: pyload/setup.py:126 msgid "no SSL available" msgstr "" -#: module/setup.py:127 +#: pyload/setup.py:127 msgid "This is needed if you want to establish a secure connection to core or webinterface." msgstr "" -#: module/setup.py:128 +#: pyload/setup.py:128 msgid "If you only want to access locally to pyLoad ssl is not usefull." msgstr "" -#: module/setup.py:132 +#: pyload/setup.py:132 msgid "no Captcha Recognition available" msgstr "" -#: module/setup.py:133 +#: pyload/setup.py:133 msgid "Only needed for some hosters and as freeuser." msgstr "" -#: module/setup.py:137 +#: pyload/setup.py:137 msgid "Gui not available" msgstr "" -#: module/setup.py:138 +#: pyload/setup.py:138 msgid "The Graphical User Interface." msgstr "" -#: module/setup.py:142 +#: pyload/setup.py:142 msgid "no JavaScript engine found" msgstr "" -#: module/setup.py:143 +#: pyload/setup.py:143 msgid "You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino" msgstr "" -#: module/setup.py:145 +#: pyload/setup.py:145 msgid "You can abort the setup now and fix some dependicies if you want." msgstr "" -#: module/setup.py:147 +#: pyload/setup.py:147 msgid "Continue with setup?" msgstr "是否繼續設定?" -#: module/setup.py:153 +#: pyload/setup.py:153 #, python-format msgid "Do you want to change the config path? Current is %s" msgstr "目前存放設定檔的位置為 %s,是否要修改?" -#: module/setup.py:155 +#: pyload/setup.py:155 msgid "If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it." msgstr "" -#: module/setup.py:156 +#: pyload/setup.py:156 msgid "Change config path?" msgstr "改變設定擋路徑?" -#: module/setup.py:162 +#: pyload/setup.py:162 msgid "Do you want to configure login data and basic settings?" msgstr "是否要進行基本設定?" -#: module/setup.py:163 +#: pyload/setup.py:163 msgid "This is recommend for first run." msgstr "第一次使用pyLoad時建議使用" -#: module/setup.py:164 +#: pyload/setup.py:164 msgid "Make basic setup?" msgstr "開始基礎設定嗎?" -#: module/setup.py:171 +#: pyload/setup.py:171 msgid "Do you want to configure ssl?" msgstr "開始設定SSL嗎?" -#: module/setup.py:172 +#: pyload/setup.py:172 msgid "Configure ssl?" msgstr "設定SSL?" -#: module/setup.py:178 +#: pyload/setup.py:178 msgid "Do you want to configure webinterface?" msgstr "開始設定網頁介面?" -#: module/setup.py:179 +#: pyload/setup.py:179 msgid "Configure webinterface?" msgstr "設定網頁介面?" -#: module/setup.py:184 +#: pyload/setup.py:184 msgid "Setup finished successfully." msgstr "設定完成" -#: module/setup.py:185 +#: pyload/setup.py:185 msgid "Hit enter to exit and restart pyLoad" msgstr "按下Enter離開設定介面並重新啟動pyLoad" -#: module/setup.py:191 +#: pyload/setup.py:191 msgid "## System Check ##" msgstr "" -#: module/setup.py:194 +#: pyload/setup.py:194 msgid "Your python version is to new, Please use Python 2.6/2.7" msgstr "" -#: module/setup.py:197 +#: pyload/setup.py:197 msgid "Your python version is to old, Please use at least Python 2.5" msgstr "" -#: module/setup.py:200 +#: pyload/setup.py:200 msgid "Python Version: OK" msgstr "" -#: module/setup.py:247 +#: pyload/setup.py:247 #, python-format msgid "Your installed jinja2 version %s seems too old." msgstr "" -#: module/setup.py:248 +#: pyload/setup.py:248 msgid "You can safely continue but if the webinterface is not working," msgstr "" -#: module/setup.py:249 +#: pyload/setup.py:249 msgid "please upgrade or deinstall it, pyLoad includes a sufficient jinja2 libary." msgstr "" -#: module/setup.py:264 +#: pyload/setup.py:264 msgid "JS engine" msgstr "" -#: module/setup.py:270 +#: pyload/setup.py:270 msgid "## Basic Setup ##" msgstr "##基本設定##" -#: module/setup.py:273 +#: pyload/setup.py:273 msgid "The following logindata is valid for CLI, GUI and webinterface." msgstr "下列訊息在CLI、GUI及網頁介面皆是有效的" -#: module/setup.py:279 module/setup.py:370 module/setup.py:386 +#: pyload/setup.py:279 pyload/setup.py:370 pyload/setup.py:386 msgid "Username" msgstr "使用者名稱" -#: module/setup.py:285 +#: pyload/setup.py:285 msgid "External clients (GUI, CLI or other) need remote access to work over the network." msgstr "" -#: module/setup.py:286 +#: pyload/setup.py:286 msgid "However, if you only want to use the webinterface you may disable it to save ram." msgstr "" -#: module/setup.py:287 +#: pyload/setup.py:287 msgid "Enable remote access" msgstr "" -#: module/setup.py:291 +#: pyload/setup.py:291 msgid "Language" msgstr "語言" -#: module/setup.py:293 +#: pyload/setup.py:293 msgid "Downloadfolder" msgstr "" -#: module/setup.py:294 +#: pyload/setup.py:294 msgid "Max parallel downloads" msgstr "同時最大下載數量" -#: module/setup.py:298 +#: pyload/setup.py:298 msgid "Use Reconnect?" msgstr "開啟重試機制?" -#: module/setup.py:301 +#: pyload/setup.py:301 msgid "Reconnect script location" msgstr "重試腳本路徑" -#: module/setup.py:306 +#: pyload/setup.py:306 msgid "## Webinterface Setup ##" msgstr "##網頁介面設定##" -#: module/setup.py:309 +#: pyload/setup.py:309 msgid "Activate webinterface?" msgstr "開啟網頁介面?" -#: module/setup.py:311 +#: pyload/setup.py:311 msgid "Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally." msgstr "監聽位址,使用127.0.0.1或localhost,可讓網頁介面只有在本地端可使用" -#: module/setup.py:312 +#: pyload/setup.py:312 msgid "Address" msgstr "IP位址" -#: module/setup.py:313 +#: pyload/setup.py:313 msgid "Port" msgstr "埠" -#: module/setup.py:315 +#: pyload/setup.py:315 msgid "pyLoad offers several server backends, now following a short explanation." msgstr "pyLoad提供了幾種server模式,以下作簡短說明" -#: module/setup.py:316 +#: pyload/setup.py:316 msgid "Default server, best choice if you dont know which one to choose." msgstr "" -#: module/setup.py:317 +#: pyload/setup.py:317 msgid "This server offers SSL and is a good alternative to builtin." msgstr "" -#: module/setup.py:319 +#: pyload/setup.py:319 msgid "Can be used by apache, lighttpd, requires you to configure them, which is not too easy job." msgstr "再適當的設定後可以被apache、lighttpd使用(專業模式)" -#: module/setup.py:320 +#: pyload/setup.py:320 msgid "Very fast alternative written in C, requires libev and linux knowlegde." msgstr "" -#: module/setup.py:321 +#: pyload/setup.py:321 msgid "Get it from here: https://github.com/jonashaag/bjoern, compile it" msgstr "由此下載 (https://github.com/jonashaag/bjoern)並編譯" -#: module/setup.py:322 -msgid "and copy bjoern.so to module/lib" +#: pyload/setup.py:322 +msgid "and copy bjoern.so to pyload/lib" msgstr "" -#: module/setup.py:326 +#: pyload/setup.py:326 msgid "Attention: In some rare cases the builtin server is not working, if you notice problems with the webinterface" msgstr "警告:內建(buildin)伺服器在某些情況會無法運作" -#: module/setup.py:327 +#: pyload/setup.py:327 msgid "come back here and change the builtin server to the threaded one here." msgstr "如果你發現網頁介面有任何問題,請重新執行設定助手並將伺服器模式設定為其餘模式" -#: module/setup.py:329 +#: pyload/setup.py:329 msgid "Server" msgstr "伺服器" -#: module/setup.py:334 +#: pyload/setup.py:334 msgid "## SSL Setup ##" msgstr "##SSL設定##" -#: module/setup.py:336 +#: pyload/setup.py:336 msgid "Execute these commands from pyLoad config folder to make ssl certificates:" msgstr "在pyLoad設定檔目錄中執行下列指令以取得SSL憑證" -#: module/setup.py:342 +#: pyload/setup.py:342 msgid "If you're done and everything went fine, you can activate ssl now." msgstr "如果一切順利現在就可以開啟SSL" -#: module/setup.py:344 +#: pyload/setup.py:344 msgid "Activate SSL?" msgstr "啟用SSL?" -#: module/setup.py:360 +#: pyload/setup.py:360 msgid "Select action" msgstr "選擇動作 " -#: module/setup.py:361 +#: pyload/setup.py:361 msgid "1 - Create/Edit user" msgstr "1. 建立或編輯使用者" -#: module/setup.py:362 +#: pyload/setup.py:362 msgid "2 - List users" msgstr "2. 列出所有使用者" -#: module/setup.py:363 +#: pyload/setup.py:363 msgid "3 - Remove user" msgstr "3. 刪除使用者" -#: module/setup.py:364 +#: pyload/setup.py:364 msgid "4 - Quit" msgstr "4. 離開" -#: module/setup.py:376 +#: pyload/setup.py:376 msgid "Users" msgstr "使用者" -#: module/setup.py:403 +#: pyload/setup.py:403 msgid "Setting new configpath, current configuration will not be transfered!" msgstr "" -#: module/setup.py:404 +#: pyload/setup.py:404 msgid "Configpath" msgstr "" -#: module/setup.py:412 +#: pyload/setup.py:412 msgid "Configpath changed, setup will now close, please restart to go on." msgstr "" -#: module/setup.py:413 +#: pyload/setup.py:413 msgid "Press Enter to exit." msgstr "按下 Enter 離開。" -#: module/setup.py:417 +#: pyload/setup.py:417 #, python-format msgid "Setting config path failed: %s" msgstr "設定檔路徑有誤 %s" -#: module/setup.py:422 +#: pyload/setup.py:422 #, python-format msgid "%s: OK" msgstr "" -#: module/setup.py:424 +#: pyload/setup.py:424 #, python-format msgid "%s: missing" msgstr "" -#: module/setup.py:464 +#: pyload/setup.py:464 msgid "Password: " msgstr "密碼:" -#: module/setup.py:468 +#: pyload/setup.py:468 msgid "Password too short. Use at least 4 symbols." msgstr "密碼至少需要四個字元" -#: module/setup.py:471 +#: pyload/setup.py:471 msgid "Password (again): " msgstr "再輸入一次密碼:" -#: module/setup.py:477 +#: pyload/setup.py:477 msgid "Passwords did not match." msgstr "密码不符" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "yes" msgstr "是" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "true" msgstr "是" -#: module/setup.py:493 +#: pyload/setup.py:493 msgid "t" msgstr "" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "no" msgstr "否" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "false" msgstr "否" -#: module/setup.py:496 +#: pyload/setup.py:496 msgid "f" msgstr "" -#: module/setup.py:499 module/setup.py:509 +#: pyload/setup.py:499 pyload/setup.py:509 msgid "Invalid Input" msgstr "不合法的輸入" diff --git a/module/Api.py b/module/Api.py deleted file mode 100644 index 066d490ec..000000000 --- a/module/Api.py +++ /dev/null @@ -1,1030 +0,0 @@ -# -*- 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 . - - @author: RaNaN -""" - -from base64 import standard_b64encode -from os.path import join -from time import time -import re - -from PyFile import PyFile -from utils import freeSpace, compare_time -from common.packagetools import parseNames -from network.RequestFactory import getURL -from remote import activated - -if activated: - try: - from remote.thriftbackend.thriftgen.pyload.ttypes import * - from remote.thriftbackend.thriftgen.pyload.Pyload import Iface - BaseObject = TBase - except ImportError: - print "Thrift not imported" - from remote.socketbackend.ttypes import * -else: - from remote.socketbackend.ttypes import * - -# contains function names mapped to their permissions -# unlisted functions are for admins only -permMap = {} - -# decorator only called on init, never initialized, so has no effect on runtime -def permission(bits): - class _Dec(object): - def __new__(cls, func, *args, **kwargs): - permMap[func.__name__] = bits - return func - - return _Dec - - -urlmatcher = re.compile(r"((https?|ftps?|xdcc|sftp):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+\-=\\\.&]*)", re.IGNORECASE) - -class PERMS: - ALL = 0 # requires no permission, but login - ADD = 1 # can add packages - DELETE = 2 # can delete packages - STATUS = 4 # see and change server status - LIST = 16 # see queue and collector - MODIFY = 32 # moddify some attribute of downloads - DOWNLOAD = 64 # can download from webinterface - SETTINGS = 128 # can access settings - ACCOUNTS = 256 # can access accounts - LOGS = 512 # can see server logs - -class ROLE: - ADMIN = 0 #admin has all permissions implicit - USER = 1 - -def has_permission(userperms, perms): - # bytewise or perms before if needed - return perms == (userperms & perms) - - -class Api(Iface): - """ - **pyLoads API** - - This is accessible either internal via core.api or via thrift backend. - - see Thrift specification file remote/thriftbackend/pyload.thrift\ - for information about data structures and what methods are usuable with rpc. - - Most methods requires specific permissions, please look at the source code if you need to know.\ - These can be configured via webinterface. - Admin user have all permissions, and are the only ones who can access the methods with no specific permission. - """ - - EXTERNAL = Iface # let the json api know which methods are external - - def __init__(self, core): - self.core = core - - def _convertPyFile(self, p): - f = FileData(p["id"], p["url"], p["name"], p["plugin"], p["size"], - p["format_size"], p["status"], p["statusmsg"], - p["package"], p["error"], p["order"]) - return f - - def _convertConfigFormat(self, c): - sections = {} - for sectionName, sub in c.iteritems(): - section = ConfigSection(sectionName, sub["desc"]) - items = [] - for key, data in sub.iteritems(): - if key in ("desc", "outline"): - continue - item = ConfigItem() - item.name = key - item.description = data["desc"] - item.value = str(data["value"]) if not isinstance(data["value"], basestring) else data["value"] - item.type = data["type"] - items.append(item) - section.items = items - sections[sectionName] = section - if "outline" in sub: - section.outline = sub["outline"] - return sections - - @permission(PERMS.SETTINGS) - def getConfigValue(self, category, option, section="core"): - """Retrieve config value. - - :param category: name of category, or plugin - :param option: config option - :param section: 'plugin' or 'core' - :return: config value as string - """ - if section == "core": - value = self.core.config[category][option] - else: - value = self.core.config.getPlugin(category, option) - - return str(value) if not isinstance(value, basestring) else value - - @permission(PERMS.SETTINGS) - def setConfigValue(self, category, option, value, section="core"): - """Set new config value. - - :param category: - :param option: - :param value: new config value - :param section: 'plugin' or 'core - """ - self.core.hookManager.dispatchEvent("configChanged", category, option, value, section) - - if section == "core": - self.core.config[category][option] = value - - if option in ("limit_speed", "max_speed"): #not so nice to update the limit - self.core.requestFactory.updateBucket() - - elif section == "plugin": - self.core.config.setPlugin(category, option, value) - - @permission(PERMS.SETTINGS) - def getConfig(self): - """Retrieves complete config of core. - - :return: list of `ConfigSection` - """ - return self._convertConfigFormat(self.core.config.config) - - def getConfigDict(self): - """Retrieves complete config in dict format, not for RPC. - - :return: dict - """ - return self.core.config.config - - @permission(PERMS.SETTINGS) - def getPluginConfig(self): - """Retrieves complete config for all plugins. - - :return: list of `ConfigSection` - """ - return self._convertConfigFormat(self.core.config.plugin) - - def getPluginConfigDict(self): - """Plugin config as dict, not for RPC. - - :return: dict - """ - return self.core.config.plugin - - - @permission(PERMS.STATUS) - def pauseServer(self): - """Pause server: Tt wont start any new downloads, but nothing gets aborted.""" - self.core.threadManager.pause = True - - @permission(PERMS.STATUS) - def unpauseServer(self): - """Unpause server: New Downloads will be started.""" - self.core.threadManager.pause = False - - @permission(PERMS.STATUS) - def togglePause(self): - """Toggle pause state. - - :return: new pause state - """ - self.core.threadManager.pause ^= True - return self.core.threadManager.pause - - @permission(PERMS.STATUS) - def toggleReconnect(self): - """Toggle reconnect activation. - - :return: new reconnect state - """ - self.core.config["reconnect"]["activated"] ^= True - return self.core.config["reconnect"]["activated"] - - @permission(PERMS.LIST) - def statusServer(self): - """Some general information about the current status of pyLoad. - - :return: `ServerStatus` - """ - serverStatus = ServerStatus(self.core.threadManager.pause, len(self.core.threadManager.processingIds()), - self.core.files.getQueueCount(), self.core.files.getFileCount(), 0, - not self.core.threadManager.pause and self.isTimeDownload(), - self.core.config['reconnect']['activated'] and self.isTimeReconnect()) - - for pyfile in [x.active for x in self.core.threadManager.threads if x.active and isinstance(x.active, PyFile)]: - serverStatus.speed += pyfile.getSpeed() #bytes/s - - return serverStatus - - @permission(PERMS.STATUS) - def freeSpace(self): - """Available free space at download directory in bytes""" - return freeSpace(self.core.config["general"]["download_folder"]) - - @permission(PERMS.ALL) - def getServerVersion(self): - """pyLoad Core version """ - return self.core.version - - def kill(self): - """Clean way to quit pyLoad""" - self.core.do_kill = True - - def restart(self): - """Restart pyload core""" - self.core.do_restart = True - - @permission(PERMS.LOGS) - def getLog(self, offset=0): - """Returns most recent log entries. - - :param offset: line offset - :return: List of log entries - """ - filename = join(self.core.config['log']['log_folder'], 'log.txt') - try: - fh = open(filename, "r") - lines = fh.readlines() - fh.close() - if offset >= len(lines): - return [] - return lines[offset:] - except: - return ['No log available'] - - @permission(PERMS.STATUS) - def isTimeDownload(self): - """Checks if pyload will start new downloads according to time in config. - - :return: bool - """ - start = self.core.config['downloadTime']['start'].split(":") - end = self.core.config['downloadTime']['end'].split(":") - return compare_time(start, end) - - @permission(PERMS.STATUS) - def isTimeReconnect(self): - """Checks if pyload will try to make a reconnect - - :return: bool - """ - start = self.core.config['reconnect']['startTime'].split(":") - end = self.core.config['reconnect']['endTime'].split(":") - return compare_time(start, end) and self.core.config["reconnect"]["activated"] - - @permission(PERMS.LIST) - def statusDownloads(self): - """ Status off all currently running downloads. - - :return: list of `DownloadStatus` - """ - data = [] - for pyfile in self.core.threadManager.getActiveFiles(): - if not isinstance(pyfile, PyFile): - continue - - data.append(DownloadInfo( - pyfile.id, pyfile.name, pyfile.getSpeed(), pyfile.getETA(), pyfile.formatETA(), - pyfile.getBytesLeft(), pyfile.getSize(), pyfile.formatSize(), pyfile.getPercent(), - pyfile.status, pyfile.getStatusName(), pyfile.formatWait(), - pyfile.waitUntil, pyfile.packageid, pyfile.package().name, pyfile.pluginname)) - - return data - - @permission(PERMS.ADD) - def addPackage(self, name, links, dest=Destination.Queue): - """Adds a package, with links to desired destination. - - :param name: name of the new package - :param links: list of urls - :param dest: `Destination` - :return: package id of the new package - """ - if self.core.config['general']['folder_per_package']: - folder = name - else: - folder = "" - - folder = folder.replace("http://", "").replace(":", "").replace("/", "_").replace("\\", "_") - - pid = self.core.files.addPackage(name, folder, dest) - - self.core.files.addLinks(links, pid) - - self.core.log.info(_("Added package %(name)s containing %(count)d links") % {"name": name, "count": len(links)}) - - self.core.files.save() - - return pid - - @permission(PERMS.ADD) - def parseURLs(self, html=None, url=None): - """Parses html content or any arbitaty text for links and returns result of `checkURLs` - - :param html: html source - :return: - """ - urls = [] - - if html: - urls += [x[0] for x in urlmatcher.findall(html)] - - if url: - page = getURL(url) - urls += [x[0] for x in urlmatcher.findall(page)] - - # remove duplicates - return self.checkURLs(set(urls)) - - - @permission(PERMS.ADD) - def checkURLs(self, urls): - """ Gets urls and returns pluginname mapped to list of matches urls. - - :param urls: - :return: {plugin: urls} - """ - data = self.core.pluginManager.parseUrls(urls) - plugins = {} - - for url, plugin in data: - if plugin in plugins: - plugins[plugin].append(url) - else: - plugins[plugin] = [url] - - return plugins - - @permission(PERMS.ADD) - def checkOnlineStatus(self, urls): - """ initiates online status check - - :param urls: - :return: initial set of data as `OnlineCheck` instance containing the result id - """ - data = self.core.pluginManager.parseUrls(urls) - - rid = self.core.threadManager.createResultThread(data, False) - - tmp = [(url, (url, OnlineStatus(url, pluginname, "unknown", 3, 0))) for url, pluginname in data] - data = parseNames(tmp) - result = {} - - for k, v in data.iteritems(): - for url, status in v: - status.packagename = k - result[url] = status - - return OnlineCheck(rid, result) - - @permission(PERMS.ADD) - def checkOnlineStatusContainer(self, urls, container, data): - """ checks online status of urls and a submited container file - - :param urls: list of urls - :param container: container file name - :param data: file content - :return: online check - """ - th = open(join(self.core.config["general"]["download_folder"], "tmp_" + container), "wb") - th.write(str(data)) - th.close() - - return self.checkOnlineStatus(urls + [th.name]) - - @permission(PERMS.ADD) - def pollResults(self, rid): - """ Polls the result available for ResultID - - :param rid: `ResultID` - :return: `OnlineCheck`, if rid is -1 then no more data available - """ - result = self.core.threadManager.getInfoResult(rid) - - if "ALL_INFO_FETCHED" in result: - del result["ALL_INFO_FETCHED"] - return OnlineCheck(-1, result) - else: - return OnlineCheck(rid, result) - - - @permission(PERMS.ADD) - def generatePackages(self, links): - """ Parses links, generates packages names from urls - - :param links: list of urls - :return: package names mapped to urls - """ - result = parseNames((x, x) for x in links) - return result - - @permission(PERMS.ADD) - def generateAndAddPackages(self, links, dest=Destination.Queue): - """Generates and add packages - - :param links: list of urls - :param dest: `Destination` - :return: list of package ids - """ - return [self.addPackage(name, urls, dest) for name, urls - in self.generatePackages(links).iteritems()] - - @permission(PERMS.ADD) - def checkAndAddPackages(self, links, dest=Destination.Queue): - """Checks online status, retrieves names, and will add packages.\ - Because of this packages are not added immediatly, only for internal use. - - :param links: list of urls - :param dest: `Destination` - :return: None - """ - data = self.core.pluginManager.parseUrls(links) - self.core.threadManager.createResultThread(data, True) - - - @permission(PERMS.LIST) - def getPackageData(self, pid): - """Returns complete information about package, and included files. - - :param pid: package id - :return: `PackageData` with .links attribute - """ - data = self.core.files.getPackageData(int(pid)) - - if not data: - raise PackageDoesNotExists(pid) - - pdata = PackageData(data["id"], data["name"], data["folder"], data["site"], data["password"], - data["queue"], data["order"], - links=[self._convertPyFile(x) for x in data["links"].itervalues()]) - - return pdata - - @permission(PERMS.LIST) - def getPackageInfo(self, pid): - """Returns information about package, without detailed information about containing files - - :param pid: package id - :return: `PackageData` with .fid attribute - """ - data = self.core.files.getPackageData(int(pid)) - - if not data: - raise PackageDoesNotExists(pid) - - pdata = PackageData(data["id"], data["name"], data["folder"], data["site"], data["password"], - data["queue"], data["order"], - fids=[int(x) for x in data["links"]]) - - return pdata - - @permission(PERMS.LIST) - def getFileData(self, fid): - """Get complete information about a specific file. - - :param fid: file id - :return: `FileData` - """ - info = self.core.files.getFileData(int(fid)) - if not info: - raise FileDoesNotExists(fid) - - fdata = self._convertPyFile(info.values()[0]) - return fdata - - @permission(PERMS.DELETE) - def deleteFiles(self, fids): - """Deletes several file entries from pyload. - - :param fids: list of file ids - """ - for id in fids: - self.core.files.deleteLink(int(id)) - - self.core.files.save() - - @permission(PERMS.DELETE) - def deletePackages(self, pids): - """Deletes packages and containing links. - - :param pids: list of package ids - """ - for id in pids: - self.core.files.deletePackage(int(id)) - - self.core.files.save() - - @permission(PERMS.LIST) - def getQueue(self): - """Returns info about queue and packages, **not** about files, see `getQueueData` \ - or `getPackageData` instead. - - :return: list of `PackageInfo` - """ - return [PackageData(pack["id"], pack["name"], pack["folder"], pack["site"], - pack["password"], pack["queue"], pack["order"], - pack["linksdone"], pack["sizedone"], pack["sizetotal"], - pack["linkstotal"]) - for pack in self.core.files.getInfoData(Destination.Queue).itervalues()] - - @permission(PERMS.LIST) - def getQueueData(self): - """Return complete data about everything in queue, this is very expensive use it sparely.\ - See `getQueue` for alternative. - - :return: list of `PackageData` - """ - return [PackageData(pack["id"], pack["name"], pack["folder"], pack["site"], - pack["password"], pack["queue"], pack["order"], - pack["linksdone"], pack["sizedone"], pack["sizetotal"], - links=[self._convertPyFile(x) for x in pack["links"].itervalues()]) - for pack in self.core.files.getCompleteData(Destination.Queue).itervalues()] - - @permission(PERMS.LIST) - def getCollector(self): - """same as `getQueue` for collector. - - :return: list of `PackageInfo` - """ - return [PackageData(pack["id"], pack["name"], pack["folder"], pack["site"], - pack["password"], pack["queue"], pack["order"], - pack["linksdone"], pack["sizedone"], pack["sizetotal"], - pack["linkstotal"]) - for pack in self.core.files.getInfoData(Destination.Collector).itervalues()] - - @permission(PERMS.LIST) - def getCollectorData(self): - """same as `getQueueData` for collector. - - :return: list of `PackageInfo` - """ - return [PackageData(pack["id"], pack["name"], pack["folder"], pack["site"], - pack["password"], pack["queue"], pack["order"], - pack["linksdone"], pack["sizedone"], pack["sizetotal"], - links=[self._convertPyFile(x) for x in pack["links"].itervalues()]) - for pack in self.core.files.getCompleteData(Destination.Collector).itervalues()] - - - @permission(PERMS.ADD) - def addFiles(self, pid, links): - """Adds files to specific package. - - :param pid: package id - :param links: list of urls - """ - self.core.files.addLinks(links, int(pid)) - - self.core.log.info(_("Added %(count)d links to package #%(package)d ") % {"count": len(links), "package": pid}) - self.core.files.save() - - @permission(PERMS.MODIFY) - def pushToQueue(self, pid): - """Moves package from Collector to Queue. - - :param pid: package id - """ - self.core.files.setPackageLocation(pid, Destination.Queue) - - @permission(PERMS.MODIFY) - def pullFromQueue(self, pid): - """Moves package from Queue to Collector. - - :param pid: package id - """ - self.core.files.setPackageLocation(pid, Destination.Collector) - - @permission(PERMS.MODIFY) - def restartPackage(self, pid): - """Restarts a package, resets every containing files. - - :param pid: package id - """ - self.core.files.restartPackage(int(pid)) - - @permission(PERMS.MODIFY) - def restartFile(self, fid): - """Resets file status, so it will be downloaded again. - - :param fid: file id - """ - self.core.files.restartFile(int(fid)) - - @permission(PERMS.MODIFY) - def recheckPackage(self, pid): - """Proofes online status of all files in a package, also a default action when package is added. - - :param pid: - :return: - """ - self.core.files.reCheckPackage(int(pid)) - - @permission(PERMS.MODIFY) - def stopAllDownloads(self): - """Aborts all running downloads.""" - - pyfiles = self.core.files.cache.values() - for pyfile in pyfiles: - pyfile.abortDownload() - - @permission(PERMS.MODIFY) - def stopDownloads(self, fids): - """Aborts specific downloads. - - :param fids: list of file ids - :return: - """ - pyfiles = self.core.files.cache.values() - - for pyfile in pyfiles: - if pyfile.id in fids: - pyfile.abortDownload() - - @permission(PERMS.MODIFY) - def setPackageName(self, pid, name): - """Renames a package. - - :param pid: package id - :param name: new package name - """ - pack = self.core.files.getPackage(pid) - pack.name = name - pack.sync() - - @permission(PERMS.MODIFY) - def movePackage(self, destination, pid): - """Set a new package location. - - :param destination: `Destination` - :param pid: package id - """ - if destination not in (0, 1): return - self.core.files.setPackageLocation(pid, destination) - - @permission(PERMS.MODIFY) - def moveFiles(self, fids, pid): - """Move multiple files to another package - - :param fids: list of file ids - :param pid: destination package - :return: - """ - #TODO: implement - pass - - - @permission(PERMS.ADD) - def uploadContainer(self, filename, data): - """Uploads and adds a container file to pyLoad. - - :param filename: filename, extension is important so it can correctly decrypted - :param data: file content - """ - th = open(join(self.core.config["general"]["download_folder"], "tmp_" + filename), "wb") - th.write(str(data)) - th.close() - - self.addPackage(th.name, [th.name], Destination.Queue) - - @permission(PERMS.MODIFY) - def orderPackage(self, pid, position): - """Gives a package a new position. - - :param pid: package id - :param position: - """ - self.core.files.reorderPackage(pid, position) - - @permission(PERMS.MODIFY) - def orderFile(self, fid, position): - """Gives a new position to a file within its package. - - :param fid: file id - :param position: - """ - self.core.files.reorderFile(fid, position) - - @permission(PERMS.MODIFY) - def setPackageData(self, pid, data): - """Allows to modify several package attributes. - - :param pid: package id - :param data: dict that maps attribute to desired value - """ - p = self.core.files.getPackage(pid) - if not p: raise PackageDoesNotExists(pid) - - for key, value in data.iteritems(): - if key == "id": continue - setattr(p, key, value) - - p.sync() - self.core.files.save() - - @permission(PERMS.DELETE) - def deleteFinished(self): - """Deletes all finished files and completly finished packages. - - :return: list of deleted package ids - """ - return self.core.files.deleteFinishedLinks() - - @permission(PERMS.MODIFY) - def restartFailed(self): - """Restarts all failed failes.""" - self.core.files.restartFailed() - - @permission(PERMS.LIST) - def getPackageOrder(self, destination): - """Returns information about package order. - - :param destination: `Destination` - :return: dict mapping order to package id - """ - - packs = self.core.files.getInfoData(destination) - order = {} - - for pid in packs: - pack = self.core.files.getPackageData(int(pid)) - while pack["order"] in order.keys(): #just in case - pack["order"] += 1 - order[pack["order"]] = pack["id"] - return order - - @permission(PERMS.LIST) - def getFileOrder(self, pid): - """Information about file order within package. - - :param pid: - :return: dict mapping order to file id - """ - rawData = self.core.files.getPackageData(int(pid)) - order = {} - for id, pyfile in rawData["links"].iteritems(): - while pyfile["order"] in order.keys(): #just in case - pyfile["order"] += 1 - order[pyfile["order"]] = pyfile["id"] - return order - - - @permission(PERMS.STATUS) - def isCaptchaWaiting(self): - """Indicates wether a captcha task is available - - :return: bool - """ - self.core.lastClientConnected = time() - task = self.core.captchaManager.getTask() - return not task is None - - @permission(PERMS.STATUS) - def getCaptchaTask(self, exclusive=False): - """Returns a captcha task - - :param exclusive: unused - :return: `CaptchaTask` - """ - self.core.lastClientConnected = time() - task = self.core.captchaManager.getTask() - if task: - task.setWatingForUser(exclusive=exclusive) - data, type, result = task.getCaptcha() - t = CaptchaTask(int(task.id), standard_b64encode(data), type, result) - return t - else: - return CaptchaTask(-1) - - @permission(PERMS.STATUS) - def getCaptchaTaskStatus(self, tid): - """Get information about captcha task - - :param tid: task id - :return: string - """ - self.core.lastClientConnected = time() - t = self.core.captchaManager.getTaskByID(tid) - return t.getStatus() if t else "" - - @permission(PERMS.STATUS) - def setCaptchaResult(self, tid, result): - """Set result for a captcha task - - :param tid: task id - :param result: captcha result - """ - self.core.lastClientConnected = time() - task = self.core.captchaManager.getTaskByID(tid) - if task: - task.setResult(result) - self.core.captchaManager.removeTask(task) - - - @permission(PERMS.STATUS) - def getEvents(self, uuid): - """Lists occured events, may be affected to changes in future. - - :param uuid: - :return: list of `Events` - """ - events = self.core.pullManager.getEvents(uuid) - newEvents = [] - - def convDest(d): - return Destination.Queue if d == "queue" else Destination.Collector - - for e in events: - event = EventInfo() - event.eventname = e[0] - if e[0] in ("update", "remove", "insert"): - event.id = e[3] - event.type = ElementType.Package if e[2] == "pack" else ElementType.File - event.destination = convDest(e[1]) - elif e[0] == "order": - if e[1]: - event.id = e[1] - event.type = ElementType.Package if e[2] == "pack" else ElementType.File - event.destination = convDest(e[3]) - elif e[0] == "reload": - event.destination = convDest(e[1]) - newEvents.append(event) - return newEvents - - @permission(PERMS.ACCOUNTS) - def getAccounts(self, refresh): - """Get information about all entered accounts. - - :param refresh: reload account info - :return: list of `AccountInfo` - """ - accs = self.core.accountManager.getAccountInfos(False, refresh) - accounts = [] - for group in accs.values(): - accounts.extend([AccountInfo(acc["validuntil"], acc["login"], acc["options"], acc["valid"], - acc["trafficleft"], acc["maxtraffic"], acc["premium"], acc["type"]) - for acc in group]) - return accounts - - @permission(PERMS.ALL) - def getAccountTypes(self): - """All available account types. - - :return: list - """ - return self.core.accountManager.accounts.keys() - - @permission(PERMS.ACCOUNTS) - def updateAccount(self, plugin, account, password=None, options={}): - """Changes pw/options for specific account.""" - self.core.accountManager.updateAccount(plugin, account, password, options) - - @permission(PERMS.ACCOUNTS) - def removeAccount(self, plugin, account): - """Remove account from pyload. - - :param plugin: pluginname - :param account: accountname - """ - self.core.accountManager.removeAccount(plugin, account) - - @permission(PERMS.ALL) - def login(self, username, password, remoteip=None): - """Login into pyLoad, this **must** be called when using rpc before any methods can be used. - - :param username: - :param password: - :param remoteip: Omit this argument, its only used internal - :return: bool indicating login was successful - """ - return True if self.checkAuth(username, password, remoteip) else False - - def checkAuth(self, username, password, remoteip=None): - """Check authentication and returns details - - :param username: - :param password: - :param remoteip: - :return: dict with info, empty when login is incorrect - """ - if self.core.config["remote"]["nolocalauth"] and remoteip == "127.0.0.1": - return "local" - else: - return self.core.db.checkAuth(username, password) - - def isAuthorized(self, func, userdata): - """checks if the user is authorized for specific method - - :param func: function name - :param userdata: dictionary of user data - :return: boolean - """ - if userdata == "local" or userdata["role"] == ROLE.ADMIN: - return True - elif func in permMap and has_permission(userdata["permission"], permMap[func]): - return True - else: - return False - - - @permission(PERMS.ALL) - def getUserData(self, username, password): - """similar to `checkAuth` but returns UserData thrift type """ - user = self.checkAuth(username, password) - if user: - return UserData(user["name"], user["email"], user["role"], user["permission"], user["template"]) - else: - return UserData() - - - def getAllUserData(self): - """returns all known user and info""" - res = {} - for user, data in self.core.db.getAllUserData().iteritems(): - res[user] = UserData(user, data["email"], data["role"], data["permission"], data["template"]) - - return res - - @permission(PERMS.STATUS) - def getServices(self): - """ A dict of available services, these can be defined by hook plugins. - - :return: dict with this style: {"plugin": {"method": "description"}} - """ - data = {} - for plugin, funcs in self.core.hookManager.methods.iteritems(): - data[plugin] = funcs - - return data - - @permission(PERMS.STATUS) - def hasService(self, plugin, func): - """Checks wether a service is available. - - :param plugin: - :param func: - :return: bool - """ - cont = self.core.hookManager.methods - return plugin in cont and func in cont[plugin] - - @permission(PERMS.STATUS) - def call(self, info): - """Calls a service (a method in hook plugin). - - :param info: `ServiceCall` - :return: result - :raises: ServiceDoesNotExists, when its not available - :raises: ServiceException, when a exception was raised - """ - plugin = info.plugin - func = info.func - args = info.arguments - parse = info.parseArguments - - if not self.hasService(plugin, func): - raise ServiceDoesNotExists(plugin, func) - - try: - ret = self.core.hookManager.callRPC(plugin, func, args, parse) - return str(ret) - except Exception, e: - raise ServiceException(e.message) - - @permission(PERMS.STATUS) - def getAllInfo(self): - """Returns all information stored by hook plugins. Values are always strings - - :return: {"plugin": {"name": value}} - """ - return self.core.hookManager.getAllInfo() - - @permission(PERMS.STATUS) - def getInfoByPlugin(self, plugin): - """Returns information stored by a specific plugin. - - :param plugin: pluginname - :return: dict of attr names mapped to value {"name": value} - """ - return self.core.hookManager.getInfo(plugin) - - def changePassword(self, user, oldpw, newpw): - """ changes password for specific user """ - return self.core.db.changePassword(user, oldpw, newpw) - - def setUserPermission(self, user, permission, role): - self.core.db.setPermission(user, permission) - self.core.db.setRole(user, role) diff --git a/module/CaptchaManager.py b/module/CaptchaManager.py deleted file mode 100644 index 0ba876ae8..000000000 --- a/module/CaptchaManager.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- 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 . - - @author: mkaay, RaNaN -""" - -from time import time -from traceback import print_exc -from threading import Lock - -class CaptchaManager: - def __init__(self, core): - self.lock = Lock() - self.core = core - self.tasks = [] #task store, for outgoing tasks only - - self.ids = 0 #only for internal purpose - - def newTask(self, img, format, file, result_type): - task = CaptchaTask(self.ids, img, format, file, result_type) - self.ids += 1 - return task - - def removeTask(self, task): - self.lock.acquire() - if task in self.tasks: - self.tasks.remove(task) - self.lock.release() - - def getTask(self): - self.lock.acquire() - for task in self.tasks: - if task.status in ("waiting", "shared-user"): - self.lock.release() - return task - self.lock.release() - return None - - def getTaskByID(self, tid): - self.lock.acquire() - for task in self.tasks: - if task.id == str(tid): #task ids are strings - self.lock.release() - return task - self.lock.release() - return None - - def handleCaptcha(self, task): - cli = self.core.isClientConnected() - - if cli: #client connected -> should solve the captcha - task.setWaiting(50) #wait 50 sec for response - - for plugin in self.core.hookManager.activePlugins(): - try: - plugin.newCaptchaTask(task) - except: - if self.core.debug: - print_exc() - - if task.handler or cli: #the captcha was handled - self.tasks.append(task) - return True - - task.error = _("No Client connected for captcha decrypting") - - return False - - -class CaptchaTask: - def __init__(self, id, img, format, file, result_type='textual'): - self.id = str(id) - self.captchaImg = img - self.captchaFormat = format - self.captchaFile = file - self.captchaResultType = result_type - self.handler = [] #the hook plugins that will take care of the solution - self.result = None - self.waitUntil = None - self.error = None #error message - - self.status = "init" - self.data = {} #handler can store data here - - def getCaptcha(self): - return self.captchaImg, self.captchaFormat, self.captchaResultType - - def setResult(self, text): - if self.isTextual(): - self.result = text - if self.isPositional(): - try: - parts = text.split(',') - self.result = (int(parts[0]), int(parts[1])) - except: - self.result = None - - def getResult(self): - try: - res = self.result.encode("utf8", "replace") - except: - res = self.result - - return res - - def getStatus(self): - return self.status - - def setWaiting(self, sec): - """ let the captcha wait secs for the solution """ - self.waitUntil = max(time() + sec, self.waitUntil) - self.status = "waiting" - - def isWaiting(self): - if self.result or self.error or time() > self.waitUntil: - return False - - return True - - def isTextual(self): - """ returns if text is written on the captcha """ - return self.captchaResultType == 'textual' - - def isPositional(self): - """ returns if user have to click a specific region on the captcha """ - return self.captchaResultType == 'positional' - - def setWatingForUser(self, exclusive): - if exclusive: - self.status = "user" - else: - self.status = "shared-user" - - def timedOut(self): - return time() > self.waitUntil - - def invalid(self): - """ indicates the captcha was not correct """ - [x.captchaInvalid(self) for x in self.handler] - - def correct(self): - [x.captchaCorrect(self) for x in self.handler] - - def __str__(self): - return "" % self.id diff --git a/module/ConfigParser.py b/module/ConfigParser.py deleted file mode 100644 index 9de405a3d..000000000 --- a/module/ConfigParser.py +++ /dev/null @@ -1,373 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement -from time import sleep -from os.path import exists, join -from shutil import copy - -from traceback import print_exc -from utils import chmod - -# ignore these plugin configs, mainly because plugins were wiped out -IGNORE = ( - "FreakshareNet", "SpeedManager", "ArchiveTo", "ShareCx", ('hooks', 'UnRar'), - 'EasyShareCom', 'FlyshareCz' - ) - -CONF_VERSION = 1 - -class ConfigParser: - """ - holds and manage the configuration - - current dict layout: - - { - - section: { - option: { - value: - type: - desc: - } - desc: - - } - - """ - - - def __init__(self): - """Constructor""" - self.config = {} # the config values - self.plugin = {} # the config for plugins - self.oldRemoteData = {} - - self.pluginCB = None # callback when plugin config value is changed - - self.checkVersion() - - self.readConfig() - - self.deleteOldPlugins() - - - def checkVersion(self, n=0): - """determines if config need to be copied""" - try: - if not exists("pyload.conf"): - copy(join(pypath, "module", "config", "default.conf"), "pyload.conf") - - if not exists("plugin.conf"): - f = open("plugin.conf", "wb") - f.write("version: " + str(CONF_VERSION)) - f.close() - - f = open("pyload.conf", "rb") - v = f.readline() - f.close() - v = v[v.find(":") + 1:].strip() - - if not v or int(v) < CONF_VERSION: - copy(join(pypath, "module", "config", "default.conf"), "pyload.conf") - print "Old version of config was replaced" - - f = open("plugin.conf", "rb") - v = f.readline() - f.close() - v = v[v.find(":") + 1:].strip() - - if not v or int(v) < CONF_VERSION: - f = open("plugin.conf", "wb") - f.write("version: " + str(CONF_VERSION)) - f.close() - print "Old version of plugin-config replaced" - except: - if n < 3: - sleep(0.3) - self.checkVersion(n + 1) - else: - raise - - def readConfig(self): - """reads the config file""" - - self.config = self.parseConfig(join(pypath, "module", "config", "default.conf")) - self.plugin = self.parseConfig("plugin.conf") - - try: - homeconf = self.parseConfig("pyload.conf") - if "username" in homeconf["remote"]: - if "password" in homeconf["remote"]: - self.oldRemoteData = {"username": homeconf["remote"]["username"]["value"], - "password": homeconf["remote"]["username"]["value"]} - del homeconf["remote"]["password"] - del homeconf["remote"]["username"] - self.updateValues(homeconf, self.config) - - except Exception, e: - print "Config Warning" - print_exc() - - - def parseConfig(self, config): - """parses a given configfile""" - - f = open(config) - - config = f.read() - - config = config.splitlines()[1:] - - conf = {} - - section, option, value, typ, desc = "", "", "", "", "" - - listmode = False - - for line in config: - comment = line.rfind("#") - if line.find(":", comment) < 0 > line.find("=", comment) and comment > 0 and line[comment - 1].isspace(): - line = line.rpartition("#") # removes comments - if line[1]: - line = line[0] - else: - line = line[2] - - line = line.strip() - - try: - if line == "": - continue - elif line.endswith(":"): - section, none, desc = line[:-1].partition('-') - section = section.strip() - desc = desc.replace('"', "").strip() - conf[section] = {"desc": desc} - else: - if listmode: - if line.endswith("]"): - listmode = False - line = line.replace("]", "") - - value += [self.cast(typ, x.strip()) for x in line.split(",") if x] - - if not listmode: - conf[section][option] = {"desc": desc, - "type": typ, - "value": value} - - - else: - content, none, value = line.partition("=") - - content, none, desc = content.partition(":") - - desc = desc.replace('"', "").strip() - - typ, none, option = content.strip().rpartition(" ") - - value = value.strip() - - if value.startswith("["): - if value.endswith("]"): - listmode = False - value = value[:-1] - else: - listmode = True - - value = [self.cast(typ, x.strip()) for x in value[1:].split(",") if x] - else: - value = self.cast(typ, value) - - if not listmode: - conf[section][option] = {"desc": desc, - "type": typ, - "value": value} - - except Exception, e: - print "Config Warning" - print_exc() - - f.close() - return conf - - - def updateValues(self, config, dest): - """sets the config values from a parsed config file to values in destination""" - - for section in config.iterkeys(): - if section in dest: - for option in config[section].iterkeys(): - if option in ("desc", "outline"): continue - - if option in dest[section]: - dest[section][option]["value"] = config[section][option]["value"] - - #else: - # dest[section][option] = config[section][option] - - - #else: - # dest[section] = config[section] - - def saveConfig(self, config, filename): - """saves config to filename""" - with open(filename, "wb") as f: - chmod(filename, 0600) - f.write("version: %i \n" % CONF_VERSION) - for section in config.iterkeys(): - f.write('\n%s - "%s":\n' % (section, config[section]["desc"])) - - for option, data in config[section].iteritems(): - if option in ("desc", "outline"): continue - - if isinstance(data["value"], list): - value = "[ \n" - for x in data["value"]: - value += "\t\t" + str(x) + ",\n" - value += "\t\t]\n" - else: - if type(data["value"]) in (str, unicode): - value = data["value"] + "\n" - else: - value = str(data["value"]) + "\n" - try: - f.write('\t%s %s : "%s" = %s' % (data["type"], option, data["desc"], value)) - except UnicodeEncodeError: - f.write('\t%s %s : "%s" = %s' % (data["type"], option, data["desc"], value.encode("utf8"))) - - def cast(self, typ, value): - """cast value to given format""" - if type(value) not in (str, unicode): - return value - - elif typ == "int": - return int(value) - elif typ == "bool": - return True if value.lower() in ("1", "true", "on", "an", "yes") else False - elif typ == "time": - if not value: value = "0:00" - if not ":" in value: value += ":00" - return value - elif typ in ("str", "file", "folder"): - try: - return value.encode("utf8") - except: - return value - else: - return value - - - def save(self): - """saves the configs to disk""" - - self.saveConfig(self.config, "pyload.conf") - self.saveConfig(self.plugin, "plugin.conf") - - - def __getitem__(self, section): - """provides dictonary like access: c['section']['option']""" - return Section(self, section) - - - def get(self, section, option): - """get value""" - val = self.config[section][option]["value"] - try: - if type(val) in (str, unicode): - return val.decode("utf8") - else: - return val - except: - return val - - def set(self, section, option, value): - """set value""" - - value = self.cast(self.config[section][option]["type"], value) - - self.config[section][option]["value"] = value - self.save() - - def getPlugin(self, plugin, option): - """gets a value for a plugin""" - val = self.plugin[plugin][option]["value"] - try: - if type(val) in (str, unicode): - return val.decode("utf8") - else: - return val - except: - return val - - def setPlugin(self, plugin, option, value): - """sets a value for a plugin""" - - value = self.cast(self.plugin[plugin][option]["type"], value) - - if self.pluginCB: self.pluginCB(plugin, option, value) - - self.plugin[plugin][option]["value"] = value - self.save() - - def getMetaData(self, section, option): - """ get all config data for an option """ - return self.config[section][option] - - def addPluginConfig(self, name, config, outline=""): - """adds config options with tuples (name, type, desc, default)""" - if name not in self.plugin: - conf = {"desc": name, - "outline": outline} - self.plugin[name] = conf - else: - conf = self.plugin[name] - conf["outline"] = outline - - for item in config: - if item[0] in conf: - conf[item[0]]["type"] = item[1] - conf[item[0]]["desc"] = item[2] - else: - conf[item[0]] = { - "desc": item[2], - "type": item[1], - "value": self.cast(item[1], item[3]) - } - - values = [x[0] for x in config] + ["desc", "outline"] - #delete old values - for item in conf.keys(): - if item not in values: - del conf[item] - - def deleteConfig(self, name): - """Removes a plugin config""" - if name in self.plugin: - del self.plugin[name] - - - def deleteOldPlugins(self): - """ remove old plugins from config """ - - for name in IGNORE: - if name in self.plugin: - del self.plugin[name] - - -class Section: - """provides dictionary like access for configparser""" - - def __init__(self, parser, section): - """Constructor""" - self.parser = parser - self.section = section - - def __getitem__(self, item): - """getitem""" - return self.parser.get(self.section, item) - - def __setitem__(self, item, value): - """setitem""" - self.parser.set(self.section, item, value) diff --git a/module/Core.py b/module/Core.py deleted file mode 100644 index a3156d804..000000000 --- a/module/Core.py +++ /dev/null @@ -1,663 +0,0 @@ -#!/usr/bin/env python -# -*- 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 . - - @author: spoob - @author: sebnapi - @author: RaNaN - @author: mkaay - @version: v0.4.10 -""" -CURRENT_VERSION = '0.4.10' - -import __builtin__ - -from getopt import getopt, GetoptError -import module.common.pylgettext as gettext -from imp import find_module -import logging -import logging.handlers -import os -from os import _exit, execl, getcwd, makedirs, remove, sep, walk, chdir, close -from os.path import exists, join -import signal -import subprocess -import sys -from sys import argv, executable, exit -from time import time, sleep -from traceback import print_exc - -from module import InitHomeDir -from module.plugins.AccountManager import AccountManager -from module.CaptchaManager import CaptchaManager -from module.ConfigParser import ConfigParser -from module.plugins.PluginManager import PluginManager -from module.PullEvents import PullManager -from module.network.RequestFactory import RequestFactory -from module.threads.ServerThread import WebServer -from module.Scheduler import Scheduler -from module.common.JsEngine import JsEngine -from module import remote -from module.remote.RemoteManager import RemoteManager -from module.database import DatabaseBackend, FileHandler - -from module.utils import freeSpace, formatSize, get_console_encoding - -from codecs import getwriter - -enc = get_console_encoding(sys.stdout.encoding) -sys.stdout = getwriter(enc)(sys.stdout, errors="replace") - -# TODO List -# - configurable auth system ldap/mysql -# - cron job like sheduler - -class Core(object): - """pyLoad Core, one tool to rule them all... (the filehosters) :D""" - - def __init__(self): - self.doDebug = False - self.running = False - self.daemon = False - self.remote = True - self.arg_links = [] - self.pidfile = "pyload.pid" - self.deleteLinks = False # will delete links on startup - - if len(argv) > 1: - try: - options, args = getopt(argv[1:], 'vchdusqp:', - ["version", "clear", "clean", "help", "debug", "user", - "setup", "configdir=", "changedir", "daemon", - "quit", "status", "no-remote","pidfile="]) - - for option, argument in options: - if option in ("-v", "--version"): - print "pyLoad", CURRENT_VERSION - exit() - elif option in ("-p", "--pidfile"): - self.pidfile = argument - elif option == "--daemon": - self.daemon = True - elif option in ("-c", "--clear"): - self.deleteLinks = True - elif option in ("-h", "--help"): - self.print_help() - exit() - elif option in ("-d", "--debug"): - self.doDebug = True - elif option in ("-u", "--user"): - from module.setup import Setup - - self.config = ConfigParser() - s = Setup(pypath, self.config) - s.set_user() - exit() - elif option in ("-s", "--setup"): - from module.setup import Setup - - self.config = ConfigParser() - s = Setup(pypath, self.config) - s.start() - exit() - elif option == "--changedir": - from module.setup import Setup - - self.config = ConfigParser() - s = Setup(pypath, self.config) - s.conf_path(True) - exit() - elif option in ("-q", "--quit"): - self.quitInstance() - exit() - elif option == "--status": - pid = self.isAlreadyRunning() - if self.isAlreadyRunning(): - print pid - exit(0) - else: - print "false" - exit(1) - elif option == "--clean": - self.cleanTree() - exit() - elif option == "--no-remote": - self.remote = False - - except GetoptError: - print 'Unknown Argument(s) "%s"' % " ".join(argv[1:]) - self.print_help() - exit() - - def print_help(self): - print - print "pyLoad v%s 2008-2014 the pyLoad Team" % CURRENT_VERSION - print - if sys.argv[0].endswith(".py"): - print "Usage: python pyload.py [options]" - else: - print "Usage: pyload [options]" - print - print "" - print " -v, --version", " " * 10, "Print version to terminal" - print " -c, --clear", " " * 12, "Delete all saved packages/links" - #print " -a, --add=", " " * 2, "Add the specified links" - print " -u, --user", " " * 13, "Manages users" - print " -d, --debug", " " * 12, "Enable debug mode" - print " -s, --setup", " " * 12, "Run Setup Assistant" - print " --configdir=", " " * 6, "Run with as config directory" - print " -p, --pidfile=", " " * 3, "Set pidfile to " - print " --changedir", " " * 12, "Change config dir permanently" - print " --daemon", " " * 15, "Daemonmize after start" - print " --no-remote", " " * 12, "Disable remote access (saves RAM)" - print " --status", " " * 15, "Display pid if running or False" - print " --clean", " " * 16, "Remove .pyc/.pyo files" - print " -q, --quit", " " * 13, "Quit running pyLoad instance" - print " -h, --help", " " * 13, "Display this help screen" - print - - def toggle_pause(self): - if self.threadManager.pause: - self.threadManager.pause = False - return False - elif not self.threadManager.pause: - self.threadManager.pause = True - return True - - def quit(self, a, b): - self.shutdown() - self.log.info(_("Received Quit signal")) - _exit(1) - - def writePidFile(self): - self.deletePidFile() - pid = os.getpid() - f = open(self.pidfile, "wb") - f.write(str(pid)) - f.close() - - def deletePidFile(self): - if self.checkPidFile(): - self.log.debug("Deleting old pidfile %s" % self.pidfile) - os.remove(self.pidfile) - - def checkPidFile(self): - """ return pid as int or 0""" - if os.path.isfile(self.pidfile): - f = open(self.pidfile, "rb") - pid = f.read().strip() - f.close() - if pid: - pid = int(pid) - return pid - - return 0 - - def isAlreadyRunning(self): - pid = self.checkPidFile() - if not pid or os.name == "nt": return False - try: - os.kill(pid, 0) # 0 - default signal (does nothing) - except: - return 0 - - return pid - - def quitInstance(self): - if os.name == "nt": - print "Not supported on windows." - return - - pid = self.isAlreadyRunning() - if not pid: - print "No pyLoad running." - return - - try: - os.kill(pid, 3) #SIGUIT - - t = time() - print "waiting for pyLoad to quit" - - while exists(self.pidfile) and t + 10 > time(): - sleep(0.25) - - if not exists(self.pidfile): - print "pyLoad successfully stopped" - else: - os.kill(pid, 9) #SIGKILL - print "pyLoad did not respond" - print "Kill signal was send to process with id %s" % pid - - except: - print "Error quitting pyLoad" - - - def cleanTree(self): - for path, dirs, files in walk(self.path("")): - for f in files: - if not f.endswith(".pyo") and not f.endswith(".pyc"): - continue - - if "_25" in f or "_26" in f or "_27" in f: - continue - - print join(path, f) - remove(join(path, f)) - - def start(self, rpc=True, web=True): - """ starts the fun :D """ - - self.version = CURRENT_VERSION - - if not exists("pyload.conf"): - from module.setup import Setup - - print "This is your first start, running configuration assistent now." - self.config = ConfigParser() - s = Setup(pypath, self.config) - res = False - try: - res = s.start() - except SystemExit: - pass - except KeyboardInterrupt: - print "\nSetup interrupted" - except: - res = False - print_exc() - print "Setup failed" - if not res: - remove("pyload.conf") - - exit() - - try: signal.signal(signal.SIGQUIT, self.quit) - except: pass - - self.config = ConfigParser() - - gettext.setpaths([join(os.sep, "usr", "share", "pyload", "locale"), None]) - translation = gettext.translation("pyLoad", self.path("locale"), - languages=[self.config['general']['language'], "en"], fallback=True) - translation.install(True) - - self.debug = self.doDebug or self.config['general']['debug_mode'] - self.remote &= self.config['remote']['activated'] - - pid = self.isAlreadyRunning() - if pid: - print _("pyLoad already running with pid %s") % pid - exit() - - if os.name != "nt" and self.config["general"]["renice"]: - os.system("renice %d %d" % (self.config["general"]["renice"], os.getpid())) - - if self.config["permission"]["change_group"]: - if os.name != "nt": - try: - from grp import getgrnam - - group = getgrnam(self.config["permission"]["group"]) - os.setgid(group[2]) - except Exception, e: - print _("Failed changing group: %s") % e - - if self.config["permission"]["change_user"]: - if os.name != "nt": - try: - from pwd import getpwnam - - user = getpwnam(self.config["permission"]["user"]) - os.setuid(user[2]) - except Exception, e: - print _("Failed changing user: %s") % e - - self.check_file(self.config['log']['log_folder'], _("folder for logs"), True) - - if self.debug: - self.init_logger(logging.DEBUG) # logging level - else: - self.init_logger(logging.INFO) # logging level - - self.do_kill = False - self.do_restart = False - self.shuttedDown = False - - self.log.info(_("Starting") + " pyLoad %s" % CURRENT_VERSION) - self.log.info(_("Using home directory: %s") % getcwd()) - - self.writePidFile() - - #@TODO refractor - - remote.activated = self.remote - self.log.debug("Remote activated: %s" % self.remote) - - self.check_install("Crypto", _("pycrypto to decode container files")) - #img = self.check_install("Image", _("Python Image Library (PIL) for captcha reading")) - #self.check_install("pycurl", _("pycurl to download any files"), True, True) - self.check_file("tmp", _("folder for temporary files"), True) - #tesser = self.check_install("tesseract", _("tesseract for captcha reading"), False) if os.name != "nt" else True - - self.captcha = True # checks seems to fail, although tesseract is available - - self.check_file(self.config['general']['download_folder'], _("folder for downloads"), True) - - if self.config['ssl']['activated']: - self.check_install("OpenSSL", _("OpenSSL for secure connection")) - - self.setupDB() - if self.config.oldRemoteData: - self.log.info(_("Moving old user config to DB")) - self.db.addUser(self.config.oldRemoteData["username"], self.config.oldRemoteData["password"]) - - self.log.info(_("Please check your logindata with ./pyload.py -u")) - - if self.deleteLinks: - self.log.info(_("All links removed")) - self.db.purgeLinks() - - self.requestFactory = RequestFactory(self) - __builtin__.pyreq = self.requestFactory - - self.lastClientConnected = 0 - - # later imported because they would trigger api import, and remote value not set correctly - from module import Api - from module.HookManager import HookManager - from module.ThreadManager import ThreadManager - - if Api.activated != self.remote: - self.log.warning("Import error: API remote status not correct.") - - self.api = Api.Api(self) - - self.scheduler = Scheduler(self) - - #hell yeah, so many important managers :D - self.pluginManager = PluginManager(self) - self.pullManager = PullManager(self) - self.accountManager = AccountManager(self) - self.threadManager = ThreadManager(self) - self.captchaManager = CaptchaManager(self) - self.hookManager = HookManager(self) - self.remoteManager = RemoteManager(self) - - self.js = JsEngine() - - self.log.info(_("Downloadtime: %s") % self.api.isTimeDownload()) - - if rpc: - self.remoteManager.startBackends() - - if web: - self.init_webserver() - - spaceLeft = freeSpace(self.config["general"]["download_folder"]) - - self.log.info(_("Free space: %s") % formatSize(spaceLeft)) - - self.config.save() #save so config files gets filled - - link_file = join(pypath, "links.txt") - - if exists(link_file): - f = open(link_file, "rb") - if f.read().strip(): - self.api.addPackage("links.txt", [link_file], 1) - f.close() - - link_file = "links.txt" - if exists(link_file): - f = open(link_file, "rb") - if f.read().strip(): - self.api.addPackage("links.txt", [link_file], 1) - f.close() - - #self.scheduler.addJob(0, self.accountManager.getAccountInfos) - self.log.info(_("Activating Accounts...")) - self.accountManager.getAccountInfos() - - self.threadManager.pause = False - self.running = True - - self.log.info(_("Activating Plugins...")) - self.hookManager.coreReady() - - self.log.info(_("pyLoad is up and running")) - - #test api -# from module.common.APIExerciser import startApiExerciser -# startApiExerciser(self, 3) - - #some memory stats -# from guppy import hpy -# hp=hpy() -# import objgraph -# objgraph.show_most_common_types(limit=20) -# import memdebug -# memdebug.start(8002) - - locals().clear() - - while True: - sleep(2) - if self.do_restart: - self.log.info(_("restarting pyLoad")) - self.restart() - if self.do_kill: - self.shutdown() - self.log.info(_("pyLoad quits")) - self.removeLogger() - _exit(0) #@TODO thrift blocks shutdown - - self.threadManager.work() - self.scheduler.work() - - def setupDB(self): - self.db = DatabaseBackend(self) # the backend - self.db.setup() - - self.files = FileHandler(self) - self.db.manager = self.files #ugly? - - def init_webserver(self): - if self.config['webinterface']['activated']: - self.webserver = WebServer(self) - self.webserver.start() - - def init_logger(self, level): - console = logging.StreamHandler(sys.stdout) - 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 - - if self.config['log']['file_log']: - if self.config['log']['log_rotate']: - file_handler = logging.handlers.RotatingFileHandler(join(self.config['log']['log_folder'], 'log.txt'), - maxBytes=self.config['log']['log_size'] * 1024, - backupCount=int(self.config['log']['log_count']), - encoding="utf8") - else: - file_handler = logging.FileHandler(join(self.config['log']['log_folder'], 'log.txt'), encoding="utf8") - - file_handler.setFormatter(frm) - self.log.addHandler(file_handler) - - self.log.addHandler(console) #if console logging - self.log.setLevel(level) - - def removeLogger(self): - for h in list(self.log.handlers): - self.log.removeHandler(h) - h.close() - - def check_install(self, check_name, legend, python=True, essential=False): - """check wether needed tools are installed""" - try: - if python: - find_module(check_name) - else: - pipe = subprocess.PIPE - subprocess.Popen(check_name, stdout=pipe, stderr=pipe) - - return True - except: - if essential: - self.log.info(_("Install %s") % legend) - exit() - - return False - - def check_file(self, check_names, description="", folder=False, empty=True, essential=False, quiet=False): - """check wether needed files exists""" - tmp_names = [] - if not type(check_names) == list: - tmp_names.append(check_names) - else: - tmp_names.extend(check_names) - file_created = True - file_exists = True - for tmp_name in tmp_names: - if not exists(tmp_name): - file_exists = False - if empty: - try: - if folder: - tmp_name = tmp_name.replace("/", sep) - makedirs(tmp_name) - else: - open(tmp_name, "w") - except: - file_created = False - else: - file_created = False - - if not file_exists and not quiet: - if file_created: - #self.log.info( _("%s created") % description ) - pass - else: - if not empty: - self.log.warning( - _("could not find %(desc)s: %(name)s") % {"desc": description, "name": tmp_name}) - else: - print _("could not create %(desc)s: %(name)s") % {"desc": description, "name": tmp_name} - if essential: - exit() - - def isClientConnected(self): - return (self.lastClientConnected + 30) > time() - - def restart(self): - self.shutdown() - chdir(owd) - # close some open fds - for i in range(3, 50): - try: - close(i) - except : - pass - - execl(executable, executable, *sys.argv) - _exit(0) - - def shutdown(self): - self.log.info(_("shutting down...")) - try: - if self.config['webinterface']['activated'] and hasattr(self, "webserver"): - self.webserver.quit() - - for thread in self.threadManager.threads: - thread.put("quit") - pyfiles = self.files.cache.values() - - for pyfile in pyfiles: - pyfile.abortDownload() - - self.hookManager.coreExiting() - - except: - if self.debug: - print_exc() - self.log.info(_("error while shutting down")) - - finally: - self.files.syncSave() - self.shuttedDown = True - - self.deletePidFile() - - - def path(self, *args): - return join(pypath, *args) - - -def deamon(): - try: - pid = os.fork() - if pid > 0: - sys.exit(0) - except OSError, e: - print >> sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) - sys.exit(1) - - # decouple from parent environment - os.setsid() - os.umask(0) - - # do second fork - try: - pid = os.fork() - if pid > 0: - # exit from second parent, print eventual PID before - print "Daemon PID %d" % pid - sys.exit(0) - except OSError, e: - print >> sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) - sys.exit(1) - - # Iterate through and close some file descriptors. - for fd in range(0, 3): - try: - os.close(fd) - except OSError: # ERROR, fd wasn't open to begin with (ignored) - pass - - os.open(os.devnull, os.O_RDWR) # standard input (0) - os.dup2(0, 1) # standard output (1) - os.dup2(0, 2) - - pyload_core = Core() - pyload_core.start() - - -def main(): - if "--daemon" in sys.argv: - deamon() - else: - pyload_core = Core() - try: - pyload_core.start() - except KeyboardInterrupt: - pyload_core.shutdown() - pyload_core.log.info(_("killed pyLoad from Terminal")) - pyload_core.removeLogger() - _exit(1) - -# And so it begins... -if __name__ == "__main__": - main() diff --git a/module/HookManager.py b/module/HookManager.py deleted file mode 100644 index 6fd1162a7..000000000 --- a/module/HookManager.py +++ /dev/null @@ -1,305 +0,0 @@ -# -*- 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 . - - @author: RaNaN, mkaay - @interface-version: 0.1 -""" -import __builtin__ - -import traceback -from thread import start_new_thread -from threading import RLock - -from types import MethodType - -from module.threads.PluginThread import HookThread -from module.plugins.PluginManager import literal_eval -from utils import lock - -class HookManager: - """Manages hooks, delegates and handles Events. - - Every plugin can define events, \ - but some very usefull events are called by the Core. - Contrary to overwriting hook methods you can use event listener, - which provides additional entry point in the control flow. - Only do very short tasks or use threads. - - **Known Events:** - Most hook methods exists as events. These are the additional known events. - - ===================== ============== ================================== - Name Arguments Description - ===================== ============== ================================== - downloadPreparing fid A download was just queued and will be prepared now. - downloadStarts fid A plugin will immediately starts the download afterwards. - linksAdded links, pid Someone just added links, you are able to modify the links. - allDownloadsProcessed Every link was handled, pyload would idle afterwards. - allDownloadsFinished Every download in queue is finished. - unrarFinished folder, fname An Unrar job finished - configChanged The config was changed via the api. - pluginConfigChanged The plugin config changed, due to api or internal process. - ===================== ============== ================================== - - | Notes: - | allDownloadsProcessed is *always* called before allDownloadsFinished. - | configChanged is *always* called before pluginConfigChanged. - - - """ - - def __init__(self, core): - self.core = core - self.config = self.core.config - - __builtin__.hookManager = self #needed to let hooks register themself - - self.log = self.core.log - self.plugins = [] - self.pluginMap = {} - self.methods = {} #dict of names and list of methods usable by rpc - - self.events = {} # contains events - - #registering callback for config event - self.config.pluginCB = MethodType(self.dispatchEvent, "pluginConfigChanged", basestring) - - self.addEvent("pluginConfigChanged", self.manageHooks) - - self.lock = RLock() - self.createIndex() - - def try_catch(func): - def new(*args): - try: - return func(*args) - except Exception, e: - args[0].log.error(_("Error executing hooks: %s") % str(e)) - if args[0].core.debug: - traceback.print_exc() - - return new - - - def addRPC(self, plugin, func, doc): - plugin = plugin.rpartition(".")[2] - doc = doc.strip() if doc else "" - - if plugin in self.methods: - self.methods[plugin][func] = doc - else: - self.methods[plugin] = {func: doc} - - def callRPC(self, plugin, func, args, parse): - if not args: args = tuple() - if parse: - args = tuple([literal_eval(x) for x in args]) - - plugin = self.pluginMap[plugin] - f = getattr(plugin, func) - return f(*args) - - - def createIndex(self): - plugins = [] - - active = [] - deactive = [] - - for pluginname in self.core.pluginManager.hookPlugins: - try: - #hookClass = getattr(plugin, plugin.__name__) - - if self.config.getPlugin(pluginname, "activated"): - pluginClass = self.core.pluginManager.loadClass("hooks", pluginname) - if not pluginClass: continue - - plugin = pluginClass(self.core, self) - plugins.append(plugin) - self.pluginMap[pluginClass.__name__] = plugin - if plugin.isActivated(): - active.append(pluginClass.__name__) - else: - deactive.append(pluginname) - - - except: - self.log.warning(_("Failed activating %(name)s") % {"name": pluginname}) - if self.core.debug: - traceback.print_exc() - - self.log.info(_("Activated plugins: %s") % ", ".join(sorted(active))) - self.log.info(_("Deactivate plugins: %s") % ", ".join(sorted(deactive))) - - self.plugins = plugins - - def manageHooks(self, plugin, name, value): - if name == "activated" and value: - self.activateHook(plugin) - elif name == "activated" and not value: - self.deactivateHook(plugin) - - def activateHook(self, plugin): - - #check if already loaded - for inst in self.plugins: - if inst.__name__ == plugin: - return - - pluginClass = self.core.pluginManager.loadClass("hooks", plugin) - - if not pluginClass: return - - self.log.debug("Plugin loaded: %s" % plugin) - - plugin = pluginClass(self.core, self) - self.plugins.append(plugin) - self.pluginMap[pluginClass.__name__] = plugin - - # call core Ready - start_new_thread(plugin.coreReady, tuple()) - - def deactivateHook(self, plugin): - - hook = None - for inst in self.plugins: - if inst.__name__ == plugin: - hook = inst - - if not hook: return - - self.log.debug("Plugin unloaded: %s" % plugin) - - hook.unload() - - #remove periodic call - self.log.debug("Removed callback %s" % self.core.scheduler.removeJob(hook.cb)) - self.plugins.remove(hook) - del self.pluginMap[hook.__name__] - - - @try_catch - def coreReady(self): - for plugin in self.plugins: - if plugin.isActivated(): - plugin.coreReady() - - self.dispatchEvent("coreReady") - - @try_catch - def coreExiting(self): - for plugin in self.plugins: - if plugin.isActivated(): - plugin.coreExiting() - - self.dispatchEvent("coreExiting") - - @lock - def downloadPreparing(self, pyfile): - for plugin in self.plugins: - if plugin.isActivated(): - plugin.downloadPreparing(pyfile) - - self.dispatchEvent("downloadPreparing", pyfile) - - @lock - def downloadFinished(self, pyfile): - for plugin in self.plugins: - if plugin.isActivated(): - plugin.downloadFinished(pyfile) - - self.dispatchEvent("downloadFinished", pyfile) - - @lock - @try_catch - def downloadFailed(self, pyfile): - for plugin in self.plugins: - if plugin.isActivated(): - plugin.downloadFailed(pyfile) - - self.dispatchEvent("downloadFailed", pyfile) - - @lock - def packageFinished(self, package): - for plugin in self.plugins: - if plugin.isActivated(): - plugin.packageFinished(package) - - self.dispatchEvent("packageFinished", package) - - @lock - def beforeReconnecting(self, ip): - for plugin in self.plugins: - plugin.beforeReconnecting(ip) - - self.dispatchEvent("beforeReconnecting", ip) - - @lock - def afterReconnecting(self, ip): - for plugin in self.plugins: - if plugin.isActivated(): - plugin.afterReconnecting(ip) - - self.dispatchEvent("afterReconnecting", ip) - - def startThread(self, function, *args, **kwargs): - t = HookThread(self.core.threadManager, function, args, kwargs) - - def activePlugins(self): - """ returns all active plugins """ - return [x for x in self.plugins if x.isActivated()] - - def getAllInfo(self): - """returns info stored by hook plugins""" - info = {} - for name, plugin in self.pluginMap.iteritems(): - if plugin.info: - #copy and convert so str - info[name] = dict([(x, str(y) if not isinstance(y, basestring) else y) for x, y in plugin.info.iteritems()]) - return info - - - def getInfo(self, plugin): - info = {} - if plugin in self.pluginMap and self.pluginMap[plugin].info: - info = dict([(x, str(y) if not isinstance(y, basestring) else y) - for x, y in self.pluginMap[plugin].info.iteritems()]) - - return info - - def addEvent(self, event, func): - """Adds an event listener for event name""" - if event in self.events: - self.events[event].append(func) - else: - self.events[event] = [func] - - def removeEvent(self, event, func): - """removes previously added event listener""" - if event in self.events: - self.events[event].remove(func) - - def dispatchEvent(self, event, *args): - """dispatches event with args""" - if event in self.events: - for f in self.events[event]: - try: - f(*args) - except Exception, e: - self.log.warning("Error calling event handler %s: %s, %s, %s" - % (event, f, args, str(e))) - if self.core.debug: - traceback.print_exc() diff --git a/module/InitHomeDir.py b/module/InitHomeDir.py deleted file mode 100644 index b8ea29180..000000000 --- a/module/InitHomeDir.py +++ /dev/null @@ -1,79 +0,0 @@ -# -*- 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 . - - @author: RaNaN - - This modules inits working directories and global variables, pydir and homedir -""" - -from os import makedirs, path, chdir -from os.path import join -import sys -from sys import argv, platform - -import __builtin__ - -__builtin__.owd = path.abspath("") # original working directory -__builtin__.pypath = path.abspath(path.join(__file__, "..", "..")) - -sys.path.append(join(pypath, "module", "lib")) - -homedir = "" - -if platform == 'nt': - homedir = path.expanduser("~") - if homedir == "~": - import ctypes - - CSIDL_APPDATA = 26 - _SHGetFolderPath = ctypes.windll.shell32.SHGetFolderPathW - _SHGetFolderPath.argtypes = [ctypes.wintypes.HWND, - ctypes.c_int, - ctypes.wintypes.HANDLE, - ctypes.wintypes.DWORD, ctypes.wintypes.LPCWSTR] - - path_buf = ctypes.wintypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) - result = _SHGetFolderPath(0, CSIDL_APPDATA, 0, 0, path_buf) - homedir = path_buf.value -else: - homedir = path.expanduser("~") - -__builtin__.homedir = homedir - -args = " ".join(argv[1:]) - -# dirty method to set configdir from commandline arguments -if "--configdir=" in args: - for aa in argv: - if aa.startswith("--configdir="): - configdir = aa.replace("--configdir=", "", 1).strip() -elif path.exists(path.join(pypath, "module", "config", "configdir")): - f = open(path.join(pypath, "module", "config", "configdir"), "rb") - c = f.read().strip() - f.close() - configdir = path.join(pypath, c) -else: - if platform in ("posix", "linux2"): - configdir = path.join(homedir, ".pyload") - else: - configdir = path.join(homedir, "pyload") - -if not path.exists(configdir): - makedirs(configdir, 0700) - -__builtin__.configdir = configdir -chdir(configdir) - -#print "Using %s as working directory." % configdir diff --git a/module/PullEvents.py b/module/PullEvents.py deleted file mode 100644 index 3835a34ac..000000000 --- a/module/PullEvents.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- 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 . - - @author: mkaay -""" - -from time import time -from module.utils import uniqify - -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("collector").toList()] - return uniqify(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" - 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" - 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" - 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" - self.destination = destination - - 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/PyFile.py b/module/PyFile.py deleted file mode 100644 index 69ccc4baf..000000000 --- a/module/PyFile.py +++ /dev/null @@ -1,284 +0,0 @@ -""" - 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 . - - @author: RaNaN - @author: mkaay -""" - -from module.PullEvents import UpdateEvent -from module.utils import formatSize, lock - -from time import sleep, time - -from threading import RLock - -statusMap = { - "finished": 0, - "offline": 1, - "online": 2, - "queued": 3, - "skipped": 4, - "waiting": 5, - "temp. offline": 6, - "starting": 7, - "failed": 8, - "aborted": 9, - "decrypting": 10, - "custom": 11, - "downloading": 12, - "processing": 13, - "unknown": 14, -} - - -def setSize(self, value): - self._size = int(value) - -class PyFile(object): - """ - Represents a file object at runtime - """ - __slots__ = ("m", "id", "url", "name", "size", "_size", "status", "pluginname", "packageid", - "error", "order", "lock", "plugin", "waitUntil", "active", "abort", "statusname", - "reconnected", "progress", "maxprogress", "pluginmodule", "pluginclass") - - def __init__(self, manager, id, url, name, size, status, error, pluginname, package, order): - self.m = manager - - self.id = int(id) - self.url = url - self.name = name - self.size = size - self.status = status - self.pluginname = pluginname - self.packageid = package #should not be used, use package() instead - self.error = error - self.order = order - # database information ends here - - self.lock = RLock() - - self.plugin = None - #self.download = None - - self.waitUntil = 0 # time() + time to wait - - # status attributes - self.active = False #obsolete? - self.abort = False - self.reconnected = False - - self.statusname = None - - self.progress = 0 - self.maxprogress = 100 - - self.m.cache[int(id)] = self - - - # will convert all sizes to ints - size = property(lambda self: self._size, setSize) - - def __repr__(self): - return "PyFile %s: %s@%s" % (self.id, self.name, self.pluginname) - - @lock - def initPlugin(self): - """ inits plugin instance """ - if not self.plugin: - self.pluginmodule = self.m.core.pluginManager.getPlugin(self.pluginname) - self.pluginclass = getattr(self.pluginmodule, self.m.core.pluginManager.getPluginName(self.pluginname)) - self.plugin = self.pluginclass(self) - - @lock - def hasPlugin(self): - """Thread safe way to determine this file has initialized plugin attribute - - :return: - """ - return hasattr(self, "plugin") and self.plugin - - def package(self): - """ return package instance""" - return self.m.getPackage(self.packageid) - - def setStatus(self, status): - self.status = statusMap[status] - self.sync() #@TODO needed aslong no better job approving exists - - def setCustomStatus(self, msg, status="processing"): - self.statusname = msg - self.setStatus(status) - - def getStatusName(self): - if self.status not in (13, 14) or not self.statusname: - return self.m.statusMsg[self.status] - else: - return self.statusname - - def hasStatus(self, status): - return statusMap[status] == self.status - - def sync(self): - """sync PyFile instance with database""" - self.m.updateLink(self) - - @lock - def release(self): - """sync and remove from cache""" - # file has valid package - if self.packageid > 0: - self.sync() - - if hasattr(self, "plugin") and self.plugin: - self.plugin.clean() - del self.plugin - - self.m.releaseLink(self.id) - - def delete(self): - """delete pyfile from database""" - self.m.deleteLink(self.id) - - def toDict(self): - """return dict with all information for interface""" - return self.toDbDict() - - def toDbDict(self): - """return data as dict for databse - - format: - - { - id: {'url': url, 'name': name ... } - } - - """ - return { - self.id: { - 'id': self.id, - 'url': self.url, - 'name': self.name, - 'plugin': self.pluginname, - 'size': self.getSize(), - 'format_size': self.formatSize(), - 'status': self.status, - 'statusmsg': self.getStatusName(), - 'package': self.packageid, - 'error': self.error, - 'order': self.order - } - } - - def abortDownload(self): - """abort pyfile if possible""" - while self.id in self.m.core.threadManager.processingIds(): - self.abort = True - if self.plugin and self.plugin.req: - self.plugin.req.abortDownloads() - sleep(0.1) - - self.abort = False - if self.hasPlugin() and self.plugin.req: - self.plugin.req.abortDownloads() - - self.release() - - def finishIfDone(self): - """set status to finish and release file if every thread is finished with it""" - - if self.id in self.m.core.threadManager.processingIds(): - return False - - self.setStatus("finished") - self.release() - self.m.checkAllLinksFinished() - return True - - def checkIfProcessed(self): - self.m.checkAllLinksProcessed(self.id) - - def formatWait(self): - """ formats and return wait time in humanreadable format """ - seconds = self.waitUntil - time() - - if seconds < 0: return "00:00:00" - - hours, seconds = divmod(seconds, 3600) - minutes, seconds = divmod(seconds, 60) - return "%.2i:%.2i:%.2i" % (hours, minutes, seconds) - - def formatSize(self): - """ formats size to readable format """ - return formatSize(self.getSize()) - - def formatETA(self): - """ formats eta to readable format """ - seconds = self.getETA() - - if seconds < 0: return "00:00:00" - - hours, seconds = divmod(seconds, 3600) - minutes, seconds = divmod(seconds, 60) - return "%.2i:%.2i:%.2i" % (hours, minutes, seconds) - - def getSpeed(self): - """ calculates speed """ - try: - return self.plugin.req.speed - except: - return 0 - - def getETA(self): - """ gets established time of arrival""" - try: - return self.getBytesLeft() / self.getSpeed() - except: - return 0 - - def getBytesLeft(self): - """ gets bytes left """ - try: - return self.getSize() - self.plugin.req.arrived - except: - return 0 - - def getPercent(self): - """ get % of download """ - if self.status == 12: - try: - return self.plugin.req.percent - except: - return 0 - else: - return self.progress - - def getSize(self): - """ get size of download """ - try: - if self.plugin.req.size: - return self.plugin.req.size - else: - return self.size - except: - return self.size - - def notifyChange(self): - e = UpdateEvent("file", self.id, "collector" if not self.package().queue else "queue") - self.m.core.pullManager.addEvent(e) - - def setProgress(self, value): - if not value == self.progress: - self.progress = value - self.notifyChange() diff --git a/module/PyPackage.py b/module/PyPackage.py deleted file mode 100644 index 7e6962d43..000000000 --- a/module/PyPackage.py +++ /dev/null @@ -1,79 +0,0 @@ -""" - 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 . - - @author: RaNaN - @author: mkaay -""" - -from module.PullEvents import UpdateEvent -from module.utils import safe_filename - -class PyPackage: - """ - Represents a package object at runtime - """ - def __init__(self, manager, id, name, folder, site, password, queue, order): - self.m = manager - self.m.packageCache[int(id)] = self - - self.id = int(id) - self.name = name - self._folder = folder - self.site = site - self.password = password - self.queue = queue - self.order = order - self.setFinished = False - - @property - def folder(self): - return safe_filename(self._folder) - - def toDict(self): - """ Returns a dictionary representation of the data. - - :return: dict: {id: { attr: value }} - """ - return { - self.id: { - 'id': self.id, - 'name': self.name, - 'folder': self.folder, - 'site': self.site, - 'password': self.password, - 'queue': self.queue, - 'order': self.order, - 'links': {} - } - } - - def getChildren(self): - """get information about contained links""" - return self.m.getPackageData(self.id)["links"] - - def sync(self): - """sync with db""" - self.m.updatePackage(self) - - def release(self): - """sync and delete from cache""" - self.sync() - self.m.releasePackage(self.id) - - def delete(self): - self.m.deletePackage(self.id) - - def notifyChange(self): - e = UpdateEvent("pack", self.id, "collector" if not self.queue else "queue") - self.m.core.pullManager.addEvent(e) diff --git a/module/Scheduler.py b/module/Scheduler.py deleted file mode 100644 index 71b5f96af..000000000 --- a/module/Scheduler.py +++ /dev/null @@ -1,141 +0,0 @@ -# -*- 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 . - - @author: mkaay -""" - -from time import time -from heapq import heappop, heappush -from thread import start_new_thread -from threading import Lock - -class AlreadyCalled(Exception): - pass - - -class Deferred: - def __init__(self): - self.call = [] - self.result = () - - def addCallback(self, f, *cargs, **ckwargs): - self.call.append((f, cargs, ckwargs)) - - def callback(self, *args, **kwargs): - if self.result: - raise AlreadyCalled - self.result = (args, kwargs) - for f, cargs, ckwargs in self.call: - args += tuple(cargs) - kwargs.update(ckwargs) - f(*args ** kwargs) - - -class Scheduler: - def __init__(self, core): - self.core = core - - self.queue = PriorityQueue() - - def addJob(self, t, call, args=[], kwargs={}, threaded=True): - d = Deferred() - t += time() - j = Job(t, call, args, kwargs, d, threaded) - self.queue.put((t, j)) - return d - - - def removeJob(self, d): - """ - :param d: defered object - :return: if job was deleted - """ - index = -1 - - for i, j in enumerate(self.queue): - if j[1].deferred == d: - index = i - - if index >= 0: - del self.queue[index] - return True - - return False - - def work(self): - while True: - t, j = self.queue.get() - if not j: - break - else: - if t <= time(): - j.start() - else: - self.queue.put((t, j)) - break - - -class Job: - def __init__(self, time, call, args=[], kwargs={}, deferred=None, threaded=True): - self.time = float(time) - self.call = call - self.args = args - self.kwargs = kwargs - self.deferred = deferred - self.threaded = threaded - - def run(self): - ret = self.call(*self.args, **self.kwargs) - if self.deferred is None: - return - else: - self.deferred.callback(ret) - - def start(self): - if self.threaded: - start_new_thread(self.run, ()) - else: - self.run() - - -class PriorityQueue: - """ a non blocking priority queue """ - - def __init__(self): - self.queue = [] - self.lock = Lock() - - def __iter__(self): - return iter(self.queue) - - def __delitem__(self, key): - del self.queue[key] - - def put(self, element): - self.lock.acquire() - heappush(self.queue, element) - self.lock.release() - - def get(self): - """ return element or None """ - self.lock.acquire() - try: - el = heappop(self.queue) - return el - except IndexError: - return None, None - finally: - self.lock.release() diff --git a/module/ThreadManager.py b/module/ThreadManager.py deleted file mode 100644 index bdc6ca6e2..000000000 --- a/module/ThreadManager.py +++ /dev/null @@ -1,317 +0,0 @@ -# -*- 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 . - - @author: RaNaN -""" - -from os.path import exists, join -import re -from subprocess import Popen -from threading import Event, Lock -from time import sleep, time -from traceback import print_exc -from random import choice - -import pycurl - -from module.threads import PluginThread -from module.PyFile import PyFile -from module.network.RequestFactory import getURL -from module.utils import freeSpace, lock - - -class ThreadManager: - """manages the download threads, assign jobs, reconnect etc""" - - - def __init__(self, core): - """Constructor""" - self.core = core - self.log = core.log - - self.threads = [] # thread list - self.localThreads = [] #hook+decrypter threads - - self.pause = True - - self.reconnecting = Event() - self.reconnecting.clear() - self.downloaded = 0 #number of files downloaded since last cleanup - - self.lock = Lock() - - # some operations require to fetch url info from hoster, so we caching them so it wont be done twice - # contains a timestamp and will be purged after timeout - self.infoCache = {} - - # pool of ids for online check - self.resultIDs = 0 - - # threads which are fetching hoster results - self.infoResults = {} - #timeout for cache purge - self.timestamp = 0 - - pycurl.global_init(pycurl.GLOBAL_DEFAULT) - - for i in range(0, self.core.config.get("download", "max_downloads")): - self.createThread() - - - def createThread(self): - """create a download thread""" - - thread = PluginThread.DownloadThread(self) - self.threads.append(thread) - - def createInfoThread(self, data, pid): - """ - start a thread whichs fetches online status and other infos - data = [ .. () .. ] - """ - self.timestamp = time() + 5 * 60 - - PluginThread.InfoThread(self, data, pid) - - @lock - def createResultThread(self, data, add=False): - """ creates a thread to fetch online status, returns result id """ - self.timestamp = time() + 5 * 60 - - rid = self.resultIDs - self.resultIDs += 1 - - PluginThread.InfoThread(self, data, rid=rid, add=add) - - return rid - - - @lock - def getInfoResult(self, rid): - """returns result and clears it""" - self.timestamp = time() + 5 * 60 - - if rid in self.infoResults: - data = self.infoResults[rid] - self.infoResults[rid] = {} - return data - else: - return {} - - @lock - def setInfoResults(self, rid, result): - self.infoResults[rid].update(result) - - def getActiveFiles(self): - active = [x.active for x in self.threads if x.active and isinstance(x.active, PyFile)] - - for t in self.localThreads: - active.extend(t.getActiveFiles()) - - return active - - def processingIds(self): - """get a id list of all pyfiles processed""" - return [x.id for x in self.getActiveFiles()] - - - def work(self): - """run all task which have to be done (this is for repetivive call by core)""" - try: - self.tryReconnect() - except Exception, e: - self.log.error(_("Reconnect Failed: %s") % str(e) ) - self.reconnecting.clear() - if self.core.debug: - print_exc() - self.checkThreadCount() - - try: - self.assignJob() - except Exception, e: - self.log.warning("Assign job error", e) - if self.core.debug: - print_exc() - - sleep(0.5) - self.assignJob() - #it may be failed non critical so we try it again - - if (self.infoCache or self.infoResults) and self.timestamp < time(): - self.infoCache.clear() - self.infoResults.clear() - self.log.debug("Cleared Result cache") - - #-------------------------------------------------------------------------- - def tryReconnect(self): - """checks if reconnect needed""" - - if not (self.core.config["reconnect"]["activated"] and self.core.api.isTimeReconnect()): - return False - - active = [x.active.plugin.wantReconnect and x.active.plugin.waiting for x in self.threads if x.active] - - if not (0 < active.count(True) == len(active)): - return False - - if not exists(self.core.config['reconnect']['method']): - if exists(join(pypath, self.core.config['reconnect']['method'])): - self.core.config['reconnect']['method'] = join(pypath, self.core.config['reconnect']['method']) - else: - self.core.config["reconnect"]["activated"] = False - self.log.warning(_("Reconnect script not found!")) - return - - self.reconnecting.set() - - #Do reconnect - self.log.info(_("Starting reconnect")) - - while [x.active.plugin.waiting for x in self.threads if x.active].count(True) != 0: - sleep(0.25) - - ip = self.getIP() - - self.core.hookManager.beforeReconnecting(ip) - - self.log.debug("Old IP: %s" % ip) - - try: - reconn = Popen(self.core.config['reconnect']['method'], bufsize=-1, shell=True)#, stdout=subprocess.PIPE) - except: - self.log.warning(_("Failed executing reconnect script!")) - self.core.config["reconnect"]["activated"] = False - self.reconnecting.clear() - if self.core.debug: - print_exc() - return - - reconn.wait() - sleep(1) - ip = self.getIP() - self.core.hookManager.afterReconnecting(ip) - - self.log.info(_("Reconnected, new IP: %s") % ip) - - self.reconnecting.clear() - - def getIP(self): - """retrieve current ip""" - services = [("http://automation.whatismyip.com/n09230945.asp", "(\S+)"), - ("http://checkip.dyndns.org/",".*Current IP Address: (\S+).*")] - - ip = "" - for i in range(10): - try: - sv = choice(services) - ip = getURL(sv[0]) - ip = re.match(sv[1], ip).group(1) - break - except: - ip = "" - sleep(1) - - return ip - - #-------------------------------------------------------------------------- - def checkThreadCount(self): - """checks if there are need for increasing or reducing thread count""" - - if len(self.threads) == self.core.config.get("download", "max_downloads"): - return True - elif len(self.threads) < self.core.config.get("download", "max_downloads"): - self.createThread() - else: - free = [x for x in self.threads if not x.active] - if free: - free[0].put("quit") - - - def cleanPycurl(self): - """ make a global curl cleanup (currently ununused) """ - if self.processingIds(): - return False - pycurl.global_cleanup() - pycurl.global_init(pycurl.GLOBAL_DEFAULT) - self.downloaded = 0 - self.log.debug("Cleaned up pycurl") - return True - - #-------------------------------------------------------------------------- - def assignJob(self): - """assing a job to a thread if possible""" - - if self.pause or not self.core.api.isTimeDownload(): return - - #if self.downloaded > 20: - # if not self.cleanPyCurl(): return - - free = [x for x in self.threads if not x.active] - - inuse = set([(x.active.pluginname, self.getLimit(x)) for x in self.threads if x.active and x.active.hasPlugin() and x.active.plugin.account]) - inuse = map(lambda x: (x[0], x[1], len([y for y in self.threads if y.active and y.active.pluginname == x[0]])) ,inuse) - onlimit = [x[0] for x in inuse if x[1] > 0 and x[2] >= x[1]] - - occ = [x.active.pluginname for x in self.threads if x.active and x.active.hasPlugin() and not x.active.plugin.multiDL] + onlimit - - occ.sort() - occ = tuple(set(occ)) - job = self.core.files.getJob(occ) - if job: - try: - job.initPlugin() - except Exception, e: - self.log.critical(str(e)) - print_exc() - job.setStatus("failed") - job.error = str(e) - job.release() - return - - if job.plugin.__type__ == "hoster": - spaceLeft = freeSpace(self.core.config["general"]["download_folder"]) / 1024 / 1024 - if spaceLeft < self.core.config["general"]["min_free_space"]: - self.log.warning(_("Not enough space left on device")) - self.pause = True - - if free and not self.pause: - thread = free[0] - #self.downloaded += 1 - - thread.put(job) - else: - #put job back - if occ not in self.core.files.jobCache: - self.core.files.jobCache[occ] = [] - self.core.files.jobCache[occ].append(job.id) - - #check for decrypt jobs - job = self.core.files.getDecryptJob() - if job: - job.initPlugin() - thread = PluginThread.DecrypterThread(self, job) - - - else: - thread = PluginThread.DecrypterThread(self, job) - - def getLimit(self, thread): - limit = thread.active.plugin.account.getAccountData(thread.active.plugin.user)["options"].get("limitDL", ["0"])[0] - return int(limit) - - def cleanup(self): - """do global cleanup, should be called when finished with pycurl""" - pycurl.global_cleanup() diff --git a/module/__init__.py b/module/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/module/cli/AddPackage.py b/module/cli/AddPackage.py deleted file mode 100644 index 16b32b9ee..000000000 --- a/module/cli/AddPackage.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -# -#Copyright (C) 2011-2014 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 . -# -### - -from Handler import Handler -from printer import * - -class AddPackage(Handler): - """ let the user add packages """ - - def init(self): - self.name = "" - self.urls = [] - - def onEnter(self, inp): - if inp == "0": - self.cli.reset() - - if not self.name: - self.name = inp - self.setInput() - elif inp == "END": - #add package - self.client.addPackage(self.name, self.urls, 1) - self.cli.reset() - else: - if inp.strip(): - self.urls.append(inp) - self.setInput() - - def renderBody(self, line): - println(line, white(_("Add Package:"))) - println(line + 1, "") - line += 2 - - if not self.name: - println(line, _("Enter a name for the new package")) - println(line + 1, "") - line += 2 - else: - println(line, _("Package: %s") % self.name) - println(line + 1, _("Parse the links you want to add.")) - println(line + 2, _("Type %s when done.") % mag("END")) - println(line + 3, _("Links added: ") + mag(len(self.urls))) - line += 4 - - println(line, "") - println(line + 1, mag("0.") + _(" back to main menu")) - - return line + 2 diff --git a/module/cli/Cli.py b/module/cli/Cli.py deleted file mode 100644 index 929cf9881..000000000 --- a/module/cli/Cli.py +++ /dev/null @@ -1,585 +0,0 @@ -# -*- coding: utf-8 -*- -# -#Copyright (C) 2008-2014 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 . -# -### -from __future__ import with_statement -from getopt import GetoptError, getopt - -import module.common.pylgettext as gettext -import os -from os import _exit -from os.path import join, exists, abspath, basename -import sys -from sys import exit -from threading import Thread, Lock -from time import sleep -from traceback import print_exc - -import ConfigParser - -from codecs import getwriter - -if os.name == "nt": - enc = "cp850" -else: - enc = "utf8" - -sys.stdout = getwriter(enc)(sys.stdout, errors="replace") - -from module import InitHomeDir -from module.cli.printer import * -from module.cli import AddPackage, ManageFiles - -from module.Api import Destination -from module.utils import formatSize, decode -from module.remote.thriftbackend.ThriftClient import ThriftClient, NoConnection, NoSSL, WrongLogin, ConnectionClosed -from module.lib.Getch import Getch -from module.lib.rename_process import renameProcess - -class Cli: - def __init__(self, client, command): - self.client = client - self.command = command - - if not self.command: - renameProcess('pyload-cli') - self.getch = Getch() - self.input = "" - self.inputline = 0 - self.lastLowestLine = 0 - self.menuline = 0 - - self.lock = Lock() - - #processor funcions, these will be changed dynamically depending on control flow - self.headerHandler = self #the download status - self.bodyHandler = self #the menu section - self.inputHandler = self - - os.system("clear") - println(1, blue("py") + yellow("Load") + white(_(" Command Line Interface"))) - println(2, "") - - self.thread = RefreshThread(self) - self.thread.start() - - self.start() - else: - self.processCommand() - - def reset(self): - """ reset to initial main menu """ - self.input = "" - self.headerHandler = self.bodyHandler = self.inputHandler = self - - def start(self): - """ main loop. handle input """ - while True: - #inp = raw_input() - inp = self.getch.impl() - if ord(inp) == 3: - os.system("clear") - sys.exit() # ctrl + c - elif ord(inp) == 13: #enter - try: - self.lock.acquire() - self.inputHandler.onEnter(self.input) - - except Exception, e: - println(2, red(e)) - finally: - self.lock.release() - - elif ord(inp) == 127: - self.input = self.input[:-1] #backspace - try: - self.lock.acquire() - self.inputHandler.onBackSpace() - finally: - self.lock.release() - - elif ord(inp) == 27: #ugly symbol - pass - else: - self.input += inp - try: - self.lock.acquire() - self.inputHandler.onChar(inp) - finally: - self.lock.release() - - self.inputline = self.bodyHandler.renderBody(self.menuline) - self.renderFooter(self.inputline) - - - def refresh(self): - """refresh screen""" - - println(1, blue("py") + yellow("Load") + white(_(" Command Line Interface"))) - println(2, "") - - self.lock.acquire() - - self.menuline = self.headerHandler.renderHeader(3) + 1 - println(self.menuline - 1, "") - self.inputline = self.bodyHandler.renderBody(self.menuline) - self.renderFooter(self.inputline) - - self.lock.release() - - - def setInput(self, string=""): - self.input = string - - def setHandler(self, klass): - #create new handler with reference to cli - self.bodyHandler = self.inputHandler = klass(self) - self.input = "" - - def renderHeader(self, line): - """ prints download status """ - #print updated information - # print "\033[J" #clear screen - # self.println(1, blue("py") + yellow("Load") + white(_(" Command Line Interface"))) - # self.println(2, "") - # self.println(3, white(_("%s Downloads:") % (len(data)))) - - data = self.client.statusDownloads() - speed = 0 - - println(line, white(_("%s Downloads:") % (len(data)))) - line += 1 - - for download in data: - if download.status == 12: # downloading - percent = download.percent - z = percent / 4 - speed += download.speed - println(line, cyan(download.name)) - line += 1 - println(line, - blue("[") + yellow(z * "#" + (25 - z) * " ") + blue("] ") + green(str(percent) + "%") + _( - " Speed: ") + green(formatSize(download.speed) + "/s") + _(" Size: ") + green( - download.format_size) + _(" Finished in: ") + green(download.format_eta) + _( - " ID: ") + green(download.fid)) - line += 1 - if download.status == 5: - println(line, cyan(download.name)) - line += 1 - println(line, _("waiting: ") + green(download.format_wait)) - line += 1 - - println(line, "") - line += 1 - status = self.client.statusServer() - if status.pause: - paused = _("Status:") + " " + red(_("paused")) - else: - paused = _("Status:") + " " + red(_("running")) - - println(line,"%s %s: %s %s: %s %s: %s" % ( - paused, _("total Speed"), red(formatSize(speed) + "/s"), _("Files in queue"), red( - status.queue), _("Total"), red(status.total))) - - return line + 1 - - def renderBody(self, line): - """ prints initial menu """ - println(line, white(_("Menu:"))) - println(line + 1, "") - println(line + 2, mag("1.") + _(" Add Links")) - println(line + 3, mag("2.") + _(" Manage Queue")) - println(line + 4, mag("3.") + _(" Manage Collector")) - println(line + 5, mag("4.") + _(" (Un)Pause Server")) - println(line + 6, mag("5.") + _(" Kill Server")) - println(line + 7, mag("6.") + _(" Quit")) - - return line + 8 - - def renderFooter(self, line): - """ prints out the input line with input """ - println(line, "") - line += 1 - - println(line, white(" Input: ") + decode(self.input)) - - #clear old output - if line < self.lastLowestLine: - for i in range(line + 1, self.lastLowestLine + 1): - println(i, "") - - self.lastLowestLine = line - - #set cursor to position - print "\033[" + str(self.inputline) + ";0H" - - def onChar(self, char): - """ default no special handling for single chars """ - if char == "1": - self.setHandler(AddPackage) - elif char == "2": - self.setHandler(ManageFiles) - elif char == "3": - self.setHandler(ManageFiles) - self.bodyHandler.target = Destination.Collector - elif char == "4": - self.client.togglePause() - self.setInput() - elif char == "5": - self.client.kill() - self.client.close() - sys.exit() - elif char == "6": - os.system('clear') - sys.exit() - - def onEnter(self, inp): - pass - - def onBackSpace(self): - pass - - def processCommand(self): - command = self.command[0] - args = [] - if len(self.command) > 1: - args = self.command[1:] - - if command == "status": - files = self.client.statusDownloads() - - if not files: - print "No downloads running." - - for download in files: - if download.status == 12: # downloading - print print_status(download) - print "\tDownloading: %s @ %s/s\t %s (%s%%)" % ( - download.format_eta, formatSize(download.speed), formatSize(download.size - download.bleft), - download.percent) - elif download.status == 5: - print print_status(download) - print "\tWaiting: %s" % download.format_wait - else: - print print_status(download) - - elif command == "queue": - print_packages(self.client.getQueueData()) - - elif command == "collector": - print_packages(self.client.getCollectorData()) - - elif command == "add": - if len(args) < 2: - print _("Please use this syntax: add ...") - return - - self.client.addPackage(args[0], args[1:], Destination.Queue) - - elif command == "add_coll": - if len(args) < 2: - print _("Please use this syntax: add ...") - return - - self.client.addPackage(args[0], args[1:], Destination.Collector) - - elif command == "del_file": - self.client.deleteFiles([int(x) for x in args]) - print "Files deleted." - - elif command == "del_package": - self.client.deletePackages([int(x) for x in args]) - print "Packages deleted." - - elif command == "move": - for pid in args: - pack = self.client.getPackageInfo(int(pid)) - self.client.movePackage((pack.dest + 1) % 2, pack.pid) - - elif command == "check": - print _("Checking %d links:") % len(args) - print - rid = self.client.checkOnlineStatus(args).rid - self.printOnlineCheck(self.client, rid) - - - elif command == "check_container": - path = args[0] - if not exists(join(owd, path)): - print _("File does not exists.") - return - - f = open(join(owd, path), "rb") - content = f.read() - f.close() - - rid = self.client.checkOnlineStatusContainer([], basename(f.name), content).rid - self.printOnlineCheck(self.client, rid) - - - elif command == "pause": - self.client.pause() - - elif command == "unpause": - self.client.unpause() - - elif command == "toggle": - self.client.togglePause() - - elif command == "kill": - self.client.kill() - elif command == "restart_file": - for x in args: - self.client.restartFile(int(x)) - print "Files restarted." - elif command == "restart_package": - for pid in args: - self.client.restartPackage(int(pid)) - print "Packages restarted." - - else: - print_commands() - - def printOnlineCheck(self, client, rid): - while True: - sleep(1) - result = client.pollResults(rid) - for url, status in result.data.iteritems(): - if status.status == 2: check = "Online" - elif status.status == 1: check = "Offline" - else: check = "Unknown" - - print "%-45s %-12s\t %-15s\t %s" % (status.name, formatSize(status.size), status.plugin, check) - - if result.rid == -1: break - - -class RefreshThread(Thread): - def __init__(self, cli): - Thread.__init__(self) - self.setDaemon(True) - self.cli = cli - - def run(self): - while True: - sleep(1) - try: - self.cli.refresh() - except ConnectionClosed: - os.system("clear") - print _("pyLoad was terminated") - _exit(0) - except Exception, e: - println(2, red(str(e))) - self.cli.reset() - print_exc() - - -def print_help(config): - print - print "pyLoad CLI Copyright (c) 2008-2014 the pyLoad Team" - print - print "Usage: [python] pyload-cli.py [options] [command]" - print - print "" - print "See pyload-cli.py -c for a complete listing." - print - print "" - print " -i, --interactive", " Start in interactive mode" - print - print " -u, --username=", " " * 2, "Specify Username" - print " --pw=", " " * 2, "Password" - print " -a, --address=", " " * 3, "Specify address (current=%s)" % config["addr"] - print " -p, --port", " " * 7, "Specify port (current=%s)" % config["port"] - print - print " -l, --language", " " * 3, "Set user interface language (current=%s)" % config["language"] - print " -h, --help", " " * 7, "Display this help screen" - print " -c, --commands", " " * 3, "List all available commands" - print - - -def print_packages(data): - for pack in data: - print "Package %s (#%s):" % (pack.name, pack.pid) - for download in pack.links: - print "\t" + print_file(download) - print - - -def print_file(download): - return "#%(id)-6d %(name)-30s %(statusmsg)-10s %(plugin)-8s" % { - "id": download.fid, - "name": download.name, - "statusmsg": download.statusmsg, - "plugin": download.plugin - } - - -def print_status(download): - return "#%(id)-6s %(name)-40s Status: %(statusmsg)-10s Size: %(size)s" % { - "id": download.fid, - "name": download.name, - "statusmsg": download.statusmsg, - "size": download.format_size - } - - -def print_commands(): - commands = [("status", _("Prints server status")), - ("queue", _("Prints downloads in queue")), - ("collector", _("Prints downloads in collector")), - ("add ...", _("Adds package to queue")), - ("add_coll ...", _("Adds package to collector")), - ("del_file ...", _("Delete Files from Queue/Collector")), - ("del_package ...", _("Delete Packages from Queue/Collector")), - ("move ...", _("Move Packages from Queue to Collector or vice versa")), - ("restart_file ...", _("Restart files")), - ("restart_package ...", _("Restart packages")), - ("check ...", _("Check online status, works with local container")), - ("check_container path", _("Checks online status of a container file")), - ("pause", _("Pause the server")), - ("unpause", _("continue downloads")), - ("toggle", _("Toggle pause/unpause")), - ("kill", _("kill server")), ] - - print _("List of commands:") - print - for c in commands: - print "%-35s %s" % c - - -def writeConfig(opts): - try: - with open(join(homedir, ".pyload-cli"), "w") as cfgfile: - cfgfile.write("[cli]") - for opt in opts: - cfgfile.write("%s=%s\n" % (opt, opts[opt])) - except: - print _("Couldn't write user config file") - - -def main(): - config = {"addr": "127.0.0.1", "port": "7227", "language": "en"} - try: - config["language"] = os.environ["LANG"][0:2] - except: - pass - - if (not exists(join(pypath, "locale", config["language"]))) or config["language"] == "": - config["language"] = "en" - - configFile = ConfigParser.ConfigParser() - configFile.read(join(homedir, ".pyload-cli")) - - if configFile.has_section("cli"): - for opt in configFile.items("cli"): - config[opt[0]] = opt[1] - - gettext.setpaths([join(os.sep, "usr", "share", "pyload", "locale"), None]) - translation = gettext.translation("Cli", join(pypath, "locale"), - languages=[config["language"], "en"], fallback=True) - translation.install(unicode=True) - - interactive = False - command = None - username = "" - password = "" - - shortOptions = 'iu:p:a:hcl:' - longOptions = ['interactive', "username=", "pw=", "address=", "port=", "help", "commands", "language="] - - try: - opts, extraparams = getopt(sys.argv[1:], shortOptions, longOptions) - for option, params in opts: - if option in ("-i", "--interactive"): - interactive = True - elif option in ("-u", "--username"): - username = params - elif option in ("-a", "--address"): - config["addr"] = params - elif option in ("-p", "--port"): - config["port"] = params - elif option in ("-l", "--language"): - config["language"] = params - gettext.setpaths([join(os.sep, "usr", "share", "pyload", "locale"), None]) - translation = gettext.translation("Cli", join(pypath, "locale"), - languages=[config["language"], "en"], fallback=True) - translation.install(unicode=True) - elif option in ("-h", "--help"): - print_help(config) - exit() - elif option in ("--pw"): - password = params - elif option in ("-c", "--comands"): - print_commands() - exit() - - except GetoptError: - print 'Unknown Argument(s) "%s"' % " ".join(sys.argv[1:]) - print_help(config) - exit() - - if len(extraparams) >= 1: - command = extraparams - - client = False - - if interactive: - try: - client = ThriftClient(config["addr"], int(config["port"]), username, password) - except WrongLogin: - pass - except NoSSL: - print _("You need py-openssl to connect to this pyLoad Core.") - exit() - except NoConnection: - config["addr"] = False - config["port"] = False - - if not client: - if not config["addr"]: config["addr"] = raw_input(_("Address: ")) - if not config["port"]: config["port"] = raw_input(_("Port: ")) - if not username: username = raw_input(_("Username: ")) - if not password: - from getpass import getpass - - password = getpass(_("Password: ")) - - try: - client = ThriftClient(config["addr"], int(config["port"]), username, password) - except WrongLogin: - print _("Login data is wrong.") - except NoConnection: - print _("Could not establish connection to %(addr)s:%(port)s." % {"addr": config["addr"], - "port": config["port"]}) - - else: - try: - client = ThriftClient(config["addr"], int(config["port"]), username, password) - except WrongLogin: - print _("Login data is wrong.") - except NoConnection: - print _("Could not establish connection to %(addr)s:%(port)s." % {"addr": config["addr"], - "port": config["port"]}) - except NoSSL: - print _("You need py-openssl to connect to this pyLoad core.") - - if interactive and command: print _("Interactive mode ignored since you passed some commands.") - - if client: - writeConfig(config) - cli = Cli(client, command) diff --git a/module/cli/Handler.py b/module/cli/Handler.py deleted file mode 100644 index 37b0d7b99..000000000 --- a/module/cli/Handler.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# -#Copyright (C) 2011-2014 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 . -# -### -class Handler: - def __init__(self, cli): - self.cli = cli - self.init() - - client = property(lambda self: self.cli.client) - input = property(lambda self: self.cli.input) - - def init(self): - pass - - def onChar(self, char): - pass - - def onBackSpace(self): - pass - - def onEnter(self, inp): - pass - - def setInput(self, inp=""): - self.cli.setInput(inp) - - def backspace(self): - self.cli.setInput(self.input[:-1]) - - def renderBody(self, line): - """ gets the line where to render output and should return the line number below its content """ - return line + 1 diff --git a/module/cli/ManageFiles.py b/module/cli/ManageFiles.py deleted file mode 100644 index 8f202c59d..000000000 --- a/module/cli/ManageFiles.py +++ /dev/null @@ -1,203 +0,0 @@ -# -*- coding: utf-8 -*- -# -#Copyright (C) 2011-2014 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 . -# -### - -from itertools import islice -from time import time - -from Handler import Handler -from printer import * - -from module.Api import Destination, PackageData - -class ManageFiles(Handler): - """ possibility to manage queue/collector """ - - def init(self): - self.target = Destination.Queue - self.pos = 0 #position in queue - self.package = -1 #choosen package - self.mode = "" # move/delete/restart - - self.cache = None - self.links = None - self.time = 0 - - def onChar(self, char): - if char in ("m", "d", "r"): - self.mode = char - self.setInput() - elif char == "p": - self.pos = max(0, self.pos - 5) - self.backspace() - elif char == "n": - self.pos += 5 - self.backspace() - - def onBackSpace(self): - if not self.input and self.mode: - self.mode = "" - if not self.input and self.package > -1: - self.package = -1 - - def onEnter(self, input): - if input == "0": - self.cli.reset() - elif self.package < 0 and self.mode: - #mode select - packs = self.parseInput(input) - if self.mode == "m": - [self.client.movePackage((self.target + 1) % 2, x) for x in packs] - elif self.mode == "d": - self.client.deletePackages(packs) - elif self.mode == "r": - [self.client.restartPackage(x) for x in packs] - - elif self.mode: - #edit links - links = self.parseInput(input, False) - - if self.mode == "d": - self.client.deleteFiles(links) - elif self.mode == "r": - map(self.client.restartFile, links) - - else: - #look into package - try: - self.package = int(input) - except: - pass - - self.cache = None - self.links = None - self.pos = 0 - self.mode = "" - self.setInput() - - - def renderBody(self, line): - if self.package < 0: - println(line, white(_("Manage Packages:"))) - else: - println(line, white((_("Manage Links:")))) - line += 1 - - if self.mode: - if self.mode == "m": - println(line, _("What do you want to move?")) - elif self.mode == "d": - println(line, _("What do you want to delete?")) - elif self.mode == "r": - println(line, _("What do you want to restart?")) - - println(line + 1, "Enter single number, comma seperated numbers or ranges. eg. 1, 2, 3 or 1-3.") - line += 2 - else: - println(line, _("Choose what yout want to do or enter package number.")) - println(line + 1, ("%s - %%s, %s - %%s, %s - %%s" % (mag("d"), mag("m"), mag("r"))) % ( - _("delete"), _("move"), _("restart"))) - line += 2 - - if self.package < 0: - #print package info - pack = self.getPackages() - i = 0 - for value in islice(pack, self.pos, self.pos + 5): - try: - println(line, mag(str(value.pid)) + ": " + value.name) - line += 1 - i += 1 - except Exception, e: - pass - for x in range(5 - i): - println(line, "") - line += 1 - else: - #print links info - pack = self.getLinks() - i = 0 - for value in islice(pack.links, self.pos, self.pos + 5): - try: - println(line, mag(value.fid) + ": %s | %s | %s" % ( - value.name, value.statusmsg, value.plugin)) - line += 1 - i += 1 - except Exception, e: - pass - for x in range(5 - i): - println(line, "") - line += 1 - - println(line, mag("p") + _(" - previous") + " | " + mag("n") + _(" - next")) - println(line + 1, mag("0.") + _(" back to main menu")) - - return line + 2 - - - def getPackages(self): - if self.cache and self.time + 2 < time(): - return self.cache - - if self.target == Destination.Queue: - data = self.client.getQueue() - else: - data = self.client.getCollector() - - - self.cache = data - self.time = time() - - return data - - def getLinks(self): - if self.links and self.time + 1 < time(): - return self.links - - try: - data = self.client.getPackageData(self.package) - except: - data = PackageData(links=[]) - - self.links = data - self.time = time() - - return data - - def parseInput(self, inp, package=True): - inp = inp.strip() - if "-" in inp: - l, n, h = inp.partition("-") - l = int(l) - h = int(h) - r = range(l, h + 1) - - ret = [] - if package: - for p in self.cache: - if p.pid in r: - ret.append(p.pid) - else: - for l in self.links.links: - if l.lid in r: - ret.append(l.lid) - - return ret - - else: - return [int(x) for x in inp.split(",")] diff --git a/module/cli/__init__.py b/module/cli/__init__.py deleted file mode 100644 index 413c6a638..000000000 --- a/module/cli/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- - -from AddPackage import AddPackage -from ManageFiles import ManageFiles diff --git a/module/cli/printer.py b/module/cli/printer.py deleted file mode 100644 index 0b2f5a0e3..000000000 --- a/module/cli/printer.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -def blue(string): - return "\033[1;34m" + unicode(string) + "\033[0m" - -def green(string): - return "\033[1;32m" + unicode(string) + "\033[0m" - -def yellow(string): - return "\033[1;33m" + unicode(string) + "\033[0m" - -def red(string): - return "\033[1;31m" + unicode(string) + "\033[0m" - -def cyan(string): - return "\033[1;36m" + unicode(string) + "\033[0m" - -def mag(string): - return "\033[1;35m" + unicode(string) + "\033[0m" - -def white(string): - return "\033[1;37m" + unicode(string) + "\033[0m" - -def println(line, content): - print "\033[" + str(line) + ";0H\033[2K" + content diff --git a/module/common/APIExerciser.py b/module/common/APIExerciser.py deleted file mode 100644 index 34b1529b5..000000000 --- a/module/common/APIExerciser.py +++ /dev/null @@ -1,157 +0,0 @@ -# -*- coding: utf-8 -*- - -import string -from threading import Thread -from random import choice, random, sample, randint -from time import time, sleep -from math import floor -import gc - -from traceback import print_exc, format_exc - -from module.remote.thriftbackend.ThriftClient import ThriftClient, Destination - -def createURLs(): - """ create some urls, some may fail """ - urls = [] - for x in range(0, randint(20, 100)): - name = "DEBUG_API" - if randint(0, 5) == 5: - name = "" #this link will fail - - urls.append(name + "".join(sample(string.ascii_letters, randint(10, 20)))) - - return urls - -AVOID = (0, 3, 8) - -idPool = 0 -sumCalled = 0 - - -def startApiExerciser(core, n): - for i in range(n): - APIExerciser(core).start() - -class APIExerciser(Thread): - - - def __init__(self, core, thrift=False, user=None, pw=None): - global idPool - - Thread.__init__(self) - self.setDaemon(True) - self.core = core - self.count = 0 #number of methods - self.time = time() - - if thrift: - self.api = ThriftClient(user=user, password=pw) - else: - self.api = core.api - - - self.id = idPool - - idPool += 1 - - #self.start() - - def run(self): - - self.core.log.info("API Excerciser started %d" % self.id) - - out = open("error.log", "ab") - #core errors are not logged of course - out.write("\n" + "Starting\n") - out.flush() - - while True: - try: - self.testAPI() - except Exception: - self.core.log.error("Excerciser %d throw an execption" % self.id) - print_exc() - out.write(format_exc() + 2 * "\n") - out.flush() - - if not self.count % 100: - self.core.log.info("Exerciser %d tested %d api calls" % (self.id, self.count)) - if not self.count % 1000: - out.flush() - - if not sumCalled % 1000: #not thread safe - self.core.log.info("Exercisers tested %d api calls" % sumCalled) - persec = sumCalled / (time() - self.time) - self.core.log.info("Approx. %.2f calls per second." % persec) - self.core.log.info("Approx. %.2f ms per call." % (1000 / persec)) - self.core.log.info("Collected garbage: %d" % gc.collect()) - - - #sleep(random() / 500) - - def testAPI(self): - global sumCalled - - m = ["statusDownloads", "statusServer", "addPackage", "getPackageData", "getFileData", "deleteFiles", - "deletePackages", "getQueue", "getCollector", "getQueueData", "getCollectorData", "isCaptchaWaiting", - "getCaptchaTask", "stopAllDownloads", "getAllInfo", "getServices" , "getAccounts", "getAllUserData"] - - method = choice(m) - #print "Testing:", method - - if hasattr(self, method): - res = getattr(self, method)() - else: - res = getattr(self.api, method)() - - self.count += 1 - sumCalled += 1 - - #print res - - def addPackage(self): - name = "".join(sample(string.ascii_letters, 10)) - urls = createURLs() - - self.api.addPackage(name, urls, choice([Destination.Queue, Destination.Collector])) - - - def deleteFiles(self): - info = self.api.getQueueData() - if not info: return - - pack = choice(info) - fids = pack.links - - if len(fids): - fids = [f.fid for f in sample(fids, randint(1, max(len(fids) / 2, 1)))] - self.api.deleteFiles(fids) - - - def deletePackages(self): - info = choice([self.api.getQueue(), self.api.getCollector()]) - if not info: return - - pids = [p.pid for p in info] - if len(pids): - pids = sample(pids, randint(1, max(floor(len(pids) / 2.5), 1))) - self.api.deletePackages(pids) - - def getFileData(self): - info = self.api.getQueueData() - if info: - p = choice(info) - if p.links: - self.api.getFileData(choice(p.links).fid) - - def getPackageData(self): - info = self.api.getQueue() - if info: - self.api.getPackageData(choice(info).pid) - - def getAccounts(self): - self.api.getAccounts(False) - - def getCaptchaTask(self): - self.api.getCaptchaTask(False) diff --git a/module/common/ImportDebugger.py b/module/common/ImportDebugger.py deleted file mode 100644 index ae3aef629..000000000 --- a/module/common/ImportDebugger.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -import sys - -class ImportDebugger(object): - - def __init__(self): - self.imported = {} - - def find_module(self, name, path=None): - - if name not in self.imported: - self.imported[name] = 0 - - self.imported[name] += 1 - - print name, path - -sys.meta_path.append(ImportDebugger()) diff --git a/module/common/JsEngine.py b/module/common/JsEngine.py deleted file mode 100644 index 46789f64d..000000000 --- a/module/common/JsEngine.py +++ /dev/null @@ -1,155 +0,0 @@ -# -*- 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 . - - @author: RaNaN -""" - -from imp import find_module -from os.path import join, exists -from urllib import quote - - -ENGINE = "" - -DEBUG = False -JS = False -PYV8 = False -RHINO = False - - -if not ENGINE: - try: - import subprocess - - subprocess.Popen(["js", "-v"], bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() - p = subprocess.Popen(["js", "-e", "print(23+19)"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = p.communicate() - #integrity check - if out.strip() == "42": - ENGINE = "js" - JS = True - except: - pass - -if not ENGINE or DEBUG: - try: - find_module("PyV8") - ENGINE = "pyv8" - PYV8 = True - except: - pass - -if not ENGINE or DEBUG: - try: - path = "" #path where to find rhino - - if exists("/usr/share/java/js.jar"): - path = "/usr/share/java/js.jar" - elif exists("js.jar"): - path = "js.jar" - elif exists(join(pypath, "js.jar")): #may raises an exception, but js.jar wasnt found anyway - path = join(pypath, "js.jar") - - if not path: - raise Exception - - import subprocess - - p = subprocess.Popen(["java", "-cp", path, "org.mozilla.javascript.tools.shell.Main", "-e", "print(23+19)"], - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = p.communicate() - #integrity check - if out.strip() == "42": - ENGINE = "rhino" - RHINO = True - except: - pass - -class JsEngine: - def __init__(self): - self.engine = ENGINE - self.init = False - - def __nonzero__(self): - return False if not ENGINE else True - - def eval(self, script): - if not self.init: - if ENGINE == "pyv8" or (DEBUG and PYV8): - import PyV8 - global PyV8 - - self.init = True - - if type(script) == unicode: - script = script.encode("utf8") - - if not ENGINE: - raise Exception("No JS Engine") - - if not DEBUG: - if ENGINE == "pyv8": - return self.eval_pyv8(script) - elif ENGINE == "js": - return self.eval_js(script) - elif ENGINE == "rhino": - return self.eval_rhino(script) - else: - results = [] - if PYV8: - res = self.eval_pyv8(script) - print "PyV8:", res - results.append(res) - if JS: - res = self.eval_js(script) - print "JS:", res - results.append(res) - if RHINO: - res = self.eval_rhino(script) - print "Rhino:", res - results.append(res) - - warning = False - for x in results: - for y in results: - if x != y: - warning = True - - if warning: print "### WARNING ###: Different results" - - return results[0] - - def eval_pyv8(self, script): - rt = PyV8.JSContext() - rt.enter() - return rt.eval(script) - - def eval_js(self, script): - script = "print(eval(unescape('%s')))" % quote(script) - p = subprocess.Popen(["js", "-e", script], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1) - out, err = p.communicate() - res = out.strip() - return res - - def eval_rhino(self, script): - script = "print(eval(unescape('%s')))" % quote(script) - p = subprocess.Popen(["java", "-cp", path, "org.mozilla.javascript.tools.shell.Main", "-e", script], - stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1) - out, err = p.communicate() - res = out.strip() - return res.decode("utf8").encode("ISO-8859-1") - - def error(self): - return _("No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino") diff --git a/module/common/__init__.py b/module/common/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/module/common/json_layer.py b/module/common/json_layer.py deleted file mode 100644 index bb3937cdc..000000000 --- a/module/common/json_layer.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- - -# abstraction layer for json operations - -try: # since python 2.6 - import json - from json import loads as json_loads - from json import dumps as json_dumps -except ImportError: #use system simplejson if available - import simplejson as json - from simplejson import loads as json_loads - from simplejson import dumps as json_dumps diff --git a/module/common/packagetools.py b/module/common/packagetools.py deleted file mode 100644 index d5ab4d182..000000000 --- a/module/common/packagetools.py +++ /dev/null @@ -1,136 +0,0 @@ -# JDownloader/src/jd/controlling/LinkGrabberPackager.java - -import re -from urlparse import urlparse - -def matchFirst(string, *args): - """ matches against list of regexp and returns first match""" - for patternlist in args: - for pattern in patternlist: - r = pattern.search(string) - if r is not None: - name = r.group(1) - return name - - return string - - -def parseNames(files): - """ Generates packages names from name, data lists - - :param files: list of (name, data) - :return: packagenames mapt to data lists (eg. urls) - """ - packs = {} - - endings = "\\.(3gp|7zip|7z|abr|ac3|aiff|aifc|aif|ai|au|avi|bin|bz2|cbr|cbz|ccf|cue|cvd|chm|dta|deb|divx|djvu|dlc|dmg|doc|docx|dot|eps|exe|ff|flv|f4v|gsd|gif|gz|iwd|iso|ipsw|java|jar|jpg|jpeg|jdeatme|load|mws|mw|m4v|m4a|mkv|mp2|mp3|mp4|mov|movie|mpeg|mpe|mpg|msi|msu|msp|nfo|npk|oga|ogg|ogv|otrkey|pkg|png|pdf|pptx|ppt|pps|ppz|pot|psd|qt|rmvb|rm|rar|ram|ra|rev|rnd|r\\d+|rpm|run|rsdf|rtf|sh(!?tml)|srt|snd|sfv|swf|tar|tif|tiff|ts|txt|viv|vivo|vob|wav|wmv|xla|xls|xpi|zeno|zip|z\\d+|_[_a-z]{2}|\\d+$)" - - rarPats = [re.compile("(.*)(\\.|_|-)pa?r?t?\\.?[0-9]+.(rar|exe)$", re.I), - re.compile("(.*)(\\.|_|-)part\\.?[0]*[1].(rar|exe)$", re.I), - re.compile("(.*)\\.rar$", re.I), - re.compile("(.*)\\.r\\d+$", re.I), - re.compile("(.*)(\\.|_|-)\\d+$", re.I)] - - zipPats = [re.compile("(.*)\\.zip$", re.I), - re.compile("(.*)\\.z\\d+$", re.I), - re.compile("(?is).*\\.7z\\.[\\d]+$", re.I), - re.compile("(.*)\\.a.$", re.I)] - - ffsjPats = [re.compile("(.*)\\._((_[a-z])|([a-z]{2}))(\\.|$)"), - re.compile("(.*)(\\.|_|-)[\\d]+(" + endings + "$)", re.I)] - - iszPats = [re.compile("(.*)\\.isz$", re.I), - re.compile("(.*)\\.i\\d{2}$", re.I)] - - pat1 = re.compile("(\\.?CD\\d+)", re.I) - pat2 = re.compile("(\\.?part\\d+)", re.I) - - pat3 = re.compile("(.+)[\\.\\-_]+$") - pat4 = re.compile("(.+)\\.\\d+\\.xtm$") - - for file, url in files: - patternMatch = False - - if file is None: - continue - - # remove trailing / - name = file.rstrip('/') - - # extract last path part .. if there is a path - split = name.rsplit("/", 1) - if len(split) > 1: - name = split.pop(1) - - #check if a already existing package may be ok for this file - # found = False - # for pack in packs: - # if pack in file: - # packs[pack].append(url) - # found = True - # break - # - # if found: continue - - # unrar pattern, 7zip/zip and hjmerge pattern, isz pattern, FFSJ pattern - before = name - name = matchFirst(name, rarPats, zipPats, iszPats, ffsjPats) - if before != name: - patternMatch = True - - # xtremsplit pattern - r = pat4.search(name) - if r is not None: - name = r.group(1) - - # remove part and cd pattern - r = pat1.search(name) - if r is not None: - name = name.replace(r.group(0), "") - patternMatch = True - - r = pat2.search(name) - if r is not None: - name = name.replace(r.group(0), "") - patternMatch = True - - # additional checks if extension pattern matched - if patternMatch: - # remove extension - index = name.rfind(".") - if index <= 0: - index = name.rfind("_") - if index > 0: - length = len(name) - index - if length <= 4: - name = name[:-length] - - # remove endings like . _ - - r = pat3.search(name) - if r is not None: - name = r.group(1) - - # replace . and _ with space - name = name.replace(".", " ") - name = name.replace("_", " ") - - name = name.strip() - else: - name = "" - - # fallback: package by hoster - if not name: - name = urlparse(file).hostname - if name: name = name.replace("www.", "") - - # fallback : default name - if not name: - name = "unknown" - - # build mapping - if name in packs: - packs[name].append(url) - else: - packs[name] = [url] - - return packs diff --git a/module/common/pavement.py b/module/common/pavement.py deleted file mode 100644 index 9d36e9c1d..000000000 --- a/module/common/pavement.py +++ /dev/null @@ -1,412 +0,0 @@ -# -*- coding: utf-8 -*- - -from paver.easy import * -from paver.setuputils import setup -from paver.doctools import cog - -import os -import sys -import shutil -import re -from glob import glob -from tempfile import mkdtemp -from urllib import urlretrieve -from subprocess import call, Popen, PIPE -from zipfile import ZipFile - -PROJECT_DIR = path(__file__).dirname() -sys.path.append(PROJECT_DIR) - -options = environment.options -path('pyload').mkdir() - -extradeps = [] -if sys.version_info <= (2, 5): - extradeps += 'simplejson' - -setup( - name="pyload", - version="0.4.10", - description='Fast, lightweight and full featured download manager.', - long_description=open(PROJECT_DIR / "README.md").read(), - keywords = ('pyload', 'download-manager', 'one-click-hoster', 'download'), - url="http://pyload.org", - download_url='http://pyload.org/download', - license='GPL v3', - author="pyLoad Team", - author_email="support@pyload.org", - platforms = ('Any',), - #package_dir={'pyload': 'src'}, - packages=['pyload'], - #package_data=find_package_data(), - #data_files=[], - include_package_data=True, - exclude_package_data={'pyload': ['docs*', 'scripts*', 'tests*']}, #exluced from build but not from sdist - # 'bottle >= 0.10.0' not in list, because its small and contain little modifications - install_requires=['thrift >= 0.8.0', 'jinja2', 'pycurl', 'Beaker', 'BeautifulSoup >= 3.2, < 3.3'] + extradeps, - extras_require={ - 'SSL': ["pyOpenSSL"], - 'DLC': ['pycrypto'], - 'lightweight webserver': ['bjoern'], - 'RSS plugins': ['feedparser'], - }, - #setup_requires=["setuptools_hg"], - entry_points={ - 'console_scripts': [ - 'pyLoadCore = pyLoadCore:main', - 'pyLoadCli = pyLoadCli:main' - ]}, - zip_safe=False, - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Topic :: Internet :: WWW/HTTP", - "Environment :: Console", - "Environment :: Web Environment", - "Intended Audience :: End Users/Desktop", - "License :: OSI Approved :: GNU General Public License (GPL)", - "Operating System :: OS Independent", - "Programming Language :: Python :: 2" - ] -) - -options( - sphinx=Bunch( - builddir="_build", - sourcedir="" - ), - get_source=Bunch( - src="https://bitbucket.org/spoob/pyload/get/tip.zip", - rev=None, - clean=False - ), - thrift=Bunch( - path="../thrift/trunk/compiler/cpp/thrift", - gen="" - ), - virtualenv=Bunch( - dir="env", - python="python2", - virtual="virtualenv2", - ), - cog=Bunch( - pattern="*.py", - ) -) - -# xgettext args -xargs = ["--language=Python", "--add-comments=L10N", - "--from-code=utf-8", "--copyright-holder=pyLoad Team", "--package-name=pyLoad", - "--package-version=%s" % options.version, "--msgid-bugs-address='bugs@pyload.org'"] - -@task -@needs('cog') -def html(): - """Build html documentation""" - module = path("docs") / "module" - module.rmtree() - call_task('paver.doctools.html') - - -@task -@cmdopts([ - ('src=', 's', 'Url to source'), - ('rev=', 'r', "HG revision"), - ("clean", 'c', 'Delete old source folder') -]) -def get_source(options): - """ Downloads pyload source from bitbucket tip or given rev""" - if options.rev: options.url = "https://bitbucket.org/spoob/pyload/get/%s.zip" % options.rev - - pyload = path("pyload") - - if len(pyload.listdir()) and not options.clean: - return - elif pyload.exists(): - pyload.rmtree() - - urlretrieve(options.src, "pyload_src.zip") - zip = ZipFile("pyload_src.zip") - zip.extractall() - path("pyload_src.zip").remove() - - folder = [x for x in path(".").dirs() if x.name.startswith("spoob-pyload-")][0] - folder.move(pyload) - - change_mode(pyload, 0644) - change_mode(pyload, 0755, folder=True) - - for file in pyload.files(): - if file.name.endswith(".py"): - file.chmod(0755) - - (pyload / ".hgtags").remove() - (pyload / ".gitignore").remove() - #(pyload / "docs").rmtree() - - f = open(pyload / "__init__.py", "wb") - f.close() - - #options.setup.packages = find_packages() - #options.setup.package_data = find_package_data() - - -@task -@needs('clean', 'generate_setup', 'minilib', 'get_source', 'setuptools.command.sdist') -def sdist(): - """ Build source code package with distutils """ - - -@task -@cmdopts([ - ('path=', 'p', 'Thrift path'), - ('gen=', 'g', "Extra --gen option") -]) -def thrift(options): - """ Generate Thrift stubs """ - - print "add import for TApplicationException manually as long it is not fixed" - - outdir = path("module") / "remote" / "thriftbackend" - (outdir / "gen-py").rmtree() - - cmd = [options.thrift.path, "-strict", "-o", outdir, "--gen", "py:slots, dynamic", outdir / "pyload.thrift"] - - if options.gen: - cmd.insert(len(cmd) - 1, "--gen") - cmd.insert(len(cmd) - 1, options.gen) - - print "running", cmd - - p = Popen(cmd) - p.communicate() - - (outdir / "thriftgen").rmtree() - (outdir / "gen-py").move(outdir / "thriftgen") - - #create light ttypes - from module.remote.socketbackend.create_ttypes import main - main() - -@task -def compile_js(): - """ Compile .coffee files to javascript""" - - root = path("module") / "web" / "media" / "js" - for f in root.glob("*.coffee"): - print "generate", f - coffee = Popen(["coffee", "-cbs"], stdin=open(f, "rb"), stdout=PIPE) - yui = Popen(["yuicompressor", "--type", "js"], stdin=coffee.stdout, stdout=PIPE) - coffee.stdout.close() - content = yui.communicate()[0] - with open(root / f.name.replace(".coffee", ".js"), "wb") as js: - js.write("{% autoescape true %}\n") - js.write(content) - js.write("\n{% endautoescape %}") - - -@task -def generate_locale(): - """ Generates localization files """ - - EXCLUDE = ["BeautifulSoup.py", "module/cli", "web/locale", "web/ajax", "web/cnl", "web/pyload", - "setup.py"] - makepot("core", path("module"), EXCLUDE, "./pyload.py\n") - - makepot("cli", path("module") / "cli", [], includes="./pyload-cli.py\n") - makepot("setup", "", [], includes="./module/setup.py\n") - - EXCLUDE = ["ServerThread.py", "web/media/default"] - - # strings from js files - strings = set() - - for fi in path("module/web").walkfiles(): - if not fi.name.endswith(".js") and not fi.endswith(".coffee"): continue - with open(fi, "rb") as c: - content = c.read() - - strings.update(re.findall(r"_\s*\(\s*\"([^\"]+)", content)) - strings.update(re.findall(r"_\s*\(\s*\'([^\']+)", content)) - - trans = path("module") / "web" / "translations.js" - - with open(trans, "wb") as js: - for s in strings: - js.write('_("%s")\n' % s) - - makepot("django", path("module/web"), EXCLUDE, "./%s\n" % trans.relpath(), [".py", ".html"], ["--language=Python"]) - - trans.remove() - - path("includes.txt").remove() - - print "Locale generated" - - -@task -@cmdopts([ - ('key=', 'k', 'api key') -]) -def upload_translations(options): - """ Uploads the locale files to translation server """ - tmp = path(mkdtemp()) - - shutil.copy('locale/crowdin.yaml', tmp) - os.mkdir(tmp / 'pyLoad') - for f in glob('locale/*.pot'): - if os.path.isfile(f): - shutil.copy(f, tmp / 'pyLoad') - - config = tmp / 'crowdin.yaml' - content = open(config, 'rb').read() - content = content.format(key=options.key, tmp=tmp) - f = open(config, 'wb') - f.write(content) - f.close() - - call(['crowdin-cli', '-c', config, 'upload', 'source']) - - shutil.rmtree(tmp) - - print "Translations uploaded" - - -@task -@cmdopts([ - ('key=', 'k', 'api key') -]) -def download_translations(options): - """ Downloads the translated files from translation server """ - tmp = path(mkdtemp()) - - shutil.copy('locale/crowdin.yaml', tmp) - os.mkdir(tmp / 'pyLoad') - for f in glob('locale/*.pot'): - if os.path.isfile(f): - shutil.copy(f, tmp / 'pyLoad') - - config = tmp / 'crowdin.yaml' - content = open(config, 'rb').read() - content = content.format(key=options.key, tmp=tmp) - f = open(config, 'wb') - f.write(content) - f.close() - - call(['crowdin-cli', '-c', config, 'download']) - - for language in (tmp / 'pyLoad').listdir(): - if not language.isdir(): - continue - - target = path('locale') / language.basename() - print "Copy language %s" % target - if target.exists(): - shutil.rmtree(target) - - shutil.copytree(language, target) - - shutil.rmtree(tmp) - - -@task -def compile_translations(): - """ Compile PO files to MO """ - for language in path('locale').listdir(): - if not language.isdir(): - continue - - for f in glob(language / 'LC_MESSAGES' / '*.po'): - print "Compiling %s" % f - call(['msgfmt', '-o', f.replace('.po', '.mo'), f]) - - -@task -def tests(): - call(["nosetests2"]) - -@task -def virtualenv(options): - """Setup virtual environment""" - if path(options.dir).exists(): - return - - call([options.virtual, "--no-site-packages", "--python", options.python, options.dir]) - print "$ source %s/bin/activate" % options.dir - - -@task -def clean_env(): - """Deletes the virtual environment""" - env = path(options.virtualenv.dir) - if env.exists(): - env.rmtree() - - -@task -@needs('generate_setup', 'minilib', 'get_source', 'virtualenv') -def env_install(): - """Install pyLoad into the virtualenv""" - venv = options.virtualenv - call([path(venv.dir) / "bin" / "easy_install", "."]) - - -@task -def clean(): - """Cleans build directories""" - path("build").rmtree() - path("dist").rmtree() - - -#helper functions - -def walk_trans(path, EXCLUDE, endings=[".py"]): - result = "" - - for f in path.walkfiles(): - if [True for x in EXCLUDE if x in f.dirname().relpath()]: continue - if f.name in EXCLUDE: continue - - for e in endings: - if f.name.endswith(e): - result += "./%s\n" % f.relpath() - break - - return result - - -def makepot(domain, p, excludes=[], includes="", endings=[".py"], xxargs=[]): - print "Generate %s.pot" % domain - - f = open("includes.txt", "wb") - if includes: - f.write(includes) - - if p: - f.write(walk_trans(path(p), excludes, endings)) - - f.close() - - call(["xgettext", "--files-from=includes.txt", "--default-domain=%s" % domain] + xargs + xxargs) - - # replace charset und move file - with open("%s.po" % domain, "rb") as f: - content = f.read() - - path("%s.po" % domain).remove() - content = content.replace("charset=CHARSET", "charset=UTF-8") - - with open("locale/%s.pot" % domain, "wb") as f: - f.write(content) - - -def change_owner(dir, uid, gid): - for p in dir.walk(): - p.chown(uid, gid) - - -def change_mode(dir, mode, folder=False): - for p in dir.walk(): - if folder and p.isdir(): - p.chmod(mode) - elif p.isfile() and not folder: - p.chmod(mode) diff --git a/module/common/pylgettext.py b/module/common/pylgettext.py deleted file mode 100644 index cab631cf4..000000000 --- a/module/common/pylgettext.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- - -from gettext import * - -_searchdirs = None - -origfind = find - -def setpaths(pathlist): - global _searchdirs - if isinstance(pathlist, list): - _searchdirs = pathlist - else: - _searchdirs = list(pathlist) - - -def addpath(path): - global _searchdirs - if _searchdirs is None: - _searchdirs = list(path) - else: - if path not in _searchdirs: - _searchdirs.append(path) - - -def delpath(path): - global _searchdirs - if _searchdirs is not None: - if path in _searchdirs: - _searchdirs.remove(path) - - -def clearpath(): - global _searchdirs - if _searchdirs is not None: - _searchdirs = None - - -def find(domain, localedir=None, languages=None, all=False): - if _searchdirs is None: - return origfind(domain, localedir, languages, all) - searches = [localedir] + _searchdirs - results = list() - for dir in searches: - res = origfind(domain, dir, languages, all) - if all is False: - results.append(res) - else: - results.extend(res) - if all is False: - results = filter(lambda x: x is not None, results) - if len(results) == 0: - return None - else: - return results[0] - else: - return results - -#Is there a smarter/cleaner pythonic way for this? -translation.func_globals['find'] = find diff --git a/module/common/test_api.py b/module/common/test_api.py deleted file mode 100644 index f8901f731..000000000 --- a/module/common/test_api.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.common import APIExerciser -from nose.tools import nottest - - -class TestApi: - - def __init__(self): - self.api = APIExerciser.APIExerciser(None, True, "TestUser", "pwhere") - - def test_login(self): - assert self.api.api.login("crapp", "wrong pw") is False - - #takes really long, only test when needed - @nottest - def test_random(self): - - for i in range(0, 100): - self.api.testAPI() diff --git a/module/common/test_json.py b/module/common/test_json.py deleted file mode 100644 index 320a42d4f..000000000 --- a/module/common/test_json.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- - -from urllib import urlencode -from urllib2 import urlopen, HTTPError -from json import loads - -from logging import log - -url = "http://localhost:8001/api/%s" - -class TestJson: - - def call(self, name, post=None): - if not post: post = {} - post["session"] = self.key - u = urlopen(url % name, data=urlencode(post)) - return loads(u.read()) - - def setUp(self): - u = urlopen(url % "login", data=urlencode({"username": "TestUser", "password": "pwhere"})) - self.key = loads(u.read()) - assert self.key is not False - - def test_wronglogin(self): - u = urlopen(url % "login", data=urlencode({"username": "crap", "password": "wrongpw"})) - assert loads(u.read()) is False - - def test_access(self): - try: - urlopen(url % "getServerVersion") - except HTTPError, e: - assert e.code == 403 - else: - assert False - - def test_status(self): - ret = self.call("statusServer") - log(1, str(ret)) - assert "pause" in ret - assert "queue" in ret - - def test_unknown_method(self): - try: - self.call("notExisting") - except HTTPError, e: - assert e.code == 404 - else: - assert False diff --git a/module/config/default.conf b/module/config/default.conf deleted file mode 100644 index 3a513f122..000000000 --- a/module/config/default.conf +++ /dev/null @@ -1,64 +0,0 @@ -version: 1 - -remote - "Remote": - int port : "Port" = 7227 - ip listenaddr : "Address" = 0.0.0.0 - bool nolocalauth : "No authentication on local connections" = True - bool activated : "Activated" = True -ssl - "SSL": - bool activated : "Activated"= False - file cert : "SSL Certificate" = ssl.crt - file key : "SSL Key" = ssl.key -webinterface - "Web UI": - bool activated : "Activated" = True - builtin;threaded;fastcgi;lightweight server : "Server" = builtin - bool https : "Use HTTPS" = False - ip host : "IP" = 0.0.0.0 - int port : "Port" = 8001 - default;dark;flat theme : "Theme" = flat - str prefix: "Path Prefix" = -log - "Log": - bool file_log : "File Log" = True - folder log_folder : "Folder" = Logs - int log_count : "Count" = 5 - int log_size : "Size in kb" = 100 - bool log_rotate : "Log Rotate" = True -general - "General": - en;de;fr;it;es;nl;sv;ru;pl;cs;sr;pt_BR language : "Language" = en - folder download_folder : "Download Folder" = Downloads - bool debug_mode : "Debug Mode" = False - int min_free_space : "Min Free Space (MB)" = 200 - bool folder_per_package : "Create folder for each package" = True - int renice : "CPU Priority" = 0 -download - "Download": - int chunks : "Max connections for one download" = 3 - int max_downloads : "Max Parallel Downloads" = 3 - int max_speed : "Max Download Speed in kb/s" = -1 - bool limit_speed : "Limit Download Speed" = False - str interface : "Download interface to bind (ip or Name)" = None - bool ipv6: "Allow IPv6" = False - bool skip_existing : "Skip already existing files" = False -permission - "Permissions": - bool change_user : "Change user of running process" = False - str user : "Username" = user - str folder : "Folder Permission mode" = 0755 - bool change_file : "Change file mode of downloads" = False - str file : "Filemode for Downloads" = 0644 - bool change_group : "Change group of running process" = False - str group : "Groupname" = users - bool change_dl : "Change Group and User of Downloads" = False -reconnect - "Reconnect": - bool activated : "Use Reconnect" = False - str method : "Method" = None - time startTime : "Start" = 0:00 - time endTime : "End" = 0:00 -downloadTime - "Download Time": - time start : "Start" = 0:00 - time end : "End" = 0:00 -proxy - "Proxy": - str address : "Address" = "localhost" - int port : "Port" = 7070 - http;socks4;socks5 type : "Protocol" = http - str username : "Username" = None - password password : "Password" = None - bool proxy : "Use Proxy" = False diff --git a/module/database/DatabaseBackend.py b/module/database/DatabaseBackend.py deleted file mode 100644 index df2660063..000000000 --- a/module/database/DatabaseBackend.py +++ /dev/null @@ -1,305 +0,0 @@ -""" - 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 . - - @author: RaNaN - @author: mkaay -""" -from threading import Thread -from threading import Event -from os import remove -from os.path import exists -from shutil import move - -from Queue import Queue -from traceback import print_exc - -from module.utils import chmod - -try: - from pysqlite2 import dbapi2 as sqlite3 -except: - import sqlite3 - -DB_VERSION = 4 - -class style: - db = None - - @classmethod - def setDB(cls, db): - cls.db = db - - @classmethod - def inner(cls, f): - @staticmethod - def x(*args, **kwargs): - if cls.db: - return f(cls.db, *args, **kwargs) - return x - - @classmethod - def queue(cls, f): - @staticmethod - def x(*args, **kwargs): - if cls.db: - return cls.db.queue(f, *args, **kwargs) - return x - - @classmethod - def async(cls, f): - @staticmethod - def x(*args, **kwargs): - if cls.db: - return cls.db.async(f, *args, **kwargs) - return x - -class DatabaseJob: - def __init__(self, f, *args, **kwargs): - self.done = Event() - - self.f = f - self.args = args - self.kwargs = kwargs - - self.result = None - self.exception = False - -# import inspect -# self.frame = inspect.currentframe() - - def __repr__(self): - from os.path import basename - frame = self.frame.f_back - output = "" - for i in range(5): - output += "\t%s:%s, %s\n" % (basename(frame.f_code.co_filename), frame.f_lineno, frame.f_code.co_name) - frame = frame.f_back - del frame - del self.frame - - return "DataBase Job %s:%s\n%sResult: %s" % (self.f.__name__, self.args[1:], output, self.result) - - def processJob(self): - try: - self.result = self.f(*self.args, **self.kwargs) - except Exception, e: - print_exc() - try: - print "Database Error @", self.f.__name__, self.args[1:], self.kwargs, e - except: - pass - - self.exception = e - finally: - self.done.set() - - def wait(self): - self.done.wait() - -class DatabaseBackend(Thread): - subs = [] - def __init__(self, core): - Thread.__init__(self) - self.setDaemon(True) - self.core = core - - self.jobs = Queue() - - self.setuplock = Event() - - style.setDB(self) - - def setup(self): - self.start() - self.setuplock.wait() - - def run(self): - """main loop, which executes commands""" - convert = self._checkVersion() #returns None or current version - - self.conn = sqlite3.connect("files.db") - chmod("files.db", 0600) - - self.c = self.conn.cursor() #compatibility - - if convert is not None: - self._convertDB(convert) - - self._createTables() - self._migrateUser() - - self.conn.commit() - - self.setuplock.set() - - while True: - j = self.jobs.get() - if j == "quit": - self.c.close() - self.conn.close() - break - j.processJob() - - @style.queue - def shutdown(self): - self.conn.commit() - self.jobs.put("quit") - - def _checkVersion(self): - """ check db version and delete it if needed""" - if not exists("files.version"): - f = open("files.version", "wb") - f.write(str(DB_VERSION)) - f.close() - return - - f = open("files.version", "rb") - v = int(f.read().strip()) - f.close() - if v < DB_VERSION: - if v < 2: - try: - self.manager.core.log.warning(_("Filedatabase was deleted due to incompatible version.")) - except: - print "Filedatabase was deleted due to incompatible version." - remove("files.version") - move("files.db", "files.backup.db") - f = open("files.version", "wb") - f.write(str(DB_VERSION)) - f.close() - return v - - def _convertDB(self, v): - try: - getattr(self, "_convertV%i" % v)() - except: - try: - self.core.log.error(_("Filedatabase could NOT be converted.")) - except: - print "Filedatabase could NOT be converted." - - #convert scripts start----------------------------------------------------- - - def _convertV2(self): - self.c.execute('CREATE TABLE IF NOT EXISTS "storage" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "identifier" TEXT NOT NULL, "key" TEXT NOT NULL, "value" TEXT DEFAULT "")') - try: - self.manager.core.log.info(_("Database was converted from v2 to v3.")) - except: - print "Database was converted from v2 to v3." - self._convertV3() - - def _convertV3(self): - self.c.execute('CREATE TABLE IF NOT EXISTS "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "email" TEXT DEFAULT "" NOT NULL, "password" TEXT NOT NULL, "role" INTEGER DEFAULT 0 NOT NULL, "permission" INTEGER DEFAULT 0 NOT NULL, "template" TEXT DEFAULT "default" NOT NULL)') - try: - self.manager.core.log.info(_("Database was converted from v3 to v4.")) - except: - print "Database was converted from v3 to v4." - - #convert scripts end------------------------------------------------------- - - def _createTables(self): - """create tables for database""" - - self.c.execute('CREATE TABLE IF NOT EXISTS "packages" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "folder" TEXT, "password" TEXT DEFAULT "", "site" TEXT DEFAULT "", "queue" INTEGER DEFAULT 0 NOT NULL, "packageorder" INTEGER DEFAULT 0 NOT NULL)') - self.c.execute('CREATE TABLE IF NOT EXISTS "links" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "url" TEXT NOT NULL, "name" TEXT, "size" INTEGER DEFAULT 0 NOT NULL, "status" INTEGER DEFAULT 3 NOT NULL, "plugin" TEXT DEFAULT "BasePlugin" NOT NULL, "error" TEXT DEFAULT "", "linkorder" INTEGER DEFAULT 0 NOT NULL, "package" INTEGER DEFAULT 0 NOT NULL, FOREIGN KEY(package) REFERENCES packages(id))') - self.c.execute('CREATE INDEX IF NOT EXISTS "pIdIndex" ON links(package)') - self.c.execute('CREATE TABLE IF NOT EXISTS "storage" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "identifier" TEXT NOT NULL, "key" TEXT NOT NULL, "value" TEXT DEFAULT "")') - self.c.execute('CREATE TABLE IF NOT EXISTS "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "email" TEXT DEFAULT "" NOT NULL, "password" TEXT NOT NULL, "role" INTEGER DEFAULT 0 NOT NULL, "permission" INTEGER DEFAULT 0 NOT NULL, "template" TEXT DEFAULT "default" NOT NULL)') - - self.c.execute('CREATE VIEW IF NOT EXISTS "pstats" AS \ - SELECT p.id AS id, SUM(l.size) AS sizetotal, COUNT(l.id) AS linkstotal, linksdone, sizedone\ - FROM packages p JOIN links l ON p.id = l.package LEFT OUTER JOIN\ - (SELECT p.id AS id, COUNT(*) AS linksdone, SUM(l.size) AS sizedone \ - FROM packages p JOIN links l ON p.id = l.package AND l.status in (0, 4, 13) GROUP BY p.id) s ON s.id = p.id \ - GROUP BY p.id') - - #try to lower ids - self.c.execute('SELECT max(id) FROM LINKS') - fid = self.c.fetchone()[0] - if fid: - fid = int(fid) - else: - fid = 0 - self.c.execute('UPDATE SQLITE_SEQUENCE SET seq=? WHERE name=?', (fid, "links")) - - - self.c.execute('SELECT max(id) FROM packages') - pid = self.c.fetchone()[0] - if pid: - pid = int(pid) - else: - pid = 0 - self.c.execute('UPDATE SQLITE_SEQUENCE SET seq=? WHERE name=?', (pid, "packages")) - - self.c.execute('VACUUM') - - - def _migrateUser(self): - if exists("pyload.db"): - try: - self.core.log.info(_("Converting old Django DB")) - except: - print "Converting old Django DB" - conn = sqlite3.connect('pyload.db') - c = conn.cursor() - c.execute("SELECT username, password, email from auth_user WHERE is_superuser") - users = [] - for r in c: - pw = r[1].split("$") - users.append((r[0], pw[1] + pw[2], r[2])) - c.close() - conn.close() - - self.c.executemany("INSERT INTO users(name, password, email) VALUES (?, ?, ?)", users) - move("pyload.db", "pyload.old.db") - - def createCursor(self): - return self.conn.cursor() - - @style.async - def commit(self): - self.conn.commit() - - @style.queue - def syncSave(self): - self.conn.commit() - - @style.async - def rollback(self): - self.conn.rollback() - - def async(self, f, *args, **kwargs): - args = (self,) + args - job = DatabaseJob(f, *args, **kwargs) - self.jobs.put(job) - - def queue(self, f, *args, **kwargs): - args = (self,) + args - job = DatabaseJob(f, *args, **kwargs) - self.jobs.put(job) - job.wait() - return job.result - - @classmethod - def registerSub(cls, klass): - cls.subs.append(klass) - - @classmethod - def unregisterSub(cls, klass): - cls.subs.remove(klass) - - def __getattr__(self, attr): - for sub in DatabaseBackend.subs: - if hasattr(sub, attr): - return getattr(sub, attr) diff --git a/module/database/FileDatabase.py b/module/database/FileDatabase.py deleted file mode 100644 index f01d02769..000000000 --- a/module/database/FileDatabase.py +++ /dev/null @@ -1,891 +0,0 @@ -""" - 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 . - - @author: RaNaN - @author: mkaay -""" - - -from threading import RLock -from time import time - -from module.utils import formatSize, lock -from module.PullEvents import InsertEvent, ReloadAllEvent, RemoveEvent, UpdateEvent -from module.PyPackage import PyPackage -from module.PyFile import PyFile -from module.database import style, DatabaseBackend - -try: - from pysqlite2 import dbapi2 as sqlite3 -except: - import sqlite3 - - -class FileHandler: - """Handles all request made to obtain information, - modify status or other request for links or packages""" - - def __init__(self, core): - """Constructor""" - self.core = core - - # translations - self.statusMsg = [_("finished"), _("offline"), _("online"), _("queued"), _("skipped"), _("waiting"), _("temp. offline"), _("starting"), _("failed"), _("aborted"), _("decrypting"), _("custom"), _("downloading"), _("processing"), _("unknown")] - - self.cache = {} #holds instances for files - self.packageCache = {} # same for packages - #@TODO: purge the cache - - self.jobCache = {} - - self.lock = RLock() #@TODO should be a Lock w/o R - #self.lock._Verbose__verbose = True - - self.filecount = -1 # if an invalid value is set get current value from db - self.queuecount = -1 #number of package to be loaded - self.unchanged = False #determines if any changes was made since last call - - self.db = self.core.db - - def change(func): - def new(*args): - args[0].unchanged = False - args[0].filecount = -1 - args[0].queuecount = -1 - args[0].jobCache = {} - return func(*args) - return new - - #-------------------------------------------------------------------------- - def save(self): - """saves all data to backend""" - self.db.commit() - - #-------------------------------------------------------------------------- - def syncSave(self): - """saves all data to backend and waits until all data are written""" - pyfiles = self.cache.values() - for pyfile in pyfiles: - pyfile.sync() - - pypacks = self.packageCache.values() - for pypack in pypacks: - pypack.sync() - - self.db.syncSave() - - @lock - def getCompleteData(self, queue=1): - """gets a complete data representation""" - - data = self.db.getAllLinks(queue) - packs = self.db.getAllPackages(queue) - - data.update([(x.id, x.toDbDict()[x.id]) for x in self.cache.values()]) - - for x in self.packageCache.itervalues(): - if x.queue != queue or x.id not in packs: continue - packs[x.id].update(x.toDict()[x.id]) - - for key, value in data.iteritems(): - if value["package"] in packs: - packs[value["package"]]["links"][key] = value - - return packs - - @lock - def getInfoData(self, queue=1): - """gets a data representation without links""" - - packs = self.db.getAllPackages(queue) - for x in self.packageCache.itervalues(): - if x.queue != queue or x.id not in packs: continue - packs[x.id].update(x.toDict()[x.id]) - - return packs - - @lock - @change - def addLinks(self, urls, package): - """adds links""" - - self.core.hookManager.dispatchEvent("linksAdded", urls, package) - - data = self.core.pluginManager.parseUrls(urls) - - self.db.addLinks(data, package) - self.core.threadManager.createInfoThread(data, package) - - #@TODO change from reloadAll event to package update event - self.core.pullManager.addEvent(ReloadAllEvent("collector")) - - #-------------------------------------------------------------------------- - @lock - @change - def addPackage(self, name, folder, queue=0): - """adds a package, default to link collector""" - lastID = self.db.addPackage(name, folder, queue) - p = self.db.getPackage(lastID) - e = InsertEvent("pack", lastID, p.order, "collector" if not queue else "queue") - self.core.pullManager.addEvent(e) - return lastID - - #-------------------------------------------------------------------------- - @lock - @change - def deletePackage(self, id): - """delete package and all contained links""" - - p = self.getPackage(id) - if not p: - if id in self.packageCache: del self.packageCache[id] - return - - oldorder = p.order - queue = p.queue - - e = RemoveEvent("pack", id, "collector" if not p.queue else "queue") - - pyfiles = self.cache.values() - - for pyfile in pyfiles: - if pyfile.packageid == id: - pyfile.abortDownload() - pyfile.release() - - self.db.deletePackage(p) - self.core.pullManager.addEvent(e) - self.core.hookManager.dispatchEvent("packageDeleted", id) - - if id in self.packageCache: - del self.packageCache[id] - - packs = self.packageCache.values() - for pack in packs: - if pack.queue == queue and pack.order > oldorder: - pack.order -= 1 - pack.notifyChange() - - #-------------------------------------------------------------------------- - @lock - @change - def deleteLink(self, id): - """deletes links""" - - f = self.getFile(id) - if not f: - return None - - pid = f.packageid - e = RemoveEvent("file", id, "collector" if not f.package().queue else "queue") - - oldorder = f.order - - if id in self.core.threadManager.processingIds(): - self.cache[id].abortDownload() - - if id in self.cache: - del self.cache[id] - - self.db.deleteLink(f) - - self.core.pullManager.addEvent(e) - - p = self.getPackage(pid) - if not len(p.getChildren()): - p.delete() - - pyfiles = self.cache.values() - for pyfile in pyfiles: - if pyfile.packageid == pid and pyfile.order > oldorder: - pyfile.order -= 1 - pyfile.notifyChange() - - #-------------------------------------------------------------------------- - def releaseLink(self, id): - """removes pyfile from cache""" - if id in self.cache: - del self.cache[id] - - #-------------------------------------------------------------------------- - def releasePackage(self, id): - """removes package from cache""" - if id in self.packageCache: - del self.packageCache[id] - - #-------------------------------------------------------------------------- - def updateLink(self, pyfile): - """updates link""" - self.db.updateLink(pyfile) - - e = UpdateEvent("file", pyfile.id, "collector" if not pyfile.package().queue else "queue") - self.core.pullManager.addEvent(e) - - #-------------------------------------------------------------------------- - def updatePackage(self, pypack): - """updates a package""" - self.db.updatePackage(pypack) - - e = UpdateEvent("pack", pypack.id, "collector" if not pypack.queue else "queue") - self.core.pullManager.addEvent(e) - - #-------------------------------------------------------------------------- - def getPackage(self, id): - """return package instance""" - - if id in self.packageCache: - return self.packageCache[id] - else: - return self.db.getPackage(id) - - #-------------------------------------------------------------------------- - def getPackageData(self, id): - """returns dict with package information""" - pack = self.getPackage(id) - - if not pack: - return None - - pack = pack.toDict()[id] - - data = self.db.getPackageData(id) - - tmplist = [] - - cache = self.cache.values() - for x in cache: - if int(x.toDbDict()[x.id]["package"]) == int(id): - tmplist.append((x.id, x.toDbDict()[x.id])) - data.update(tmplist) - - pack["links"] = data - - return pack - - #-------------------------------------------------------------------------- - def getFileData(self, id): - """returns dict with file information""" - if id in self.cache: - return self.cache[id].toDbDict() - - return self.db.getLinkData(id) - - #-------------------------------------------------------------------------- - def getFile(self, id): - """returns pyfile instance""" - if id in self.cache: - return self.cache[id] - else: - return self.db.getFile(id) - - #-------------------------------------------------------------------------- - @lock - def getJob(self, occ): - """get suitable job""" - - #@TODO clean mess - #@TODO improve selection of valid jobs - - if occ in self.jobCache: - if self.jobCache[occ]: - id = self.jobCache[occ].pop() - if id == "empty": - pyfile = None - self.jobCache[occ].append("empty") - else: - pyfile = self.getFile(id) - else: - jobs = self.db.getJob(occ) - jobs.reverse() - if not jobs: - self.jobCache[occ].append("empty") - pyfile = None - else: - self.jobCache[occ].extend(jobs) - pyfile = self.getFile(self.jobCache[occ].pop()) - - else: - self.jobCache = {} #better not caching to much - jobs = self.db.getJob(occ) - jobs.reverse() - self.jobCache[occ] = jobs - - if not jobs: - self.jobCache[occ].append("empty") - pyfile = None - else: - pyfile = self.getFile(self.jobCache[occ].pop()) - - #@TODO: maybe the new job has to be approved... - - - #pyfile = self.getFile(self.jobCache[occ].pop()) - return pyfile - - @lock - def getDecryptJob(self): - """return job for decrypting""" - if "decrypt" in self.jobCache: - return None - - plugins = self.core.pluginManager.crypterPlugins.keys() + self.core.pluginManager.containerPlugins.keys() - plugins = str(tuple(plugins)) - - jobs = self.db.getPluginJob(plugins) - if jobs: - return self.getFile(jobs[0]) - else: - self.jobCache["decrypt"] = "empty" - return None - - def getFileCount(self): - """returns number of files""" - - if self.filecount == -1: - self.filecount = self.db.filecount(1) - - return self.filecount - - def getQueueCount(self, force=False): - """number of files that have to be processed""" - if self.queuecount == -1 or force: - self.queuecount = self.db.queuecount(1) - - return self.queuecount - - def checkAllLinksFinished(self): - """checks if all files are finished and dispatch event""" - - if not self.getQueueCount(True): - self.core.hookManager.dispatchEvent("allDownloadsFinished") - self.core.log.debug("All downloads finished") - return True - - return False - - def checkAllLinksProcessed(self, fid): - """checks if all files was processed and pyload would idle now, needs fid which will be ignored when counting""" - - # reset count so statistic will update (this is called when dl was processed) - self.resetCount() - - if not self.db.processcount(1, fid): - self.core.hookManager.dispatchEvent("allDownloadsProcessed") - self.core.log.debug("All downloads processed") - return True - - return False - - def resetCount(self): - self.queuecount = -1 - - @lock - @change - def restartPackage(self, id): - """restart package""" - pyfiles = self.cache.values() - for pyfile in pyfiles: - if pyfile.packageid == id: - self.restartFile(pyfile.id) - - self.db.restartPackage(id) - - if id in self.packageCache: - self.packageCache[id].setFinished = False - - e = UpdateEvent("pack", id, "collector" if not self.getPackage(id).queue else "queue") - self.core.pullManager.addEvent(e) - - @lock - @change - def restartFile(self, id): - """ restart file""" - if id in self.cache: - self.cache[id].status = 3 - self.cache[id].name = self.cache[id].url - self.cache[id].error = "" - self.cache[id].abortDownload() - - - self.db.restartFile(id) - - e = UpdateEvent("file", id, "collector" if not self.getFile(id).package().queue else "queue") - self.core.pullManager.addEvent(e) - - @lock - @change - def setPackageLocation(self, id, queue): - """push package to queue""" - - p = self.db.getPackage(id) - oldorder = p.order - - e = RemoveEvent("pack", id, "collector" if not p.queue else "queue") - self.core.pullManager.addEvent(e) - - self.db.clearPackageOrder(p) - - p = self.db.getPackage(id) - - p.queue = queue - self.db.updatePackage(p) - - self.db.reorderPackage(p, -1, True) - - packs = self.packageCache.values() - for pack in packs: - if pack.queue != queue and pack.order > oldorder: - pack.order -= 1 - pack.notifyChange() - - self.db.commit() - self.releasePackage(id) - p = self.getPackage(id) - - e = InsertEvent("pack", id, p.order, "collector" if not p.queue else "queue") - self.core.pullManager.addEvent(e) - - @lock - @change - def reorderPackage(self, id, position): - p = self.getPackage(id) - - e = RemoveEvent("pack", id, "collector" if not p.queue else "queue") - self.core.pullManager.addEvent(e) - self.db.reorderPackage(p, position) - - packs = self.packageCache.values() - for pack in packs: - if pack.queue != p.queue or pack.order < 0 or pack == p: continue - if p.order > position: - if pack.order >= position and pack.order < p.order: - pack.order += 1 - pack.notifyChange() - elif p.order < position: - if pack.order <= position and pack.order > p.order: - pack.order -= 1 - pack.notifyChange() - - p.order = position - self.db.commit() - - e = InsertEvent("pack", id, position, "collector" if not p.queue else "queue") - self.core.pullManager.addEvent(e) - - @lock - @change - def reorderFile(self, id, position): - f = self.getFileData(id) - f = f[id] - - e = RemoveEvent("file", id, "collector" if not self.getPackage(f["package"]).queue else "queue") - self.core.pullManager.addEvent(e) - - self.db.reorderLink(f, position) - - pyfiles = self.cache.values() - for pyfile in pyfiles: - if pyfile.packageid != f["package"] or pyfile.order < 0: continue - if f["order"] > position: - if pyfile.order >= position and pyfile.order < f["order"]: - pyfile.order += 1 - pyfile.notifyChange() - elif f["order"] < position: - if pyfile.order <= position and pyfile.order > f["order"]: - pyfile.order -= 1 - pyfile.notifyChange() - - if id in self.cache: - self.cache[id].order = position - - self.db.commit() - - e = InsertEvent("file", id, position, "collector" if not self.getPackage(f["package"]).queue else "queue") - self.core.pullManager.addEvent(e) - - @change - def updateFileInfo(self, data, pid): - """ updates file info (name, size, status, url)""" - ids = self.db.updateLinkInfo(data) - e = UpdateEvent("pack", pid, "collector" if not self.getPackage(pid).queue else "queue") - self.core.pullManager.addEvent(e) - - def checkPackageFinished(self, pyfile): - """ checks if package is finished and calls hookmanager """ - - ids = self.db.getUnfinished(pyfile.packageid) - if not ids or (pyfile.id in ids and len(ids) == 1): - if not pyfile.package().setFinished: - self.core.log.info(_("Package finished: %s") % pyfile.package().name) - self.core.hookManager.packageFinished(pyfile.package()) - pyfile.package().setFinished = True - - - def reCheckPackage(self, pid): - """ recheck links in package """ - data = self.db.getPackageData(pid) - - urls = [] - - for pyfile in data.itervalues(): - if pyfile["status"] not in (0, 12, 13): - urls.append((pyfile["url"], pyfile["plugin"])) - - self.core.threadManager.createInfoThread(urls, pid) - - @lock - @change - def deleteFinishedLinks(self): - """ deletes finished links and packages, return deleted packages """ - - old_packs = self.getInfoData(0) - old_packs.update(self.getInfoData(1)) - - self.db.deleteFinished() - - new_packs = self.db.getAllPackages(0) - new_packs.update(self.db.getAllPackages(1)) - #get new packages only from db - - deleted = [] - for id in old_packs.iterkeys(): - if id not in new_packs: - deleted.append(id) - self.deletePackage(int(id)) - - return deleted - - @lock - @change - def restartFailed(self): - """ restart all failed links """ - self.db.restartFailed() - -class FileMethods: - @style.queue - def filecount(self, queue): - """returns number of files in queue""" - self.c.execute("SELECT COUNT(*) FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE p.queue=?", (queue,)) - return self.c.fetchone()[0] - - @style.queue - def queuecount(self, queue): - """ number of files in queue not finished yet""" - self.c.execute("SELECT COUNT(*) FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE p.queue=? AND l.status NOT IN (0, 4)", (queue,)) - return self.c.fetchone()[0] - - @style.queue - def processcount(self, queue, fid): - """ number of files which have to be proccessed """ - self.c.execute("SELECT COUNT(*) FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE p.queue=? AND l.status IN (2, 3, 5, 7, 12) AND l.id != ?", (queue, str(fid))) - return self.c.fetchone()[0] - - @style.inner - def _nextPackageOrder(self, queue=0): - self.c.execute('SELECT MAX(packageorder) FROM packages WHERE queue=?', (queue,)) - max = self.c.fetchone()[0] - if max is not None: - return max + 1 - else: - return 0 - - @style.inner - def _nextFileOrder(self, package): - self.c.execute('SELECT MAX(linkorder) FROM links WHERE package=?', (package,)) - max = self.c.fetchone()[0] - if max is not None: - return max + 1 - else: - return 0 - - @style.queue - def addLink(self, url, name, plugin, package): - order = self._nextFileOrder(package) - self.c.execute('INSERT INTO links(url, name, plugin, package, linkorder) VALUES(?,?,?,?,?)', (url, name, plugin, package, order)) - return self.c.lastrowid - - @style.queue - def addLinks(self, links, package): - """ links is a list of tupels (url, plugin)""" - order = self._nextFileOrder(package) - orders = [order + x for x in range(len(links))] - links = [(x[0], x[0], x[1], package, o) for x, o in zip(links, orders)] - self.c.executemany('INSERT INTO links(url, name, plugin, package, linkorder) VALUES(?,?,?,?,?)', links) - - @style.queue - def addPackage(self, name, folder, queue): - order = self._nextPackageOrder(queue) - self.c.execute('INSERT INTO packages(name, folder, queue, packageorder) VALUES(?,?,?,?)', (name, folder, queue, order)) - return self.c.lastrowid - - @style.queue - def deletePackage(self, p): - - self.c.execute('DELETE FROM links WHERE package=?', (str(p.id),)) - self.c.execute('DELETE FROM packages WHERE id=?', (str(p.id),)) - self.c.execute('UPDATE packages SET packageorder=packageorder-1 WHERE packageorder > ? AND queue=?', (p.order, p.queue)) - - @style.queue - def deleteLink(self, f): - - self.c.execute('DELETE FROM links WHERE id=?', (str(f.id),)) - self.c.execute('UPDATE links SET linkorder=linkorder-1 WHERE linkorder > ? AND package=?', (f.order, str(f.packageid))) - - - @style.queue - def getAllLinks(self, q): - """return information about all links in queue q - - q0 queue - q1 collector - - format: - - { - id: {'name': name, ... 'package': id }, ... - } - - """ - self.c.execute('SELECT l.id, l.url, l.name, l.size, l.status, l.error, l.plugin, l.package, l.linkorder FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE p.queue=? ORDER BY l.linkorder', (q,)) - data = {} - for r in self.c: - data[r[0]] = { - 'id': r[0], - 'url': r[1], - 'name': r[2], - 'size': r[3], - 'format_size': formatSize(r[3]), - 'status': r[4], - 'statusmsg': self.manager.statusMsg[r[4]], - 'error': r[5], - 'plugin': r[6], - 'package': r[7], - 'order': r[8], - } - - return data - - @style.queue - def getAllPackages(self, q): - """return information about packages in queue q - (only useful in get all data) - - q0 queue - q1 collector - - format: - - { - id: {'name': name ... 'links': {}}, ... - } - """ - self.c.execute('SELECT p.id, p.name, p.folder, p.site, p.password, p.queue, p.packageorder, s.sizetotal, s.sizedone, s.linksdone, s.linkstotal \ - FROM packages p JOIN pstats s ON p.id = s.id \ - WHERE p.queue=? ORDER BY p.packageorder', str(q)) - - data = {} - for r in self.c: - data[r[0]] = { - 'id': r[0], - 'name': r[1], - 'folder': r[2], - 'site': r[3], - 'password': r[4], - 'queue': r[5], - 'order': r[6], - 'sizetotal': int(r[7]), - 'sizedone': r[8] if r[8] else 0, #these can be None - 'linksdone': r[9] if r[9] else 0, - 'linkstotal': r[10], - 'links': {} - } - - return data - - @style.queue - def getLinkData(self, id): - """get link information as dict""" - self.c.execute('SELECT id, url, name, size, status, error, plugin, package, linkorder FROM links WHERE id=?', (str(id),)) - data = {} - r = self.c.fetchone() - if not r: - return None - data[r[0]] = { - 'id': r[0], - 'url': r[1], - 'name': r[2], - 'size': r[3], - 'format_size': formatSize(r[3]), - 'status': r[4], - 'statusmsg': self.manager.statusMsg[r[4]], - 'error': r[5], - 'plugin': r[6], - 'package': r[7], - 'order': r[8], - } - - return data - - @style.queue - def getPackageData(self, id): - """get data about links for a package""" - self.c.execute('SELECT id, url, name, size, status, error, plugin, package, linkorder FROM links WHERE package=? ORDER BY linkorder', (str(id),)) - - data = {} - for r in self.c: - data[r[0]] = { - 'id': r[0], - 'url': r[1], - 'name': r[2], - 'size': r[3], - 'format_size': formatSize(r[3]), - 'status': r[4], - 'statusmsg': self.manager.statusMsg[r[4]], - 'error': r[5], - 'plugin': r[6], - 'package': r[7], - 'order': r[8], - } - - return data - - - @style.async - def updateLink(self, f): - self.c.execute('UPDATE links SET url=?, name=?, size=?, status=?, error=?, package=? WHERE id=?', (f.url, f.name, f.size, f.status, f.error, str(f.packageid), str(f.id))) - - @style.queue - def updatePackage(self, p): - self.c.execute('UPDATE packages SET name=?, folder=?, site=?, password=?, queue=? WHERE id=?', (p.name, p.folder, p.site, p.password, p.queue, str(p.id))) - - @style.queue - def updateLinkInfo(self, data): - """ data is list of tupels (name, size, status, url) """ - self.c.executemany('UPDATE links SET name=?, size=?, status=? WHERE url=? AND status IN (1, 2, 3, 14)', data) - ids = [] - self.c.execute('SELECT id FROM links WHERE url IN (\'%s\')' % "','".join([x[3] for x in data])) - for r in self.c: - ids.append(int(r[0])) - return ids - - @style.queue - def reorderPackage(self, p, position, noMove=False): - if position == -1: - position = self._nextPackageOrder(p.queue) - if not noMove: - if p.order > position: - self.c.execute('UPDATE packages SET packageorder=packageorder+1 WHERE packageorder >= ? AND packageorder < ? AND queue=? AND packageorder >= 0', (position, p.order, p.queue)) - elif p.order < position: - self.c.execute('UPDATE packages SET packageorder=packageorder-1 WHERE packageorder <= ? AND packageorder > ? AND queue=? AND packageorder >= 0', (position, p.order, p.queue)) - - self.c.execute('UPDATE packages SET packageorder=? WHERE id=?', (position, str(p.id))) - - @style.queue - def reorderLink(self, f, position): - """ reorder link with f as dict for pyfile """ - if f["order"] > position: - self.c.execute('UPDATE links SET linkorder=linkorder+1 WHERE linkorder >= ? AND linkorder < ? AND package=?', (position, f["order"], f["package"])) - elif f["order"] < position: - self.c.execute('UPDATE links SET linkorder=linkorder-1 WHERE linkorder <= ? AND linkorder > ? AND package=?', (position, f["order"], f["package"])) - - self.c.execute('UPDATE links SET linkorder=? WHERE id=?', (position, f["id"])) - - @style.queue - def clearPackageOrder(self, p): - self.c.execute('UPDATE packages SET packageorder=? WHERE id=?', (-1, str(p.id))) - self.c.execute('UPDATE packages SET packageorder=packageorder-1 WHERE packageorder > ? AND queue=? AND id != ?', (p.order, p.queue, str(p.id))) - - @style.async - def restartFile(self, id): - self.c.execute('UPDATE links SET status=3, error="" WHERE id=?', (str(id),)) - - @style.async - def restartPackage(self, id): - self.c.execute('UPDATE links SET status=3 WHERE package=?', (str(id),)) - - @style.queue - def getPackage(self, id): - """return package instance from id""" - self.c.execute("SELECT name, folder, site, password, queue, packageorder FROM packages WHERE id=?", (str(id),)) - r = self.c.fetchone() - if not r: return None - return PyPackage(self.manager, id, * r) - - #-------------------------------------------------------------------------- - @style.queue - def getFile(self, id): - """return link instance from id""" - self.c.execute("SELECT url, name, size, status, error, plugin, package, linkorder FROM links WHERE id=?", (str(id),)) - r = self.c.fetchone() - if not r: return None - return PyFile(self.manager, id, * r) - - - @style.queue - def getJob(self, occ): - """return pyfile ids, which are suitable for download and dont use a occupied plugin""" - - #@TODO improve this hardcoded method - pre = "('DLC', 'LinkList', 'SerienjunkiesOrg', 'CCF', 'RSDF')" #plugins which are processed in collector - - cmd = "(" - for i, item in enumerate(occ): - if i: cmd += ", " - cmd += "'%s'" % item - - cmd += ")" - - cmd = "SELECT l.id FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE ((p.queue=1 AND l.plugin NOT IN %s) OR l.plugin IN %s) AND l.status IN (2, 3, 14) ORDER BY p.packageorder ASC, l.linkorder ASC LIMIT 5" % (cmd, pre) - - self.c.execute(cmd) # very bad! - - return [x[0] for x in self.c] - - @style.queue - def getPluginJob(self, plugins): - """returns pyfile ids with suited plugins""" - cmd = "SELECT l.id FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE l.plugin IN %s AND l.status IN (2, 3, 14) ORDER BY p.packageorder ASC, l.linkorder ASC LIMIT 5" % plugins - - self.c.execute(cmd) # very bad! - - return [x[0] for x in self.c] - - @style.queue - def getUnfinished(self, pid): - """return list of max length 3 ids with pyfiles in package not finished or processed""" - - self.c.execute("SELECT id FROM links WHERE package=? AND status NOT IN (0, 4, 13) LIMIT 3", (str(pid),)) - return [r[0] for r in self.c] - - @style.queue - def deleteFinished(self): - self.c.execute("DELETE FROM links WHERE status IN (0, 4)") - self.c.execute("DELETE FROM packages WHERE NOT EXISTS(SELECT 1 FROM links WHERE packages.id=links.package)") - - @style.queue - def restartFailed(self): - self.c.execute("UPDATE links SET status=3, error='' WHERE status IN (6, 8, 9)") - - @style.queue - def findDuplicates(self, id, folder, filename): - """ checks if filename exists with different id and same package """ - self.c.execute("SELECT l.plugin FROM links as l INNER JOIN packages as p ON l.package=p.id AND p.folder=? WHERE l.id!=? AND l.status=0 AND l.name=?", (folder, id, filename)) - return self.c.fetchone() - - @style.queue - def purgeLinks(self): - self.c.execute("DELETE FROM links;") - self.c.execute("DELETE FROM packages;") - -DatabaseBackend.registerSub(FileMethods) diff --git a/module/database/StorageDatabase.py b/module/database/StorageDatabase.py deleted file mode 100644 index 074d97d3e..000000000 --- a/module/database/StorageDatabase.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- 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 . - - @author: mkaay -""" - -from module.database import style -from module.database import DatabaseBackend - -class StorageMethods: - @style.queue - def setStorage(db, identifier, key, value): - db.c.execute("SELECT id FROM storage WHERE identifier=? AND key=?", (identifier, key)) - if db.c.fetchone() is not None: - db.c.execute("UPDATE storage SET value=? WHERE identifier=? AND key=?", (value, identifier, key)) - else: - db.c.execute("INSERT INTO storage (identifier, key, value) VALUES (?, ?, ?)", (identifier, key, value)) - - @style.queue - def getStorage(db, identifier, key=None): - if key is not None: - db.c.execute("SELECT value FROM storage WHERE identifier=? AND key=?", (identifier, key)) - row = db.c.fetchone() - if row is not None: - return row[0] - else: - db.c.execute("SELECT key, value FROM storage WHERE identifier=?", (identifier,)) - d = {} - for row in db.c: - d[row[0]] = row[1] - return d - - @style.queue - def delStorage(db, identifier, key): - db.c.execute("DELETE FROM storage WHERE identifier=? AND key=?", (identifier, key)) - -DatabaseBackend.registerSub(StorageMethods) diff --git a/module/database/UserDatabase.py b/module/database/UserDatabase.py deleted file mode 100644 index 59b0f6dbf..000000000 --- a/module/database/UserDatabase.py +++ /dev/null @@ -1,108 +0,0 @@ -# -*- 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 . - - @author: mkaay -""" - -from hashlib import sha1 -import random - -from DatabaseBackend import DatabaseBackend -from DatabaseBackend import style - -class UserMethods: - @style.queue - def checkAuth(db, user, password): - c = db.c - c.execute('SELECT id, name, password, role, permission, template, email FROM "users" WHERE name=?', (user,)) - r = c.fetchone() - if not r: - return {} - - salt = r[2][:5] - pw = r[2][5:] - h = sha1(salt + password) - if h.hexdigest() == pw: - return {"id": r[0], "name": r[1], "role": r[3], - "permission": r[4], "template": r[5], "email": r[6]} - else: - return {} - - @style.queue - def addUser(db, user, password): - salt = reduce(lambda x, y: x + y, [str(random.randint(0, 9)) for i in range(0, 5)]) - h = sha1(salt + password) - password = salt + h.hexdigest() - - c = db.c - c.execute('SELECT name FROM users WHERE name=?', (user,)) - if c.fetchone() is not None: - c.execute('UPDATE users SET password=? WHERE name=?', (password, user)) - else: - c.execute('INSERT INTO users (name, password) VALUES (?, ?)', (user, password)) - - - @style.queue - def changePassword(db, user, oldpw, newpw): - db.c.execute('SELECT id, name, password FROM users WHERE name=?', (user,)) - r = db.c.fetchone() - if not r: - return False - - salt = r[2][:5] - pw = r[2][5:] - h = sha1(salt + oldpw) - if h.hexdigest() == pw: - salt = reduce(lambda x, y: x + y, [str(random.randint(0, 9)) for i in range(0, 5)]) - h = sha1(salt + newpw) - password = salt + h.hexdigest() - - db.c.execute("UPDATE users SET password=? WHERE name=?", (password, user)) - return True - - return False - - - @style.async - def setPermission(db, user, perms): - db.c.execute("UPDATE users SET permission=? WHERE name=?", (perms, user)) - - @style.async - def setRole(db, user, role): - db.c.execute("UPDATE users SET role=? WHERE name=?", (role, user)) - - - @style.queue - def listUsers(db): - db.c.execute('SELECT name FROM users') - users = [] - for row in db.c: - users.append(row[0]) - return users - - @style.queue - def getAllUserData(db): - db.c.execute("SELECT name, permission, role, template, email FROM users") - user = {} - for r in db.c: - user[r[0]] = {"permission": r[1], "role": r[2], "template": r[3], "email": r[4]} - - return user - - @style.queue - def removeUser(db, user): - db.c.execute('DELETE FROM users WHERE name=?', (user,)) - -DatabaseBackend.registerSub(UserMethods) diff --git a/module/database/__init__.py b/module/database/__init__.py deleted file mode 100644 index 5f287a47f..000000000 --- a/module/database/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- - -from DatabaseBackend import DatabaseBackend -from DatabaseBackend import style - -from FileDatabase import FileHandler -from UserDatabase import UserMethods -from StorageDatabase import StorageMethods diff --git a/module/debug.py b/module/debug.py deleted file mode 100644 index 54a159e78..000000000 --- a/module/debug.py +++ /dev/null @@ -1,94 +0,0 @@ -#coding:utf-8 - -import re -import InitHomeDir -from os import listdir - -class Wrapper(object): - pass - -def filter_info(line): - if "object at 0x" in line: - return False - elif " at line " in line: - return False - elif " . - - @author: RaNaN -""" - -from sys import argv -from sys import exit - -import socket -import thread - -from traceback import print_exc - -class Forwarder: - - def __init__(self, extip, extport=9666): - print "Start portforwarding to %s:%s" % (extip, extport) - proxy(extip, extport, 9666) - - -def proxy(*settings): - while True: - server(*settings) - -def server(*settings): - try: - dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - dock_socket.bind(("127.0.0.1", settings[2])) - dock_socket.listen(5) - while True: - client_socket = dock_socket.accept()[0] - server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - server_socket.connect((settings[0], settings[1])) - thread.start_new_thread(forward, (client_socket, server_socket)) - thread.start_new_thread(forward, (server_socket, client_socket)) - except Exception: - print_exc() - -def forward(source, destination): - string = ' ' - while string: - string = source.recv(1024) - if string: - destination.sendall(string) - else: - #source.shutdown(socket.SHUT_RD) - destination.shutdown(socket.SHUT_WR) diff --git a/module/lib/BeautifulSoup.py b/module/lib/BeautifulSoup.py deleted file mode 100644 index 7278215ca..000000000 --- a/module/lib/BeautifulSoup.py +++ /dev/null @@ -1,2017 +0,0 @@ -"""Beautiful Soup -Elixir and Tonic -"The Screen-Scraper's Friend" -http://www.crummy.com/software/BeautifulSoup/ - -Beautiful Soup parses a (possibly invalid) XML or HTML document into a -tree representation. It provides methods and Pythonic idioms that make -it easy to navigate, search, and modify the tree. - -A well-formed XML/HTML document yields a well-formed data -structure. An ill-formed XML/HTML document yields a correspondingly -ill-formed data structure. If your document is only locally -well-formed, you can use this library to find and process the -well-formed part of it. - -Beautiful Soup works with Python 2.2 and up. It has no external -dependencies, but you'll have more success at converting data to UTF-8 -if you also install these three packages: - -* chardet, for auto-detecting character encodings - http://chardet.feedparser.org/ -* cjkcodecs and iconv_codec, which add more encodings to the ones supported - by stock Python. - http://cjkpython.i18n.org/ - -Beautiful Soup defines classes for two main parsing strategies: - - * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific - language that kind of looks like XML. - - * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid - or invalid. This class has web browser-like heuristics for - obtaining a sensible parse tree in the face of common HTML errors. - -Beautiful Soup also defines a class (UnicodeDammit) for autodetecting -the encoding of an HTML or XML document, and converting it to -Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser. - -For more than you ever wanted to know about Beautiful Soup, see the -documentation: -http://www.crummy.com/software/BeautifulSoup/documentation.html - -Here, have some legalese: - -Copyright (c) 2004-2010, Leonard Richardson - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * Neither the name of the the Beautiful Soup Consortium and All - Night Kosher Bakery nor the names of its contributors may be - used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE, DAMMIT. - -""" -from __future__ import generators - -__author__ = "Leonard Richardson (leonardr@segfault.org)" -__version__ = "3.2.1" -__copyright__ = "Copyright (c) 2004-2012 Leonard Richardson" -__license__ = "New-style BSD" - -from sgmllib import SGMLParser, SGMLParseError -import codecs -import markupbase -import types -import re -import sgmllib -try: - from htmlentitydefs import name2codepoint -except ImportError: - name2codepoint = {} -try: - set -except NameError: - from sets import Set as set - -#These hacks make Beautiful Soup able to parse XML with namespaces -sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') -markupbase._declname_match = re.compile(r'[a-zA-Z][-_.:a-zA-Z0-9]*\s*').match - -DEFAULT_OUTPUT_ENCODING = "utf-8" - -def _match_css_class(str): - """Build a RE to match the given CSS class.""" - return re.compile(r"(^|.*\s)%s($|\s)" % str) - -# First, the classes that represent markup elements. - -class PageElement(object): - """Contains the navigational information for some part of the page - (either a tag or a piece of text)""" - - def _invert(h): - "Cheap function to invert a hash." - i = {} - for k,v in h.items(): - i[v] = k - return i - - XML_ENTITIES_TO_SPECIAL_CHARS = { "apos" : "'", - "quot" : '"', - "amp" : "&", - "lt" : "<", - "gt" : ">" } - - XML_SPECIAL_CHARS_TO_ENTITIES = _invert(XML_ENTITIES_TO_SPECIAL_CHARS) - - def setup(self, parent=None, previous=None): - """Sets up the initial relations between this element and - other elements.""" - self.parent = parent - self.previous = previous - self.next = None - self.previousSibling = None - self.nextSibling = None - if self.parent and self.parent.contents: - self.previousSibling = self.parent.contents[-1] - self.previousSibling.nextSibling = self - - def replaceWith(self, replaceWith): - oldParent = self.parent - myIndex = self.parent.index(self) - if hasattr(replaceWith, "parent")\ - and replaceWith.parent is self.parent: - # We're replacing this element with one of its siblings. - index = replaceWith.parent.index(replaceWith) - if index and index < myIndex: - # Furthermore, it comes before this element. That - # means that when we extract it, the index of this - # element will change. - myIndex = myIndex - 1 - self.extract() - oldParent.insert(myIndex, replaceWith) - - def replaceWithChildren(self): - myParent = self.parent - myIndex = self.parent.index(self) - self.extract() - reversedChildren = list(self.contents) - reversedChildren.reverse() - for child in reversedChildren: - myParent.insert(myIndex, child) - - def extract(self): - """Destructively rips this element out of the tree.""" - if self.parent: - try: - del self.parent.contents[self.parent.index(self)] - except ValueError: - pass - - #Find the two elements that would be next to each other if - #this element (and any children) hadn't been parsed. Connect - #the two. - lastChild = self._lastRecursiveChild() - nextElement = lastChild.next - - if self.previous: - self.previous.next = nextElement - if nextElement: - nextElement.previous = self.previous - self.previous = None - lastChild.next = None - - self.parent = None - if self.previousSibling: - self.previousSibling.nextSibling = self.nextSibling - if self.nextSibling: - self.nextSibling.previousSibling = self.previousSibling - self.previousSibling = self.nextSibling = None - return self - - def _lastRecursiveChild(self): - "Finds the last element beneath this object to be parsed." - lastChild = self - while hasattr(lastChild, 'contents') and lastChild.contents: - lastChild = lastChild.contents[-1] - return lastChild - - def insert(self, position, newChild): - if isinstance(newChild, basestring) \ - and not isinstance(newChild, NavigableString): - newChild = NavigableString(newChild) - - position = min(position, len(self.contents)) - if hasattr(newChild, 'parent') and newChild.parent is not None: - # We're 'inserting' an element that's already one - # of this object's children. - if newChild.parent is self: - index = self.index(newChild) - if index > position: - # Furthermore we're moving it further down the - # list of this object's children. That means that - # when we extract this element, our target index - # will jump down one. - position = position - 1 - newChild.extract() - - newChild.parent = self - previousChild = None - if position == 0: - newChild.previousSibling = None - newChild.previous = self - else: - previousChild = self.contents[position-1] - newChild.previousSibling = previousChild - newChild.previousSibling.nextSibling = newChild - newChild.previous = previousChild._lastRecursiveChild() - if newChild.previous: - newChild.previous.next = newChild - - newChildsLastElement = newChild._lastRecursiveChild() - - if position >= len(self.contents): - newChild.nextSibling = None - - parent = self - parentsNextSibling = None - while not parentsNextSibling: - parentsNextSibling = parent.nextSibling - parent = parent.parent - if not parent: # This is the last element in the document. - break - if parentsNextSibling: - newChildsLastElement.next = parentsNextSibling - else: - newChildsLastElement.next = None - else: - nextChild = self.contents[position] - newChild.nextSibling = nextChild - if newChild.nextSibling: - newChild.nextSibling.previousSibling = newChild - newChildsLastElement.next = nextChild - - if newChildsLastElement.next: - newChildsLastElement.next.previous = newChildsLastElement - self.contents.insert(position, newChild) - - def append(self, tag): - """Appends the given tag to the contents of this tag.""" - self.insert(len(self.contents), tag) - - def findNext(self, name=None, attrs={}, text=None, **kwargs): - """Returns the first item that matches the given criteria and - appears after this Tag in the document.""" - return self._findOne(self.findAllNext, name, attrs, text, **kwargs) - - def findAllNext(self, name=None, attrs={}, text=None, limit=None, - **kwargs): - """Returns all items that match the given criteria and appear - after this Tag in the document.""" - return self._findAll(name, attrs, text, limit, self.nextGenerator, - **kwargs) - - def findNextSibling(self, name=None, attrs={}, text=None, **kwargs): - """Returns the closest sibling to this Tag that matches the - given criteria and appears after this Tag in the document.""" - return self._findOne(self.findNextSiblings, name, attrs, text, - **kwargs) - - def findNextSiblings(self, name=None, attrs={}, text=None, limit=None, - **kwargs): - """Returns the siblings of this Tag that match the given - criteria and appear after this Tag in the document.""" - return self._findAll(name, attrs, text, limit, - self.nextSiblingGenerator, **kwargs) - fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x - - def findPrevious(self, name=None, attrs={}, text=None, **kwargs): - """Returns the first item that matches the given criteria and - appears before this Tag in the document.""" - return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs) - - def findAllPrevious(self, name=None, attrs={}, text=None, limit=None, - **kwargs): - """Returns all items that match the given criteria and appear - before this Tag in the document.""" - return self._findAll(name, attrs, text, limit, self.previousGenerator, - **kwargs) - fetchPrevious = findAllPrevious # Compatibility with pre-3.x - - def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs): - """Returns the closest sibling to this Tag that matches the - given criteria and appears before this Tag in the document.""" - return self._findOne(self.findPreviousSiblings, name, attrs, text, - **kwargs) - - def findPreviousSiblings(self, name=None, attrs={}, text=None, - limit=None, **kwargs): - """Returns the siblings of this Tag that match the given - criteria and appear before this Tag in the document.""" - return self._findAll(name, attrs, text, limit, - self.previousSiblingGenerator, **kwargs) - fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x - - def findParent(self, name=None, attrs={}, **kwargs): - """Returns the closest parent of this Tag that matches the given - criteria.""" - # NOTE: We can't use _findOne because findParents takes a different - # set of arguments. - r = None - l = self.findParents(name, attrs, 1) - if l: - r = l[0] - return r - - def findParents(self, name=None, attrs={}, limit=None, **kwargs): - """Returns the parents of this Tag that match the given - criteria.""" - - return self._findAll(name, attrs, None, limit, self.parentGenerator, - **kwargs) - fetchParents = findParents # Compatibility with pre-3.x - - #These methods do the real heavy lifting. - - def _findOne(self, method, name, attrs, text, **kwargs): - r = None - l = method(name, attrs, text, 1, **kwargs) - if l: - r = l[0] - return r - - def _findAll(self, name, attrs, text, limit, generator, **kwargs): - "Iterates over a generator looking for things that match." - - if isinstance(name, SoupStrainer): - strainer = name - # (Possibly) special case some findAll*(...) searches - elif text is None and not limit and not attrs and not kwargs: - # findAll*(True) - if name is True: - return [element for element in generator() - if isinstance(element, Tag)] - # findAll*('tag-name') - elif isinstance(name, basestring): - return [element for element in generator() - if isinstance(element, Tag) and - element.name == name] - else: - strainer = SoupStrainer(name, attrs, text, **kwargs) - # Build a SoupStrainer - else: - strainer = SoupStrainer(name, attrs, text, **kwargs) - results = ResultSet(strainer) - g = generator() - while True: - try: - i = g.next() - except StopIteration: - break - if i: - found = strainer.search(i) - if found: - results.append(found) - if limit and len(results) >= limit: - break - return results - - #These Generators can be used to navigate starting from both - #NavigableStrings and Tags. - def nextGenerator(self): - i = self - while i is not None: - i = i.next - yield i - - def nextSiblingGenerator(self): - i = self - while i is not None: - i = i.nextSibling - yield i - - def previousGenerator(self): - i = self - while i is not None: - i = i.previous - yield i - - def previousSiblingGenerator(self): - i = self - while i is not None: - i = i.previousSibling - yield i - - def parentGenerator(self): - i = self - while i is not None: - i = i.parent - yield i - - # Utility methods - def substituteEncoding(self, str, encoding=None): - encoding = encoding or "utf-8" - return str.replace("%SOUP-ENCODING%", encoding) - - def toEncoding(self, s, encoding=None): - """Encodes an object to a string in some encoding, or to Unicode. - .""" - if isinstance(s, unicode): - if encoding: - s = s.encode(encoding) - elif isinstance(s, str): - if encoding: - s = s.encode(encoding) - else: - s = unicode(s) - else: - if encoding: - s = self.toEncoding(str(s), encoding) - else: - s = unicode(s) - return s - - BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|" - + "&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)" - + ")") - - def _sub_entity(self, x): - """Used with a regular expression to substitute the - appropriate XML entity for an XML special character.""" - return "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";" - - -class NavigableString(unicode, PageElement): - - def __new__(cls, value): - """Create a new NavigableString. - - When unpickling a NavigableString, this method is called with - the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be - passed in to the superclass's __new__ or the superclass won't know - how to handle non-ASCII characters. - """ - if isinstance(value, unicode): - return unicode.__new__(cls, value) - return unicode.__new__(cls, value, DEFAULT_OUTPUT_ENCODING) - - def __getnewargs__(self): - return (NavigableString.__str__(self),) - - def __getattr__(self, attr): - """text.string gives you text. This is for backwards - compatibility for Navigable*String, but for CData* it lets you - get the string without the CData wrapper.""" - if attr == 'string': - return self - else: - raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr) - - def __unicode__(self): - return str(self).decode(DEFAULT_OUTPUT_ENCODING) - - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - # Substitute outgoing XML entities. - data = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, self) - if encoding: - return data.encode(encoding) - else: - return data - -class CData(NavigableString): - - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - return "" % NavigableString.__str__(self, encoding) - -class ProcessingInstruction(NavigableString): - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - output = self - if "%SOUP-ENCODING%" in output: - output = self.substituteEncoding(output, encoding) - return "" % self.toEncoding(output, encoding) - -class Comment(NavigableString): - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - return "" % NavigableString.__str__(self, encoding) - -class Declaration(NavigableString): - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - return "" % NavigableString.__str__(self, encoding) - -class Tag(PageElement): - - """Represents a found HTML tag with its attributes and contents.""" - - def _convertEntities(self, match): - """Used in a call to re.sub to replace HTML, XML, and numeric - entities with the appropriate Unicode characters. If HTML - entities are being converted, any unrecognized entities are - escaped.""" - x = match.group(1) - if self.convertHTMLEntities and x in name2codepoint: - return unichr(name2codepoint[x]) - elif x in self.XML_ENTITIES_TO_SPECIAL_CHARS: - if self.convertXMLEntities: - return self.XML_ENTITIES_TO_SPECIAL_CHARS[x] - else: - return u'&%s;' % x - elif len(x) > 0 and x[0] == '#': - # Handle numeric entities - if len(x) > 1 and x[1] == 'x': - return unichr(int(x[2:], 16)) - else: - return unichr(int(x[1:])) - - elif self.escapeUnrecognizedEntities: - return u'&%s;' % x - else: - return u'&%s;' % x - - def __init__(self, parser, name, attrs=None, parent=None, - previous=None): - "Basic constructor." - - # We don't actually store the parser object: that lets extracted - # chunks be garbage-collected - self.parserClass = parser.__class__ - self.isSelfClosing = parser.isSelfClosingTag(name) - self.name = name - if attrs is None: - attrs = [] - elif isinstance(attrs, dict): - attrs = attrs.items() - self.attrs = attrs - self.contents = [] - self.setup(parent, previous) - self.hidden = False - self.containsSubstitutions = False - self.convertHTMLEntities = parser.convertHTMLEntities - self.convertXMLEntities = parser.convertXMLEntities - self.escapeUnrecognizedEntities = parser.escapeUnrecognizedEntities - - # Convert any HTML, XML, or numeric entities in the attribute values. - convert = lambda(k, val): (k, - re.sub("&(#\d+|#x[0-9a-fA-F]+|\w+);", - self._convertEntities, - val)) - self.attrs = map(convert, self.attrs) - - def getString(self): - if (len(self.contents) == 1 - and isinstance(self.contents[0], NavigableString)): - return self.contents[0] - - def setString(self, string): - """Replace the contents of the tag with a string""" - self.clear() - self.append(string) - - string = property(getString, setString) - - def getText(self, separator=u""): - if not len(self.contents): - return u"" - stopNode = self._lastRecursiveChild().next - strings = [] - current = self.contents[0] - while current is not stopNode: - if isinstance(current, NavigableString): - strings.append(current.strip()) - current = current.next - return separator.join(strings) - - text = property(getText) - - def get(self, key, default=None): - """Returns the value of the 'key' attribute for the tag, or - the value given for 'default' if it doesn't have that - attribute.""" - return self._getAttrMap().get(key, default) - - def clear(self): - """Extract all children.""" - for child in self.contents[:]: - child.extract() - - def index(self, element): - for i, child in enumerate(self.contents): - if child is element: - return i - raise ValueError("Tag.index: element not in tag") - - def has_key(self, key): - return self._getAttrMap().has_key(key) - - def __getitem__(self, key): - """tag[key] returns the value of the 'key' attribute for the tag, - and throws an exception if it's not there.""" - return self._getAttrMap()[key] - - def __iter__(self): - "Iterating over a tag iterates over its contents." - return iter(self.contents) - - def __len__(self): - "The length of a tag is the length of its list of contents." - return len(self.contents) - - def __contains__(self, x): - return x in self.contents - - def __nonzero__(self): - "A tag is non-None even if it has no contents." - return True - - def __setitem__(self, key, value): - """Setting tag[key] sets the value of the 'key' attribute for the - tag.""" - self._getAttrMap() - self.attrMap[key] = value - found = False - for i in range(0, len(self.attrs)): - if self.attrs[i][0] == key: - self.attrs[i] = (key, value) - found = True - if not found: - self.attrs.append((key, value)) - self._getAttrMap()[key] = value - - def __delitem__(self, key): - "Deleting tag[key] deletes all 'key' attributes for the tag." - for item in self.attrs: - if item[0] == key: - self.attrs.remove(item) - #We don't break because bad HTML can define the same - #attribute multiple times. - self._getAttrMap() - if self.attrMap.has_key(key): - del self.attrMap[key] - - def __call__(self, *args, **kwargs): - """Calling a tag like a function is the same as calling its - findAll() method. Eg. tag('a') returns a list of all the A tags - found within this tag.""" - return apply(self.findAll, args, kwargs) - - def __getattr__(self, tag): - #print "Getattr %s.%s" % (self.__class__, tag) - if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3: - return self.find(tag[:-3]) - elif tag.find('__') != 0: - return self.find(tag) - raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__, tag) - - def __eq__(self, other): - """Returns true iff this tag has the same name, the same attributes, - and the same contents (recursively) as the given tag. - - NOTE: right now this will return false if two tags have the - same attributes in a different order. Should this be fixed?""" - if other is self: - return True - if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other): - return False - for i in range(0, len(self.contents)): - if self.contents[i] != other.contents[i]: - return False - return True - - def __ne__(self, other): - """Returns true iff this tag is not identical to the other tag, - as defined in __eq__.""" - return not self == other - - def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING): - """Renders this tag as a string.""" - return self.__str__(encoding) - - def __unicode__(self): - return self.__str__(None) - - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING, - prettyPrint=False, indentLevel=0): - """Returns a string or Unicode representation of this tag and - its contents. To get Unicode, pass None for encoding. - - NOTE: since Python's HTML parser consumes whitespace, this - method is not certain to reproduce the whitespace present in - the original string.""" - - encodedName = self.toEncoding(self.name, encoding) - - attrs = [] - if self.attrs: - for key, val in self.attrs: - fmt = '%s="%s"' - if isinstance(val, basestring): - if self.containsSubstitutions and '%SOUP-ENCODING%' in val: - val = self.substituteEncoding(val, encoding) - - # The attribute value either: - # - # * Contains no embedded double quotes or single quotes. - # No problem: we enclose it in double quotes. - # * Contains embedded single quotes. No problem: - # double quotes work here too. - # * Contains embedded double quotes. No problem: - # we enclose it in single quotes. - # * Embeds both single _and_ double quotes. This - # can't happen naturally, but it can happen if - # you modify an attribute value after parsing - # the document. Now we have a bit of a - # problem. We solve it by enclosing the - # attribute in single quotes, and escaping any - # embedded single quotes to XML entities. - if '"' in val: - fmt = "%s='%s'" - if "'" in val: - # TODO: replace with apos when - # appropriate. - val = val.replace("'", "&squot;") - - # Now we're okay w/r/t quotes. But the attribute - # value might also contain angle brackets, or - # ampersands that aren't part of entities. We need - # to escape those to XML entities too. - val = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, val) - - attrs.append(fmt % (self.toEncoding(key, encoding), - self.toEncoding(val, encoding))) - close = '' - closeTag = '' - if self.isSelfClosing: - close = ' /' - else: - closeTag = '' % encodedName - - indentTag, indentContents = 0, 0 - if prettyPrint: - indentTag = indentLevel - space = (' ' * (indentTag-1)) - indentContents = indentTag + 1 - contents = self.renderContents(encoding, prettyPrint, indentContents) - if self.hidden: - s = contents - else: - s = [] - attributeString = '' - if attrs: - attributeString = ' ' + ' '.join(attrs) - if prettyPrint: - s.append(space) - s.append('<%s%s%s>' % (encodedName, attributeString, close)) - if prettyPrint: - s.append("\n") - s.append(contents) - if prettyPrint and contents and contents[-1] != "\n": - s.append("\n") - if prettyPrint and closeTag: - s.append(space) - s.append(closeTag) - if prettyPrint and closeTag and self.nextSibling: - s.append("\n") - s = ''.join(s) - return s - - def decompose(self): - """Recursively destroys the contents of this tree.""" - self.extract() - if len(self.contents) == 0: - return - current = self.contents[0] - while current is not None: - next = current.next - if isinstance(current, Tag): - del current.contents[:] - current.parent = None - current.previous = None - current.previousSibling = None - current.next = None - current.nextSibling = None - current = next - - def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING): - return self.__str__(encoding, True) - - def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING, - prettyPrint=False, indentLevel=0): - """Renders the contents of this tag as a string in the given - encoding. If encoding is None, returns a Unicode string..""" - s=[] - for c in self: - text = None - if isinstance(c, NavigableString): - text = c.__str__(encoding) - elif isinstance(c, Tag): - s.append(c.__str__(encoding, prettyPrint, indentLevel)) - if text and prettyPrint: - text = text.strip() - if text: - if prettyPrint: - s.append(" " * (indentLevel-1)) - s.append(text) - if prettyPrint: - s.append("\n") - return ''.join(s) - - #Soup methods - - def find(self, name=None, attrs={}, recursive=True, text=None, - **kwargs): - """Return only the first child of this Tag matching the given - criteria.""" - r = None - l = self.findAll(name, attrs, recursive, text, 1, **kwargs) - if l: - r = l[0] - return r - findChild = find - - def findAll(self, name=None, attrs={}, recursive=True, text=None, - limit=None, **kwargs): - """Extracts a list of Tag objects that match the given - criteria. You can specify the name of the Tag and any - attributes you want the Tag to have. - - The value of a key-value pair in the 'attrs' map can be a - string, a list of strings, a regular expression object, or a - callable that takes a string and returns whether or not the - string matches for some custom definition of 'matches'. The - same is true of the tag name.""" - generator = self.recursiveChildGenerator - if not recursive: - generator = self.childGenerator - return self._findAll(name, attrs, text, limit, generator, **kwargs) - findChildren = findAll - - # Pre-3.x compatibility methods - first = find - fetch = findAll - - def fetchText(self, text=None, recursive=True, limit=None): - return self.findAll(text=text, recursive=recursive, limit=limit) - - def firstText(self, text=None, recursive=True): - return self.find(text=text, recursive=recursive) - - #Private methods - - def _getAttrMap(self): - """Initializes a map representation of this tag's attributes, - if not already initialized.""" - if not getattr(self, 'attrMap'): - self.attrMap = {} - for (key, value) in self.attrs: - self.attrMap[key] = value - return self.attrMap - - #Generator methods - def childGenerator(self): - # Just use the iterator from the contents - return iter(self.contents) - - def recursiveChildGenerator(self): - if not len(self.contents): - raise StopIteration - stopNode = self._lastRecursiveChild().next - current = self.contents[0] - while current is not stopNode: - yield current - current = current.next - - -# Next, a couple classes to represent queries and their results. -class SoupStrainer: - """Encapsulates a number of ways of matching a markup element (tag or - text).""" - - def __init__(self, name=None, attrs={}, text=None, **kwargs): - self.name = name - if isinstance(attrs, basestring): - kwargs['class'] = _match_css_class(attrs) - attrs = None - if kwargs: - if attrs: - attrs = attrs.copy() - attrs.update(kwargs) - else: - attrs = kwargs - self.attrs = attrs - self.text = text - - def __str__(self): - if self.text: - return self.text - else: - return "%s|%s" % (self.name, self.attrs) - - def searchTag(self, markupName=None, markupAttrs={}): - found = None - markup = None - if isinstance(markupName, Tag): - markup = markupName - markupAttrs = markup - callFunctionWithTagData = callable(self.name) \ - and not isinstance(markupName, Tag) - - if (not self.name) \ - or callFunctionWithTagData \ - or (markup and self._matches(markup, self.name)) \ - or (not markup and self._matches(markupName, self.name)): - if callFunctionWithTagData: - match = self.name(markupName, markupAttrs) - else: - match = True - markupAttrMap = None - for attr, matchAgainst in self.attrs.items(): - if not markupAttrMap: - if hasattr(markupAttrs, 'get'): - markupAttrMap = markupAttrs - else: - markupAttrMap = {} - for k,v in markupAttrs: - markupAttrMap[k] = v - attrValue = markupAttrMap.get(attr) - if not self._matches(attrValue, matchAgainst): - match = False - break - if match: - if markup: - found = markup - else: - found = markupName - return found - - def search(self, markup): - #print 'looking for %s in %s' % (self, markup) - found = None - # If given a list of items, scan it for a text element that - # matches. - if hasattr(markup, "__iter__") \ - and not isinstance(markup, Tag): - for element in markup: - if isinstance(element, NavigableString) \ - and self.search(element): - found = element - break - # If it's a Tag, make sure its name or attributes match. - # Don't bother with Tags if we're searching for text. - elif isinstance(markup, Tag): - if not self.text: - found = self.searchTag(markup) - # If it's text, make sure the text matches. - elif isinstance(markup, NavigableString) or \ - isinstance(markup, basestring): - if self._matches(markup, self.text): - found = markup - else: - raise Exception, "I don't know how to match against a %s" \ - % markup.__class__ - return found - - def _matches(self, markup, matchAgainst): - #print "Matching %s against %s" % (markup, matchAgainst) - result = False - if matchAgainst is True: - result = markup is not None - elif callable(matchAgainst): - result = matchAgainst(markup) - else: - #Custom match methods take the tag as an argument, but all - #other ways of matching match the tag name as a string. - if isinstance(markup, Tag): - markup = markup.name - if markup and not isinstance(markup, basestring): - markup = unicode(markup) - #Now we know that chunk is either a string, or None. - if hasattr(matchAgainst, 'match'): - # It's a regexp object. - result = markup and matchAgainst.search(markup) - elif hasattr(matchAgainst, '__iter__'): # list-like - result = markup in matchAgainst - elif hasattr(matchAgainst, 'items'): - result = markup.has_key(matchAgainst) - elif matchAgainst and isinstance(markup, basestring): - if isinstance(markup, unicode): - matchAgainst = unicode(matchAgainst) - else: - matchAgainst = str(matchAgainst) - - if not result: - result = matchAgainst == markup - return result - -class ResultSet(list): - """A ResultSet is just a list that keeps track of the SoupStrainer - that created it.""" - def __init__(self, source): - list.__init__([]) - self.source = source - -# Now, some helper functions. - -def buildTagMap(default, *args): - """Turns a list of maps, lists, or scalars into a single map. - Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and - NESTING_RESET_TAGS maps out of lists and partial maps.""" - built = {} - for portion in args: - if hasattr(portion, 'items'): - #It's a map. Merge it. - for k,v in portion.items(): - built[k] = v - elif hasattr(portion, '__iter__'): # is a list - #It's a list. Map each item to the default. - for k in portion: - built[k] = default - else: - #It's a scalar. Map it to the default. - built[portion] = default - return built - -# Now, the parser classes. - -class BeautifulStoneSoup(Tag, SGMLParser): - - """This class contains the basic parser and search code. It defines - a parser that knows nothing about tag behavior except for the - following: - - You can't close a tag without closing all the tags it encloses. - That is, "" actually means - "". - - [Another possible explanation is "", but since - this class defines no SELF_CLOSING_TAGS, it will never use that - explanation.] - - This class is useful for parsing XML or made-up markup languages, - or when BeautifulSoup makes an assumption counter to what you were - expecting.""" - - SELF_CLOSING_TAGS = {} - NESTABLE_TAGS = {} - RESET_NESTING_TAGS = {} - QUOTE_TAGS = {} - PRESERVE_WHITESPACE_TAGS = [] - - MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'), - lambda x: x.group(1) + ' />'), - (re.compile(']*)>'), - lambda x: '') - ] - - ROOT_TAG_NAME = u'[document]' - - HTML_ENTITIES = "html" - XML_ENTITIES = "xml" - XHTML_ENTITIES = "xhtml" - # TODO: This only exists for backwards-compatibility - ALL_ENTITIES = XHTML_ENTITIES - - # Used when determining whether a text node is all whitespace and - # can be replaced with a single space. A text node that contains - # fancy Unicode spaces (usually non-breaking) should be left - # alone. - STRIP_ASCII_SPACES = { 9: None, 10: None, 12: None, 13: None, 32: None, } - - def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None, - markupMassage=True, smartQuotesTo=XML_ENTITIES, - convertEntities=None, selfClosingTags=None, isHTML=False): - """The Soup object is initialized as the 'root tag', and the - provided markup (which can be a string or a file-like object) - is fed into the underlying parser. - - sgmllib will process most bad HTML, and the BeautifulSoup - class has some tricks for dealing with some HTML that kills - sgmllib, but Beautiful Soup can nonetheless choke or lose data - if your data uses self-closing tags or declarations - incorrectly. - - By default, Beautiful Soup uses regexes to sanitize input, - avoiding the vast majority of these problems. If the problems - don't apply to you, pass in False for markupMassage, and - you'll get better performance. - - The default parser massage techniques fix the two most common - instances of invalid HTML that choke sgmllib: - -
(No space between name of closing tag and tag close) - (Extraneous whitespace in declaration) - - You can pass in a custom list of (RE object, replace method) - tuples to get Beautiful Soup to scrub your input the way you - want.""" - - self.parseOnlyThese = parseOnlyThese - self.fromEncoding = fromEncoding - self.smartQuotesTo = smartQuotesTo - self.convertEntities = convertEntities - # Set the rules for how we'll deal with the entities we - # encounter - if self.convertEntities: - # It doesn't make sense to convert encoded characters to - # entities even while you're converting entities to Unicode. - # Just convert it all to Unicode. - self.smartQuotesTo = None - if convertEntities == self.HTML_ENTITIES: - self.convertXMLEntities = False - self.convertHTMLEntities = True - self.escapeUnrecognizedEntities = True - elif convertEntities == self.XHTML_ENTITIES: - self.convertXMLEntities = True - self.convertHTMLEntities = True - self.escapeUnrecognizedEntities = False - elif convertEntities == self.XML_ENTITIES: - self.convertXMLEntities = True - self.convertHTMLEntities = False - self.escapeUnrecognizedEntities = False - else: - self.convertXMLEntities = False - self.convertHTMLEntities = False - self.escapeUnrecognizedEntities = False - - self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags) - SGMLParser.__init__(self) - - if hasattr(markup, 'read'): # It's a file-type object. - markup = markup.read() - self.markup = markup - self.markupMassage = markupMassage - try: - self._feed(isHTML=isHTML) - except StopParsing: - pass - self.markup = None # The markup can now be GCed - - def convert_charref(self, name): - """This method fixes a bug in Python's SGMLParser.""" - try: - n = int(name) - except ValueError: - return - if not 0 <= n <= 127 : # ASCII ends at 127, not 255 - return - return self.convert_codepoint(n) - - def _feed(self, inDocumentEncoding=None, isHTML=False): - # Convert the document to Unicode. - markup = self.markup - if isinstance(markup, unicode): - if not hasattr(self, 'originalEncoding'): - self.originalEncoding = None - else: - dammit = UnicodeDammit\ - (markup, [self.fromEncoding, inDocumentEncoding], - smartQuotesTo=self.smartQuotesTo, isHTML=isHTML) - markup = dammit.unicode - self.originalEncoding = dammit.originalEncoding - self.declaredHTMLEncoding = dammit.declaredHTMLEncoding - if markup: - if self.markupMassage: - if not hasattr(self.markupMassage, "__iter__"): - self.markupMassage = self.MARKUP_MASSAGE - for fix, m in self.markupMassage: - markup = fix.sub(m, markup) - # TODO: We get rid of markupMassage so that the - # soup object can be deepcopied later on. Some - # Python installations can't copy regexes. If anyone - # was relying on the existence of markupMassage, this - # might cause problems. - del(self.markupMassage) - self.reset() - - SGMLParser.feed(self, markup) - # Close out any unfinished strings and close all the open tags. - self.endData() - while self.currentTag.name != self.ROOT_TAG_NAME: - self.popTag() - - def __getattr__(self, methodName): - """This method routes method call requests to either the SGMLParser - superclass or the Tag superclass, depending on the method name.""" - #print "__getattr__ called on %s.%s" % (self.__class__, methodName) - - if methodName.startswith('start_') or methodName.startswith('end_') \ - or methodName.startswith('do_'): - return SGMLParser.__getattr__(self, methodName) - elif not methodName.startswith('__'): - return Tag.__getattr__(self, methodName) - else: - raise AttributeError - - def isSelfClosingTag(self, name): - """Returns true iff the given string is the name of a - self-closing tag according to this parser.""" - return self.SELF_CLOSING_TAGS.has_key(name) \ - or self.instanceSelfClosingTags.has_key(name) - - def reset(self): - Tag.__init__(self, self, self.ROOT_TAG_NAME) - self.hidden = 1 - SGMLParser.reset(self) - self.currentData = [] - self.currentTag = None - self.tagStack = [] - self.quoteStack = [] - self.pushTag(self) - - def popTag(self): - tag = self.tagStack.pop() - - #print "Pop", tag.name - if self.tagStack: - self.currentTag = self.tagStack[-1] - return self.currentTag - - def pushTag(self, tag): - #print "Push", tag.name - if self.currentTag: - self.currentTag.contents.append(tag) - self.tagStack.append(tag) - self.currentTag = self.tagStack[-1] - - def endData(self, containerClass=NavigableString): - if self.currentData: - currentData = u''.join(self.currentData) - if (currentData.translate(self.STRIP_ASCII_SPACES) == '' and - not set([tag.name for tag in self.tagStack]).intersection( - self.PRESERVE_WHITESPACE_TAGS)): - if '\n' in currentData: - currentData = '\n' - else: - currentData = ' ' - self.currentData = [] - if self.parseOnlyThese and len(self.tagStack) <= 1 and \ - (not self.parseOnlyThese.text or \ - not self.parseOnlyThese.search(currentData)): - return - o = containerClass(currentData) - o.setup(self.currentTag, self.previous) - if self.previous: - self.previous.next = o - self.previous = o - self.currentTag.contents.append(o) - - - def _popToTag(self, name, inclusivePop=True): - """Pops the tag stack up to and including the most recent - instance of the given tag. If inclusivePop is false, pops the tag - stack up to but *not* including the most recent instqance of - the given tag.""" - #print "Popping to %s" % name - if name == self.ROOT_TAG_NAME: - return - - numPops = 0 - mostRecentTag = None - for i in range(len(self.tagStack)-1, 0, -1): - if name == self.tagStack[i].name: - numPops = len(self.tagStack)-i - break - if not inclusivePop: - numPops = numPops - 1 - - for i in range(0, numPops): - mostRecentTag = self.popTag() - return mostRecentTag - - def _smartPop(self, name): - - """We need to pop up to the previous tag of this type, unless - one of this tag's nesting reset triggers comes between this - tag and the previous tag of this type, OR unless this tag is a - generic nesting trigger and another generic nesting trigger - comes between this tag and the previous tag of this type. - - Examples: -

FooBar *

* should pop to 'p', not 'b'. -

FooBar *

* should pop to 'table', not 'p'. -

Foo

Bar *

* should pop to 'tr', not 'p'. - -

    • *
    • * should pop to 'ul', not the first 'li'. -
  • ** should pop to 'table', not the first 'tr' - tag should - implicitly close the previous tag within the same
    ** should pop to 'tr', not the first 'td' - """ - - nestingResetTriggers = self.NESTABLE_TAGS.get(name) - isNestable = nestingResetTriggers != None - isResetNesting = self.RESET_NESTING_TAGS.has_key(name) - popTo = None - inclusive = True - for i in range(len(self.tagStack)-1, 0, -1): - p = self.tagStack[i] - if (not p or p.name == name) and not isNestable: - #Non-nestable tags get popped to the top or to their - #last occurance. - popTo = name - break - if (nestingResetTriggers is not None - and p.name in nestingResetTriggers) \ - or (nestingResetTriggers is None and isResetNesting - and self.RESET_NESTING_TAGS.has_key(p.name)): - - #If we encounter one of the nesting reset triggers - #peculiar to this tag, or we encounter another tag - #that causes nesting to reset, pop up to but not - #including that tag. - popTo = p.name - inclusive = False - break - p = p.parent - if popTo: - self._popToTag(popTo, inclusive) - - def unknown_starttag(self, name, attrs, selfClosing=0): - #print "Start tag %s: %s" % (name, attrs) - if self.quoteStack: - #This is not a real tag. - #print "<%s> is not real!" % name - attrs = ''.join([' %s="%s"' % (x, y) for x, y in attrs]) - self.handle_data('<%s%s>' % (name, attrs)) - return - self.endData() - - if not self.isSelfClosingTag(name) and not selfClosing: - self._smartPop(name) - - if self.parseOnlyThese and len(self.tagStack) <= 1 \ - and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)): - return - - tag = Tag(self, name, attrs, self.currentTag, self.previous) - if self.previous: - self.previous.next = tag - self.previous = tag - self.pushTag(tag) - if selfClosing or self.isSelfClosingTag(name): - self.popTag() - if name in self.QUOTE_TAGS: - #print "Beginning quote (%s)" % name - self.quoteStack.append(name) - self.literal = 1 - return tag - - def unknown_endtag(self, name): - #print "End tag %s" % name - if self.quoteStack and self.quoteStack[-1] != name: - #This is not a real end tag. - #print " is not real!" % name - self.handle_data('' % name) - return - self.endData() - self._popToTag(name) - if self.quoteStack and self.quoteStack[-1] == name: - self.quoteStack.pop() - self.literal = (len(self.quoteStack) > 0) - - def handle_data(self, data): - self.currentData.append(data) - - def _toStringSubclass(self, text, subclass): - """Adds a certain piece of text to the tree as a NavigableString - subclass.""" - self.endData() - self.handle_data(text) - self.endData(subclass) - - def handle_pi(self, text): - """Handle a processing instruction as a ProcessingInstruction - object, possibly one with a %SOUP-ENCODING% slot into which an - encoding will be plugged later.""" - if text[:3] == "xml": - text = u"xml version='1.0' encoding='%SOUP-ENCODING%'" - self._toStringSubclass(text, ProcessingInstruction) - - def handle_comment(self, text): - "Handle comments as Comment objects." - self._toStringSubclass(text, Comment) - - def handle_charref(self, ref): - "Handle character references as data." - if self.convertEntities: - data = unichr(int(ref)) - else: - data = '&#%s;' % ref - self.handle_data(data) - - def handle_entityref(self, ref): - """Handle entity references as data, possibly converting known - HTML and/or XML entity references to the corresponding Unicode - characters.""" - data = None - if self.convertHTMLEntities: - try: - data = unichr(name2codepoint[ref]) - except KeyError: - pass - - if not data and self.convertXMLEntities: - data = self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref) - - if not data and self.convertHTMLEntities and \ - not self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref): - # TODO: We've got a problem here. We're told this is - # an entity reference, but it's not an XML entity - # reference or an HTML entity reference. Nonetheless, - # the logical thing to do is to pass it through as an - # unrecognized entity reference. - # - # Except: when the input is "&carol;" this function - # will be called with input "carol". When the input is - # "AT&T", this function will be called with input - # "T". We have no way of knowing whether a semicolon - # was present originally, so we don't know whether - # this is an unknown entity or just a misplaced - # ampersand. - # - # The more common case is a misplaced ampersand, so I - # escape the ampersand and omit the trailing semicolon. - data = "&%s" % ref - if not data: - # This case is different from the one above, because we - # haven't already gone through a supposedly comprehensive - # mapping of entities to Unicode characters. We might not - # have gone through any mapping at all. So the chances are - # very high that this is a real entity, and not a - # misplaced ampersand. - data = "&%s;" % ref - self.handle_data(data) - - def handle_decl(self, data): - "Handle DOCTYPEs and the like as Declaration objects." - self._toStringSubclass(data, Declaration) - - def parse_declaration(self, i): - """Treat a bogus SGML declaration as raw data. Treat a CDATA - declaration as a CData object.""" - j = None - if self.rawdata[i:i+9] == '', i) - if k == -1: - k = len(self.rawdata) - data = self.rawdata[i+9:k] - j = k+3 - self._toStringSubclass(data, CData) - else: - try: - j = SGMLParser.parse_declaration(self, i) - except SGMLParseError: - toHandle = self.rawdata[i:] - self.handle_data(toHandle) - j = i + len(toHandle) - return j - -class BeautifulSoup(BeautifulStoneSoup): - - """This parser knows the following facts about HTML: - - * Some tags have no closing tag and should be interpreted as being - closed as soon as they are encountered. - - * The text inside some tags (ie. 'script') may contain tags which - are not really part of the document and which should be parsed - as text, not tags. If you want to parse the text as tags, you can - always fetch it and parse it explicitly. - - * Tag nesting rules: - - Most tags can't be nested at all. For instance, the occurance of - a

    tag should implicitly close the previous

    tag. - -

    Para1

    Para2 - should be transformed into: -

    Para1

    Para2 - - Some tags can be nested arbitrarily. For instance, the occurance - of a

    tag should _not_ implicitly close the previous -
    tag. - - Alice said:
    Bob said:
    Blah - should NOT be transformed into: - Alice said:
    Bob said:
    Blah - - Some tags can be nested, but the nesting is reset by the - interposition of other tags. For instance, a
    , - but not close a tag in another table. - -
    BlahBlah - should be transformed into: -
    BlahBlah - but, - Blah
    Blah - should NOT be transformed into - Blah
    Blah - - Differing assumptions about tag nesting rules are a major source - of problems with the BeautifulSoup class. If BeautifulSoup is not - treating as nestable a tag your page author treats as nestable, - try ICantBelieveItsBeautifulSoup, MinimalSoup, or - BeautifulStoneSoup before writing your own subclass.""" - - def __init__(self, *args, **kwargs): - if not kwargs.has_key('smartQuotesTo'): - kwargs['smartQuotesTo'] = self.HTML_ENTITIES - kwargs['isHTML'] = True - BeautifulStoneSoup.__init__(self, *args, **kwargs) - - SELF_CLOSING_TAGS = buildTagMap(None, - ('br' , 'hr', 'input', 'img', 'meta', - 'spacer', 'link', 'frame', 'base', 'col')) - - PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea']) - - QUOTE_TAGS = {'script' : None, 'textarea' : None} - - #According to the HTML standard, each of these inline tags can - #contain another tag of the same type. Furthermore, it's common - #to actually use these tags this way. - NESTABLE_INLINE_TAGS = ('span', 'font', 'q', 'object', 'bdo', 'sub', 'sup', - 'center') - - #According to the HTML standard, these block tags can contain - #another tag of the same type. Furthermore, it's common - #to actually use these tags this way. - NESTABLE_BLOCK_TAGS = ('blockquote', 'div', 'fieldset', 'ins', 'del') - - #Lists can contain other lists, but there are restrictions. - NESTABLE_LIST_TAGS = { 'ol' : [], - 'ul' : [], - 'li' : ['ul', 'ol'], - 'dl' : [], - 'dd' : ['dl'], - 'dt' : ['dl'] } - - #Tables can contain other tables, but there are restrictions. - NESTABLE_TABLE_TAGS = {'table' : [], - 'tr' : ['table', 'tbody', 'tfoot', 'thead'], - 'td' : ['tr'], - 'th' : ['tr'], - 'thead' : ['table'], - 'tbody' : ['table'], - 'tfoot' : ['table'], - } - - NON_NESTABLE_BLOCK_TAGS = ('address', 'form', 'p', 'pre') - - #If one of these tags is encountered, all tags up to the next tag of - #this type are popped. - RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript', - NON_NESTABLE_BLOCK_TAGS, - NESTABLE_LIST_TAGS, - NESTABLE_TABLE_TAGS) - - NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS, - NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS) - - # Used to detect the charset in a META tag; see start_meta - CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)", re.M) - - def start_meta(self, attrs): - """Beautiful Soup can detect a charset included in a META tag, - try to convert the document to that charset, and re-parse the - document from the beginning.""" - httpEquiv = None - contentType = None - contentTypeIndex = None - tagNeedsEncodingSubstitution = False - - for i in range(0, len(attrs)): - key, value = attrs[i] - key = key.lower() - if key == 'http-equiv': - httpEquiv = value - elif key == 'content': - contentType = value - contentTypeIndex = i - - if httpEquiv and contentType: # It's an interesting meta tag. - match = self.CHARSET_RE.search(contentType) - if match: - if (self.declaredHTMLEncoding is not None or - self.originalEncoding == self.fromEncoding): - # An HTML encoding was sniffed while converting - # the document to Unicode, or an HTML encoding was - # sniffed during a previous pass through the - # document, or an encoding was specified - # explicitly and it worked. Rewrite the meta tag. - def rewrite(match): - return match.group(1) + "%SOUP-ENCODING%" - newAttr = self.CHARSET_RE.sub(rewrite, contentType) - attrs[contentTypeIndex] = (attrs[contentTypeIndex][0], - newAttr) - tagNeedsEncodingSubstitution = True - else: - # This is our first pass through the document. - # Go through it again with the encoding information. - newCharset = match.group(3) - if newCharset and newCharset != self.originalEncoding: - self.declaredHTMLEncoding = newCharset - self._feed(self.declaredHTMLEncoding) - raise StopParsing - pass - tag = self.unknown_starttag("meta", attrs) - if tag and tagNeedsEncodingSubstitution: - tag.containsSubstitutions = True - -class StopParsing(Exception): - pass - -class ICantBelieveItsBeautifulSoup(BeautifulSoup): - - """The BeautifulSoup class is oriented towards skipping over - common HTML errors like unclosed tags. However, sometimes it makes - errors of its own. For instance, consider this fragment: - - FooBar - - This is perfectly valid (if bizarre) HTML. However, the - BeautifulSoup class will implicitly close the first b tag when it - encounters the second 'b'. It will think the author wrote - "FooBar", and didn't close the first 'b' tag, because - there's no real-world reason to bold something that's already - bold. When it encounters '' it will close two more 'b' - tags, for a grand total of three tags closed instead of two. This - can throw off the rest of your document structure. The same is - true of a number of other tags, listed below. - - It's much more common for someone to forget to close a 'b' tag - than to actually use nested 'b' tags, and the BeautifulSoup class - handles the common case. This class handles the not-co-common - case: where you can't believe someone wrote what they did, but - it's valid HTML and BeautifulSoup screwed up by assuming it - wouldn't be.""" - - I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \ - ('em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong', - 'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b', - 'big') - - I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ('noscript',) - - NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS, - I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS, - I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS) - -class MinimalSoup(BeautifulSoup): - """The MinimalSoup class is for parsing HTML that contains - pathologically bad markup. It makes no assumptions about tag - nesting, but it does know which tags are self-closing, that - ' - safe = Markup('username') - assert unsafe + safe == text_type(escape(unsafe)) + text_type(safe) - - # string interpolations are safe to use too - assert Markup('%s') % '' == \ - '<bad user>' - assert Markup('%(username)s') % { - 'username': '' - } == '<bad user>' - - # an escaped object is markup too - assert type(Markup('foo') + 'bar') is Markup - - # and it implements __html__ by returning itself - x = Markup("foo") - assert x.__html__() is x - - # it also knows how to treat __html__ objects - class Foo(object): - def __html__(self): - return 'awesome' - def __unicode__(self): - return 'awesome' - assert Markup(Foo()) == 'awesome' - assert Markup('%s') % Foo() == \ - 'awesome' - - # escaping and unescaping - assert escape('"<>&\'') == '"<>&'' - assert Markup("Foo & Bar").striptags() == "Foo & Bar" - assert Markup("<test>").unescape() == "" - - def test_template_data(self): - env = Environment(autoescape=True) - t = env.from_string('{% macro say_hello(name) %}' - '

    Hello {{ name }}!

    {% endmacro %}' - '{{ say_hello("foo") }}') - escaped_out = '

    Hello <blink>foo</blink>!

    ' - assert t.render() == escaped_out - assert text_type(t.module) == escaped_out - assert escape(t.module) == escaped_out - assert t.module.say_hello('foo') == escaped_out - assert escape(t.module.say_hello('foo')) == escaped_out - - def test_attr_filter(self): - env = SandboxedEnvironment() - tmpl = env.from_string('{{ cls|attr("__subclasses__")() }}') - self.assert_raises(SecurityError, tmpl.render, cls=int) - - def test_binary_operator_intercepting(self): - def disable_op(left, right): - raise TemplateRuntimeError('that operator so does not work') - for expr, ctx, rv in ('1 + 2', {}, '3'), ('a + 2', {'a': 2}, '4'): - env = SandboxedEnvironment() - env.binop_table['+'] = disable_op - t = env.from_string('{{ %s }}' % expr) - assert t.render(ctx) == rv - env.intercepted_binops = frozenset(['+']) - t = env.from_string('{{ %s }}' % expr) - try: - t.render(ctx) - except TemplateRuntimeError as e: - pass - else: - self.fail('expected runtime error') - - def test_unary_operator_intercepting(self): - def disable_op(arg): - raise TemplateRuntimeError('that operator so does not work') - for expr, ctx, rv in ('-1', {}, '-1'), ('-a', {'a': 2}, '-2'): - env = SandboxedEnvironment() - env.unop_table['-'] = disable_op - t = env.from_string('{{ %s }}' % expr) - assert t.render(ctx) == rv - env.intercepted_unops = frozenset(['-']) - t = env.from_string('{{ %s }}' % expr) - try: - t.render(ctx) - except TemplateRuntimeError as e: - pass - else: - self.fail('expected runtime error') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(SandboxTestCase)) - return suite diff --git a/module/lib/jinja2/testsuite/tests.py b/module/lib/jinja2/testsuite/tests.py deleted file mode 100644 index 3ece7a8ff..000000000 --- a/module/lib/jinja2/testsuite/tests.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.tests - ~~~~~~~~~~~~~~~~~~~~~~ - - Who tests the tests? - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import unittest -from jinja2.testsuite import JinjaTestCase - -from jinja2 import Markup, Environment - -env = Environment() - - -class TestsTestCase(JinjaTestCase): - - def test_defined(self): - tmpl = env.from_string('{{ missing is defined }}|{{ true is defined }}') - assert tmpl.render() == 'False|True' - - def test_even(self): - tmpl = env.from_string('''{{ 1 is even }}|{{ 2 is even }}''') - assert tmpl.render() == 'False|True' - - def test_odd(self): - tmpl = env.from_string('''{{ 1 is odd }}|{{ 2 is odd }}''') - assert tmpl.render() == 'True|False' - - def test_lower(self): - tmpl = env.from_string('''{{ "foo" is lower }}|{{ "FOO" is lower }}''') - assert tmpl.render() == 'True|False' - - def test_typechecks(self): - tmpl = env.from_string(''' - {{ 42 is undefined }} - {{ 42 is defined }} - {{ 42 is none }} - {{ none is none }} - {{ 42 is number }} - {{ 42 is string }} - {{ "foo" is string }} - {{ "foo" is sequence }} - {{ [1] is sequence }} - {{ range is callable }} - {{ 42 is callable }} - {{ range(5) is iterable }} - {{ {} is mapping }} - {{ mydict is mapping }} - {{ [] is mapping }} - ''') - class MyDict(dict): - pass - assert tmpl.render(mydict=MyDict()).split() == [ - 'False', 'True', 'False', 'True', 'True', 'False', - 'True', 'True', 'True', 'True', 'False', 'True', - 'True', 'True', 'False' - ] - - def test_sequence(self): - tmpl = env.from_string( - '{{ [1, 2, 3] is sequence }}|' - '{{ "foo" is sequence }}|' - '{{ 42 is sequence }}' - ) - assert tmpl.render() == 'True|True|False' - - def test_upper(self): - tmpl = env.from_string('{{ "FOO" is upper }}|{{ "foo" is upper }}') - assert tmpl.render() == 'True|False' - - def test_sameas(self): - tmpl = env.from_string('{{ foo is sameas false }}|' - '{{ 0 is sameas false }}') - assert tmpl.render(foo=False) == 'True|False' - - def test_no_paren_for_arg1(self): - tmpl = env.from_string('{{ foo is sameas none }}') - assert tmpl.render(foo=None) == 'True' - - def test_escaped(self): - env = Environment(autoescape=True) - tmpl = env.from_string('{{ x is escaped }}|{{ y is escaped }}') - assert tmpl.render(x='foo', y=Markup('foo')) == 'False|True' - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(TestsTestCase)) - return suite diff --git a/module/lib/jinja2/testsuite/utils.py b/module/lib/jinja2/testsuite/utils.py deleted file mode 100644 index cab9b09a9..000000000 --- a/module/lib/jinja2/testsuite/utils.py +++ /dev/null @@ -1,82 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.utils - ~~~~~~~~~~~~~~~~~~~~~~ - - Tests utilities jinja uses. - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import gc -import unittest - -import pickle - -from jinja2.testsuite import JinjaTestCase - -from jinja2.utils import LRUCache, escape, object_type_repr - - -class LRUCacheTestCase(JinjaTestCase): - - def test_simple(self): - d = LRUCache(3) - d["a"] = 1 - d["b"] = 2 - d["c"] = 3 - d["a"] - d["d"] = 4 - assert len(d) == 3 - assert 'a' in d and 'c' in d and 'd' in d and 'b' not in d - - def test_pickleable(self): - cache = LRUCache(2) - cache["foo"] = 42 - cache["bar"] = 23 - cache["foo"] - - for protocol in range(3): - copy = pickle.loads(pickle.dumps(cache, protocol)) - assert copy.capacity == cache.capacity - assert copy._mapping == cache._mapping - assert copy._queue == cache._queue - - -class HelpersTestCase(JinjaTestCase): - - def test_object_type_repr(self): - class X(object): - pass - self.assert_equal(object_type_repr(42), 'int object') - self.assert_equal(object_type_repr([]), 'list object') - self.assert_equal(object_type_repr(X()), - 'jinja2.testsuite.utils.X object') - self.assert_equal(object_type_repr(None), 'None') - self.assert_equal(object_type_repr(Ellipsis), 'Ellipsis') - - -class MarkupLeakTestCase(JinjaTestCase): - - def test_markup_leaks(self): - counts = set() - for count in range(20): - for item in range(1000): - escape("foo") - escape("") - escape(u"foo") - escape(u"") - counts.add(len(gc.get_objects())) - assert len(counts) == 1, 'ouch, c extension seems to leak objects' - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(LRUCacheTestCase)) - suite.addTest(unittest.makeSuite(HelpersTestCase)) - - # this test only tests the c extension - if not hasattr(escape, 'func_code'): - suite.addTest(unittest.makeSuite(MarkupLeakTestCase)) - - return suite diff --git a/module/lib/jinja2/utils.py b/module/lib/jinja2/utils.py deleted file mode 100644 index ddc47da0a..000000000 --- a/module/lib/jinja2/utils.py +++ /dev/null @@ -1,520 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.utils - ~~~~~~~~~~~~ - - Utility functions. - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import re -import errno -from collections import deque -from jinja2._compat import text_type, string_types, implements_iterator, \ - allocate_lock, url_quote - - -_word_split_re = re.compile(r'(\s+)') -_punctuation_re = re.compile( - '^(?P(?:%s)*)(?P.*?)(?P(?:%s)*)$' % ( - '|'.join(map(re.escape, ('(', '<', '<'))), - '|'.join(map(re.escape, ('.', ',', ')', '>', '\n', '>'))) - ) -) -_simple_email_re = re.compile(r'^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$') -_striptags_re = re.compile(r'(|<[^>]*>)') -_entity_re = re.compile(r'&([^;]+);') -_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' -_digits = '0123456789' - -# special singleton representing missing values for the runtime -missing = type('MissingType', (), {'__repr__': lambda x: 'missing'})() - -# internal code -internal_code = set() - -concat = u''.join - - -def contextfunction(f): - """This decorator can be used to mark a function or method context callable. - A context callable is passed the active :class:`Context` as first argument when - called from the template. This is useful if a function wants to get access - to the context or functions provided on the context object. For example - a function that returns a sorted list of template variables the current - template exports could look like this:: - - @contextfunction - def get_exported_names(context): - return sorted(context.exported_vars) - """ - f.contextfunction = True - return f - - -def evalcontextfunction(f): - """This decorator can be used to mark a function or method as an eval - context callable. This is similar to the :func:`contextfunction` - but instead of passing the context, an evaluation context object is - passed. For more information about the eval context, see - :ref:`eval-context`. - - .. versionadded:: 2.4 - """ - f.evalcontextfunction = True - return f - - -def environmentfunction(f): - """This decorator can be used to mark a function or method as environment - callable. This decorator works exactly like the :func:`contextfunction` - decorator just that the first argument is the active :class:`Environment` - and not context. - """ - f.environmentfunction = True - return f - - -def internalcode(f): - """Marks the function as internally used""" - internal_code.add(f.__code__) - return f - - -def is_undefined(obj): - """Check if the object passed is undefined. This does nothing more than - performing an instance check against :class:`Undefined` but looks nicer. - This can be used for custom filters or tests that want to react to - undefined variables. For example a custom default filter can look like - this:: - - def default(var, default=''): - if is_undefined(var): - return default - return var - """ - from jinja2.runtime import Undefined - return isinstance(obj, Undefined) - - -def consume(iterable): - """Consumes an iterable without doing anything with it.""" - for event in iterable: - pass - - -def clear_caches(): - """Jinja2 keeps internal caches for environments and lexers. These are - used so that Jinja2 doesn't have to recreate environments and lexers all - the time. Normally you don't have to care about that but if you are - messuring memory consumption you may want to clean the caches. - """ - from jinja2.environment import _spontaneous_environments - from jinja2.lexer import _lexer_cache - _spontaneous_environments.clear() - _lexer_cache.clear() - - -def import_string(import_name, silent=False): - """Imports an object based on a string. This is useful if you want to - use import paths as endpoints or something similar. An import path can - be specified either in dotted notation (``xml.sax.saxutils.escape``) - or with a colon as object delimiter (``xml.sax.saxutils:escape``). - - If the `silent` is True the return value will be `None` if the import - fails. - - :return: imported object - """ - try: - if ':' in import_name: - module, obj = import_name.split(':', 1) - elif '.' in import_name: - items = import_name.split('.') - module = '.'.join(items[:-1]) - obj = items[-1] - else: - return __import__(import_name) - return getattr(__import__(module, None, None, [obj]), obj) - except (ImportError, AttributeError): - if not silent: - raise - - -def open_if_exists(filename, mode='rb'): - """Returns a file descriptor for the filename if that file exists, - otherwise `None`. - """ - try: - return open(filename, mode) - except IOError as e: - if e.errno not in (errno.ENOENT, errno.EISDIR): - raise - - -def object_type_repr(obj): - """Returns the name of the object's type. For some recognized - singletons the name of the object is returned instead. (For - example for `None` and `Ellipsis`). - """ - if obj is None: - return 'None' - elif obj is Ellipsis: - return 'Ellipsis' - # __builtin__ in 2.x, builtins in 3.x - if obj.__class__.__module__ in ('__builtin__', 'builtins'): - name = obj.__class__.__name__ - else: - name = obj.__class__.__module__ + '.' + obj.__class__.__name__ - return '%s object' % name - - -def pformat(obj, verbose=False): - """Prettyprint an object. Either use the `pretty` library or the - builtin `pprint`. - """ - try: - from pretty import pretty - return pretty(obj, verbose=verbose) - except ImportError: - from pprint import pformat - return pformat(obj) - - -def urlize(text, trim_url_limit=None, nofollow=False): - """Converts any URLs in text into clickable links. Works on http://, - https:// and www. links. Links can have trailing punctuation (periods, - commas, close-parens) and leading punctuation (opening parens) and - it'll still do the right thing. - - If trim_url_limit is not None, the URLs in link text will be limited - to trim_url_limit characters. - - If nofollow is True, the URLs in link text will get a rel="nofollow" - attribute. - """ - trim_url = lambda x, limit=trim_url_limit: limit is not None \ - and (x[:limit] + (len(x) >=limit and '...' - or '')) or x - words = _word_split_re.split(text_type(escape(text))) - nofollow_attr = nofollow and ' rel="nofollow"' or '' - for i, word in enumerate(words): - match = _punctuation_re.match(word) - if match: - lead, middle, trail = match.groups() - if middle.startswith('www.') or ( - '@' not in middle and - not middle.startswith('http://') and - not middle.startswith('https://') and - len(middle) > 0 and - middle[0] in _letters + _digits and ( - middle.endswith('.org') or - middle.endswith('.net') or - middle.endswith('.com') - )): - middle = '%s' % (middle, - nofollow_attr, trim_url(middle)) - if middle.startswith('http://') or \ - middle.startswith('https://'): - middle = '%s' % (middle, - nofollow_attr, trim_url(middle)) - if '@' in middle and not middle.startswith('www.') and \ - not ':' in middle and _simple_email_re.match(middle): - middle = '%s' % (middle, middle) - if lead + middle + trail != word: - words[i] = lead + middle + trail - return u''.join(words) - - -def generate_lorem_ipsum(n=5, html=True, min=20, max=100): - """Generate some lorem impsum for the template.""" - from jinja2.constants import LOREM_IPSUM_WORDS - from random import choice, randrange - words = LOREM_IPSUM_WORDS.split() - result = [] - - for _ in range(n): - next_capitalized = True - last_comma = last_fullstop = 0 - word = None - last = None - p = [] - - # each paragraph contains out of 20 to 100 words. - for idx, _ in enumerate(range(randrange(min, max))): - while True: - word = choice(words) - if word != last: - last = word - break - if next_capitalized: - word = word.capitalize() - next_capitalized = False - # add commas - if idx - randrange(3, 8) > last_comma: - last_comma = idx - last_fullstop += 2 - word += ',' - # add end of sentences - if idx - randrange(10, 20) > last_fullstop: - last_comma = last_fullstop = idx - word += '.' - next_capitalized = True - p.append(word) - - # ensure that the paragraph ends with a dot. - p = u' '.join(p) - if p.endswith(','): - p = p[:-1] + '.' - elif not p.endswith('.'): - p += '.' - result.append(p) - - if not html: - return u'\n\n'.join(result) - return Markup(u'\n'.join(u'

    %s

    ' % escape(x) for x in result)) - - -def unicode_urlencode(obj, charset='utf-8'): - """URL escapes a single bytestring or unicode string with the - given charset if applicable to URL safe quoting under all rules - that need to be considered under all supported Python versions. - - If non strings are provided they are converted to their unicode - representation first. - """ - if not isinstance(obj, string_types): - obj = text_type(obj) - if isinstance(obj, text_type): - obj = obj.encode(charset) - return text_type(url_quote(obj)) - - -class LRUCache(object): - """A simple LRU Cache implementation.""" - - # this is fast for small capacities (something below 1000) but doesn't - # scale. But as long as it's only used as storage for templates this - # won't do any harm. - - def __init__(self, capacity): - self.capacity = capacity - self._mapping = {} - self._queue = deque() - self._postinit() - - def _postinit(self): - # alias all queue methods for faster lookup - self._popleft = self._queue.popleft - self._pop = self._queue.pop - self._remove = self._queue.remove - self._wlock = allocate_lock() - self._append = self._queue.append - - def __getstate__(self): - return { - 'capacity': self.capacity, - '_mapping': self._mapping, - '_queue': self._queue - } - - def __setstate__(self, d): - self.__dict__.update(d) - self._postinit() - - def __getnewargs__(self): - return (self.capacity,) - - def copy(self): - """Return a shallow copy of the instance.""" - rv = self.__class__(self.capacity) - rv._mapping.update(self._mapping) - rv._queue = deque(self._queue) - return rv - - def get(self, key, default=None): - """Return an item from the cache dict or `default`""" - try: - return self[key] - except KeyError: - return default - - def setdefault(self, key, default=None): - """Set `default` if the key is not in the cache otherwise - leave unchanged. Return the value of this key. - """ - self._wlock.acquire() - try: - try: - return self[key] - except KeyError: - self[key] = default - return default - finally: - self._wlock.release() - - def clear(self): - """Clear the cache.""" - self._wlock.acquire() - try: - self._mapping.clear() - self._queue.clear() - finally: - self._wlock.release() - - def __contains__(self, key): - """Check if a key exists in this cache.""" - return key in self._mapping - - def __len__(self): - """Return the current size of the cache.""" - return len(self._mapping) - - def __repr__(self): - return '<%s %r>' % ( - self.__class__.__name__, - self._mapping - ) - - def __getitem__(self, key): - """Get an item from the cache. Moves the item up so that it has the - highest priority then. - - Raise a `KeyError` if it does not exist. - """ - self._wlock.acquire() - try: - rv = self._mapping[key] - if self._queue[-1] != key: - try: - self._remove(key) - except ValueError: - # if something removed the key from the container - # when we read, ignore the ValueError that we would - # get otherwise. - pass - self._append(key) - return rv - finally: - self._wlock.release() - - def __setitem__(self, key, value): - """Sets the value for an item. Moves the item up so that it - has the highest priority then. - """ - self._wlock.acquire() - try: - if key in self._mapping: - self._remove(key) - elif len(self._mapping) == self.capacity: - del self._mapping[self._popleft()] - self._append(key) - self._mapping[key] = value - finally: - self._wlock.release() - - def __delitem__(self, key): - """Remove an item from the cache dict. - Raise a `KeyError` if it does not exist. - """ - self._wlock.acquire() - try: - del self._mapping[key] - try: - self._remove(key) - except ValueError: - # __getitem__ is not locked, it might happen - pass - finally: - self._wlock.release() - - def items(self): - """Return a list of items.""" - result = [(key, self._mapping[key]) for key in list(self._queue)] - result.reverse() - return result - - def iteritems(self): - """Iterate over all items.""" - return iter(self.items()) - - def values(self): - """Return a list of all values.""" - return [x[1] for x in self.items()] - - def itervalue(self): - """Iterate over all values.""" - return iter(self.values()) - - def keys(self): - """Return a list of all keys ordered by most recent usage.""" - return list(self) - - def iterkeys(self): - """Iterate over all keys in the cache dict, ordered by - the most recent usage. - """ - return reversed(tuple(self._queue)) - - __iter__ = iterkeys - - def __reversed__(self): - """Iterate over the values in the cache dict, oldest items - coming first. - """ - return iter(tuple(self._queue)) - - __copy__ = copy - - -# register the LRU cache as mutable mapping if possible -try: - from collections import MutableMapping - MutableMapping.register(LRUCache) -except ImportError: - pass - - -@implements_iterator -class Cycler(object): - """A cycle helper for templates.""" - - def __init__(self, *items): - if not items: - raise RuntimeError('at least one item has to be provided') - self.items = items - self.reset() - - def reset(self): - """Resets the cycle.""" - self.pos = 0 - - @property - def current(self): - """Returns the current item.""" - return self.items[self.pos] - - def __next__(self): - """Goes one item ahead and returns it.""" - rv = self.current - self.pos = (self.pos + 1) % len(self.items) - return rv - - -class Joiner(object): - """A joining helper for templates.""" - - def __init__(self, sep=u', '): - self.sep = sep - self.used = False - - def __call__(self): - if not self.used: - self.used = True - return u'' - return self.sep - - -# Imported here because that's where it was in the past -from markupsafe import Markup, escape, soft_unicode diff --git a/module/lib/jinja2/visitor.py b/module/lib/jinja2/visitor.py deleted file mode 100644 index 413e7c309..000000000 --- a/module/lib/jinja2/visitor.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.visitor - ~~~~~~~~~~~~~~ - - This module implements a visitor for the nodes. - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD. -""" -from jinja2.nodes import Node - - -class NodeVisitor(object): - """Walks the abstract syntax tree and call visitor functions for every - node found. The visitor functions may return values which will be - forwarded by the `visit` method. - - Per default the visitor functions for the nodes are ``'visit_'`` + - class name of the node. So a `TryFinally` node visit function would - be `visit_TryFinally`. This behavior can be changed by overriding - the `get_visitor` function. If no visitor function exists for a node - (return value `None`) the `generic_visit` visitor is used instead. - """ - - def get_visitor(self, node): - """Return the visitor function for this node or `None` if no visitor - exists for this node. In that case the generic visit function is - used instead. - """ - method = 'visit_' + node.__class__.__name__ - return getattr(self, method, None) - - def visit(self, node, *args, **kwargs): - """Visit a node.""" - f = self.get_visitor(node) - if f is not None: - return f(node, *args, **kwargs) - return self.generic_visit(node, *args, **kwargs) - - def generic_visit(self, node, *args, **kwargs): - """Called if no explicit visitor function exists for a node.""" - for node in node.iter_child_nodes(): - self.visit(node, *args, **kwargs) - - -class NodeTransformer(NodeVisitor): - """Walks the abstract syntax tree and allows modifications of nodes. - - The `NodeTransformer` will walk the AST and use the return value of the - visitor functions to replace or remove the old node. If the return - value of the visitor function is `None` the node will be removed - from the previous location otherwise it's replaced with the return - value. The return value may be the original node in which case no - replacement takes place. - """ - - def generic_visit(self, node, *args, **kwargs): - for field, old_value in node.iter_fields(): - if isinstance(old_value, list): - new_values = [] - for value in old_value: - if isinstance(value, Node): - value = self.visit(value, *args, **kwargs) - if value is None: - continue - elif not isinstance(value, Node): - new_values.extend(value) - continue - new_values.append(value) - old_value[:] = new_values - elif isinstance(old_value, Node): - new_node = self.visit(old_value, *args, **kwargs) - if new_node is None: - delattr(node, field) - else: - setattr(node, field, new_node) - return node - - def visit_list(self, node, *args, **kwargs): - """As transformers may return lists in some places this method - can be used to enforce a list as return value. - """ - rv = self.visit(node, *args, **kwargs) - if not isinstance(rv, list): - rv = [rv] - return rv diff --git a/module/lib/markupsafe/__init__.py b/module/lib/markupsafe/__init__.py deleted file mode 100644 index 275540154..000000000 --- a/module/lib/markupsafe/__init__.py +++ /dev/null @@ -1,298 +0,0 @@ -# -*- coding: utf-8 -*- -""" - markupsafe - ~~~~~~~~~~ - - Implements a Markup string. - - :copyright: (c) 2010 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import re -import string -from collections import Mapping -from markupsafe._compat import text_type, string_types, int_types, \ - unichr, iteritems, PY2 - - -__all__ = ['Markup', 'soft_unicode', 'escape', 'escape_silent'] - - -_striptags_re = re.compile(r'(|<[^>]*>)') -_entity_re = re.compile(r'&([^;]+);') - - -class Markup(text_type): - r"""Marks a string as being safe for inclusion in HTML/XML output without - needing to be escaped. This implements the `__html__` interface a couple - of frameworks and web applications use. :class:`Markup` is a direct - subclass of `unicode` and provides all the methods of `unicode` just that - it escapes arguments passed and always returns `Markup`. - - The `escape` function returns markup objects so that double escaping can't - happen. - - The constructor of the :class:`Markup` class can be used for three - different things: When passed an unicode object it's assumed to be safe, - when passed an object with an HTML representation (has an `__html__` - method) that representation is used, otherwise the object passed is - converted into a unicode string and then assumed to be safe: - - >>> Markup("Hello World!") - Markup(u'Hello World!') - >>> class Foo(object): - ... def __html__(self): - ... return 'foo' - ... - >>> Markup(Foo()) - Markup(u'foo') - - If you want object passed being always treated as unsafe you can use the - :meth:`escape` classmethod to create a :class:`Markup` object: - - >>> Markup.escape("Hello World!") - Markup(u'Hello <em>World</em>!') - - Operations on a markup string are markup aware which means that all - arguments are passed through the :func:`escape` function: - - >>> em = Markup("%s") - >>> em % "foo & bar" - Markup(u'foo & bar') - >>> strong = Markup("%(text)s") - >>> strong % {'text': 'hacker here'} - Markup(u'<blink>hacker here</blink>') - >>> Markup("Hello ") + "" - Markup(u'Hello <foo>') - """ - __slots__ = () - - def __new__(cls, base=u'', encoding=None, errors='strict'): - if hasattr(base, '__html__'): - base = base.__html__() - if encoding is None: - return text_type.__new__(cls, base) - return text_type.__new__(cls, base, encoding, errors) - - def __html__(self): - return self - - def __add__(self, other): - if isinstance(other, string_types) or hasattr(other, '__html__'): - return self.__class__(super(Markup, self).__add__(self.escape(other))) - return NotImplemented - - def __radd__(self, other): - if hasattr(other, '__html__') or isinstance(other, string_types): - return self.escape(other).__add__(self) - return NotImplemented - - def __mul__(self, num): - if isinstance(num, int_types): - return self.__class__(text_type.__mul__(self, num)) - return NotImplemented - __rmul__ = __mul__ - - def __mod__(self, arg): - if isinstance(arg, tuple): - arg = tuple(_MarkupEscapeHelper(x, self.escape) for x in arg) - else: - arg = _MarkupEscapeHelper(arg, self.escape) - return self.__class__(text_type.__mod__(self, arg)) - - def __repr__(self): - return '%s(%s)' % ( - self.__class__.__name__, - text_type.__repr__(self) - ) - - def join(self, seq): - return self.__class__(text_type.join(self, map(self.escape, seq))) - join.__doc__ = text_type.join.__doc__ - - def split(self, *args, **kwargs): - return list(map(self.__class__, text_type.split(self, *args, **kwargs))) - split.__doc__ = text_type.split.__doc__ - - def rsplit(self, *args, **kwargs): - return list(map(self.__class__, text_type.rsplit(self, *args, **kwargs))) - rsplit.__doc__ = text_type.rsplit.__doc__ - - def splitlines(self, *args, **kwargs): - return list(map(self.__class__, text_type.splitlines( - self, *args, **kwargs))) - splitlines.__doc__ = text_type.splitlines.__doc__ - - def unescape(self): - r"""Unescape markup again into an text_type string. This also resolves - known HTML4 and XHTML entities: - - >>> Markup("Main » About").unescape() - u'Main \xbb About' - """ - from markupsafe._constants import HTML_ENTITIES - def handle_match(m): - name = m.group(1) - if name in HTML_ENTITIES: - return unichr(HTML_ENTITIES[name]) - try: - if name[:2] in ('#x', '#X'): - return unichr(int(name[2:], 16)) - elif name.startswith('#'): - return unichr(int(name[1:])) - except ValueError: - pass - return u'' - return _entity_re.sub(handle_match, text_type(self)) - - def striptags(self): - r"""Unescape markup into an text_type string and strip all tags. This - also resolves known HTML4 and XHTML entities. Whitespace is - normalized to one: - - >>> Markup("Main » About").striptags() - u'Main \xbb About' - """ - stripped = u' '.join(_striptags_re.sub('', self).split()) - return Markup(stripped).unescape() - - @classmethod - def escape(cls, s): - """Escape the string. Works like :func:`escape` with the difference - that for subclasses of :class:`Markup` this function would return the - correct subclass. - """ - rv = escape(s) - if rv.__class__ is not cls: - return cls(rv) - return rv - - def make_simple_escaping_wrapper(name): - orig = getattr(text_type, name) - def func(self, *args, **kwargs): - args = _escape_argspec(list(args), enumerate(args), self.escape) - _escape_argspec(kwargs, iteritems(kwargs), self.escape) - return self.__class__(orig(self, *args, **kwargs)) - func.__name__ = orig.__name__ - func.__doc__ = orig.__doc__ - return func - - for method in '__getitem__', 'capitalize', \ - 'title', 'lower', 'upper', 'replace', 'ljust', \ - 'rjust', 'lstrip', 'rstrip', 'center', 'strip', \ - 'translate', 'expandtabs', 'swapcase', 'zfill': - locals()[method] = make_simple_escaping_wrapper(method) - - # new in python 2.5 - if hasattr(text_type, 'partition'): - def partition(self, sep): - return tuple(map(self.__class__, - text_type.partition(self, self.escape(sep)))) - def rpartition(self, sep): - return tuple(map(self.__class__, - text_type.rpartition(self, self.escape(sep)))) - - # new in python 2.6 - if hasattr(text_type, 'format'): - def format(*args, **kwargs): - self, args = args[0], args[1:] - formatter = EscapeFormatter(self.escape) - kwargs = _MagicFormatMapping(args, kwargs) - return self.__class__(formatter.vformat(self, args, kwargs)) - - def __html_format__(self, format_spec): - if format_spec: - raise ValueError('Unsupported format specification ' - 'for Markup.') - return self - - # not in python 3 - if hasattr(text_type, '__getslice__'): - __getslice__ = make_simple_escaping_wrapper('__getslice__') - - del method, make_simple_escaping_wrapper - - -class _MagicFormatMapping(Mapping): - """This class implements a dummy wrapper to fix a bug in the Python - standard library for string formatting. - - See http://bugs.python.org/issue13598 for information about why - this is necessary. - """ - - def __init__(self, args, kwargs): - self._args = args - self._kwargs = kwargs - self._last_index = 0 - - def __getitem__(self, key): - if key == '': - idx = self._last_index - self._last_index += 1 - try: - return self._args[idx] - except LookupError: - pass - key = str(idx) - return self._kwargs[key] - - def __iter__(self): - return iter(self._kwargs) - - def __len__(self): - return len(self._kwargs) - - -if hasattr(text_type, 'format'): - class EscapeFormatter(string.Formatter): - - def __init__(self, escape): - self.escape = escape - - def format_field(self, value, format_spec): - if hasattr(value, '__html_format__'): - rv = value.__html_format__(format_spec) - elif hasattr(value, '__html__'): - if format_spec: - raise ValueError('No format specification allowed ' - 'when formatting an object with ' - 'its __html__ method.') - rv = value.__html__() - else: - rv = string.Formatter.format_field(self, value, format_spec) - return text_type(self.escape(rv)) - - -def _escape_argspec(obj, iterable, escape): - """Helper for various string-wrapped functions.""" - for key, value in iterable: - if hasattr(value, '__html__') or isinstance(value, string_types): - obj[key] = escape(value) - return obj - - -class _MarkupEscapeHelper(object): - """Helper for Markup.__mod__""" - - def __init__(self, obj, escape): - self.obj = obj - self.escape = escape - - __getitem__ = lambda s, x: _MarkupEscapeHelper(s.obj[x], s.escape) - __unicode__ = __str__ = lambda s: text_type(s.escape(s.obj)) - __repr__ = lambda s: str(s.escape(repr(s.obj))) - __int__ = lambda s: int(s.obj) - __float__ = lambda s: float(s.obj) - - -# we have to import it down here as the speedups and native -# modules imports the markup type which is define above. -try: - from markupsafe._speedups import escape, escape_silent, soft_unicode -except ImportError: - from markupsafe._native import escape, escape_silent, soft_unicode - -if not PY2: - soft_str = soft_unicode - __all__.append('soft_str') diff --git a/module/lib/markupsafe/_compat.py b/module/lib/markupsafe/_compat.py deleted file mode 100644 index 62e5632ad..000000000 --- a/module/lib/markupsafe/_compat.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -""" - markupsafe._compat - ~~~~~~~~~~~~~~~~~~ - - Compatibility module for different Python versions. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import sys - -PY2 = sys.version_info[0] == 2 - -if not PY2: - text_type = str - string_types = (str,) - unichr = chr - int_types = (int,) - iteritems = lambda x: iter(x.items()) -else: - text_type = unicode - string_types = (str, unicode) - unichr = unichr - int_types = (int, long) - iteritems = lambda x: x.iteritems() diff --git a/module/lib/markupsafe/_constants.py b/module/lib/markupsafe/_constants.py deleted file mode 100644 index 919bf03c5..000000000 --- a/module/lib/markupsafe/_constants.py +++ /dev/null @@ -1,267 +0,0 @@ -# -*- coding: utf-8 -*- -""" - markupsafe._constants - ~~~~~~~~~~~~~~~~~~~~~ - - Highlevel implementation of the Markup string. - - :copyright: (c) 2010 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - - -HTML_ENTITIES = { - 'AElig': 198, - 'Aacute': 193, - 'Acirc': 194, - 'Agrave': 192, - 'Alpha': 913, - 'Aring': 197, - 'Atilde': 195, - 'Auml': 196, - 'Beta': 914, - 'Ccedil': 199, - 'Chi': 935, - 'Dagger': 8225, - 'Delta': 916, - 'ETH': 208, - 'Eacute': 201, - 'Ecirc': 202, - 'Egrave': 200, - 'Epsilon': 917, - 'Eta': 919, - 'Euml': 203, - 'Gamma': 915, - 'Iacute': 205, - 'Icirc': 206, - 'Igrave': 204, - 'Iota': 921, - 'Iuml': 207, - 'Kappa': 922, - 'Lambda': 923, - 'Mu': 924, - 'Ntilde': 209, - 'Nu': 925, - 'OElig': 338, - 'Oacute': 211, - 'Ocirc': 212, - 'Ograve': 210, - 'Omega': 937, - 'Omicron': 927, - 'Oslash': 216, - 'Otilde': 213, - 'Ouml': 214, - 'Phi': 934, - 'Pi': 928, - 'Prime': 8243, - 'Psi': 936, - 'Rho': 929, - 'Scaron': 352, - 'Sigma': 931, - 'THORN': 222, - 'Tau': 932, - 'Theta': 920, - 'Uacute': 218, - 'Ucirc': 219, - 'Ugrave': 217, - 'Upsilon': 933, - 'Uuml': 220, - 'Xi': 926, - 'Yacute': 221, - 'Yuml': 376, - 'Zeta': 918, - 'aacute': 225, - 'acirc': 226, - 'acute': 180, - 'aelig': 230, - 'agrave': 224, - 'alefsym': 8501, - 'alpha': 945, - 'amp': 38, - 'and': 8743, - 'ang': 8736, - 'apos': 39, - 'aring': 229, - 'asymp': 8776, - 'atilde': 227, - 'auml': 228, - 'bdquo': 8222, - 'beta': 946, - 'brvbar': 166, - 'bull': 8226, - 'cap': 8745, - 'ccedil': 231, - 'cedil': 184, - 'cent': 162, - 'chi': 967, - 'circ': 710, - 'clubs': 9827, - 'cong': 8773, - 'copy': 169, - 'crarr': 8629, - 'cup': 8746, - 'curren': 164, - 'dArr': 8659, - 'dagger': 8224, - 'darr': 8595, - 'deg': 176, - 'delta': 948, - 'diams': 9830, - 'divide': 247, - 'eacute': 233, - 'ecirc': 234, - 'egrave': 232, - 'empty': 8709, - 'emsp': 8195, - 'ensp': 8194, - 'epsilon': 949, - 'equiv': 8801, - 'eta': 951, - 'eth': 240, - 'euml': 235, - 'euro': 8364, - 'exist': 8707, - 'fnof': 402, - 'forall': 8704, - 'frac12': 189, - 'frac14': 188, - 'frac34': 190, - 'frasl': 8260, - 'gamma': 947, - 'ge': 8805, - 'gt': 62, - 'hArr': 8660, - 'harr': 8596, - 'hearts': 9829, - 'hellip': 8230, - 'iacute': 237, - 'icirc': 238, - 'iexcl': 161, - 'igrave': 236, - 'image': 8465, - 'infin': 8734, - 'int': 8747, - 'iota': 953, - 'iquest': 191, - 'isin': 8712, - 'iuml': 239, - 'kappa': 954, - 'lArr': 8656, - 'lambda': 955, - 'lang': 9001, - 'laquo': 171, - 'larr': 8592, - 'lceil': 8968, - 'ldquo': 8220, - 'le': 8804, - 'lfloor': 8970, - 'lowast': 8727, - 'loz': 9674, - 'lrm': 8206, - 'lsaquo': 8249, - 'lsquo': 8216, - 'lt': 60, - 'macr': 175, - 'mdash': 8212, - 'micro': 181, - 'middot': 183, - 'minus': 8722, - 'mu': 956, - 'nabla': 8711, - 'nbsp': 160, - 'ndash': 8211, - 'ne': 8800, - 'ni': 8715, - 'not': 172, - 'notin': 8713, - 'nsub': 8836, - 'ntilde': 241, - 'nu': 957, - 'oacute': 243, - 'ocirc': 244, - 'oelig': 339, - 'ograve': 242, - 'oline': 8254, - 'omega': 969, - 'omicron': 959, - 'oplus': 8853, - 'or': 8744, - 'ordf': 170, - 'ordm': 186, - 'oslash': 248, - 'otilde': 245, - 'otimes': 8855, - 'ouml': 246, - 'para': 182, - 'part': 8706, - 'permil': 8240, - 'perp': 8869, - 'phi': 966, - 'pi': 960, - 'piv': 982, - 'plusmn': 177, - 'pound': 163, - 'prime': 8242, - 'prod': 8719, - 'prop': 8733, - 'psi': 968, - 'quot': 34, - 'rArr': 8658, - 'radic': 8730, - 'rang': 9002, - 'raquo': 187, - 'rarr': 8594, - 'rceil': 8969, - 'rdquo': 8221, - 'real': 8476, - 'reg': 174, - 'rfloor': 8971, - 'rho': 961, - 'rlm': 8207, - 'rsaquo': 8250, - 'rsquo': 8217, - 'sbquo': 8218, - 'scaron': 353, - 'sdot': 8901, - 'sect': 167, - 'shy': 173, - 'sigma': 963, - 'sigmaf': 962, - 'sim': 8764, - 'spades': 9824, - 'sub': 8834, - 'sube': 8838, - 'sum': 8721, - 'sup': 8835, - 'sup1': 185, - 'sup2': 178, - 'sup3': 179, - 'supe': 8839, - 'szlig': 223, - 'tau': 964, - 'there4': 8756, - 'theta': 952, - 'thetasym': 977, - 'thinsp': 8201, - 'thorn': 254, - 'tilde': 732, - 'times': 215, - 'trade': 8482, - 'uArr': 8657, - 'uacute': 250, - 'uarr': 8593, - 'ucirc': 251, - 'ugrave': 249, - 'uml': 168, - 'upsih': 978, - 'upsilon': 965, - 'uuml': 252, - 'weierp': 8472, - 'xi': 958, - 'yacute': 253, - 'yen': 165, - 'yuml': 255, - 'zeta': 950, - 'zwj': 8205, - 'zwnj': 8204 -} diff --git a/module/lib/markupsafe/_native.py b/module/lib/markupsafe/_native.py deleted file mode 100644 index 5e83f10a1..000000000 --- a/module/lib/markupsafe/_native.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -""" - markupsafe._native - ~~~~~~~~~~~~~~~~~~ - - Native Python implementation the C module is not compiled. - - :copyright: (c) 2010 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -from markupsafe import Markup -from markupsafe._compat import text_type - - -def escape(s): - """Convert the characters &, <, >, ' and " in string s to HTML-safe - sequences. Use this if you need to display text that might contain - such characters in HTML. Marks return value as markup string. - """ - if hasattr(s, '__html__'): - return s.__html__() - return Markup(text_type(s) - .replace('&', '&') - .replace('>', '>') - .replace('<', '<') - .replace("'", ''') - .replace('"', '"') - ) - - -def escape_silent(s): - """Like :func:`escape` but converts `None` into an empty - markup string. - """ - if s is None: - return Markup() - return escape(s) - - -def soft_unicode(s): - """Make a string unicode if it isn't already. That way a markup - string is not converted back to unicode. - """ - if not isinstance(s, text_type): - s = text_type(s) - return s diff --git a/module/lib/markupsafe/_speedups.c b/module/lib/markupsafe/_speedups.c deleted file mode 100644 index f349febf2..000000000 --- a/module/lib/markupsafe/_speedups.c +++ /dev/null @@ -1,239 +0,0 @@ -/** - * markupsafe._speedups - * ~~~~~~~~~~~~~~~~~~~~ - * - * This module implements functions for automatic escaping in C for better - * performance. - * - * :copyright: (c) 2010 by Armin Ronacher. - * :license: BSD. - */ - -#include - -#define ESCAPED_CHARS_TABLE_SIZE 63 -#define UNICHR(x) (PyUnicode_AS_UNICODE((PyUnicodeObject*)PyUnicode_DecodeASCII(x, strlen(x), NULL))); - -#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) -typedef int Py_ssize_t; -#define PY_SSIZE_T_MAX INT_MAX -#define PY_SSIZE_T_MIN INT_MIN -#endif - - -static PyObject* markup; -static Py_ssize_t escaped_chars_delta_len[ESCAPED_CHARS_TABLE_SIZE]; -static Py_UNICODE *escaped_chars_repl[ESCAPED_CHARS_TABLE_SIZE]; - -static int -init_constants(void) -{ - PyObject *module; - /* happing of characters to replace */ - escaped_chars_repl['"'] = UNICHR("""); - escaped_chars_repl['\''] = UNICHR("'"); - escaped_chars_repl['&'] = UNICHR("&"); - escaped_chars_repl['<'] = UNICHR("<"); - escaped_chars_repl['>'] = UNICHR(">"); - - /* lengths of those characters when replaced - 1 */ - memset(escaped_chars_delta_len, 0, sizeof (escaped_chars_delta_len)); - escaped_chars_delta_len['"'] = escaped_chars_delta_len['\''] = \ - escaped_chars_delta_len['&'] = 4; - escaped_chars_delta_len['<'] = escaped_chars_delta_len['>'] = 3; - - /* import markup type so that we can mark the return value */ - module = PyImport_ImportModule("markupsafe"); - if (!module) - return 0; - markup = PyObject_GetAttrString(module, "Markup"); - Py_DECREF(module); - - return 1; -} - -static PyObject* -escape_unicode(PyUnicodeObject *in) -{ - PyUnicodeObject *out; - Py_UNICODE *inp = PyUnicode_AS_UNICODE(in); - const Py_UNICODE *inp_end = PyUnicode_AS_UNICODE(in) + PyUnicode_GET_SIZE(in); - Py_UNICODE *next_escp; - Py_UNICODE *outp; - Py_ssize_t delta=0, erepl=0, delta_len=0; - - /* First we need to figure out how long the escaped string will be */ - while (*(inp) || inp < inp_end) { - if (*inp < ESCAPED_CHARS_TABLE_SIZE) { - delta += escaped_chars_delta_len[*inp]; - erepl += !!escaped_chars_delta_len[*inp]; - } - ++inp; - } - - /* Do we need to escape anything at all? */ - if (!erepl) { - Py_INCREF(in); - return (PyObject*)in; - } - - out = (PyUnicodeObject*)PyUnicode_FromUnicode(NULL, PyUnicode_GET_SIZE(in) + delta); - if (!out) - return NULL; - - outp = PyUnicode_AS_UNICODE(out); - inp = PyUnicode_AS_UNICODE(in); - while (erepl-- > 0) { - /* look for the next substitution */ - next_escp = inp; - while (next_escp < inp_end) { - if (*next_escp < ESCAPED_CHARS_TABLE_SIZE && - (delta_len = escaped_chars_delta_len[*next_escp])) { - ++delta_len; - break; - } - ++next_escp; - } - - if (next_escp > inp) { - /* copy unescaped chars between inp and next_escp */ - Py_UNICODE_COPY(outp, inp, next_escp-inp); - outp += next_escp - inp; - } - - /* escape 'next_escp' */ - Py_UNICODE_COPY(outp, escaped_chars_repl[*next_escp], delta_len); - outp += delta_len; - - inp = next_escp + 1; - } - if (inp < inp_end) - Py_UNICODE_COPY(outp, inp, PyUnicode_GET_SIZE(in) - (inp - PyUnicode_AS_UNICODE(in))); - - return (PyObject*)out; -} - - -static PyObject* -escape(PyObject *self, PyObject *text) -{ - PyObject *s = NULL, *rv = NULL, *html; - - /* we don't have to escape integers, bools or floats */ - if (PyLong_CheckExact(text) || -#if PY_MAJOR_VERSION < 3 - PyInt_CheckExact(text) || -#endif - PyFloat_CheckExact(text) || PyBool_Check(text) || - text == Py_None) - return PyObject_CallFunctionObjArgs(markup, text, NULL); - - /* if the object has an __html__ method that performs the escaping */ - html = PyObject_GetAttrString(text, "__html__"); - if (html) { - rv = PyObject_CallObject(html, NULL); - Py_DECREF(html); - return rv; - } - - /* otherwise make the object unicode if it isn't, then escape */ - PyErr_Clear(); - if (!PyUnicode_Check(text)) { -#if PY_MAJOR_VERSION < 3 - PyObject *unicode = PyObject_Unicode(text); -#else - PyObject *unicode = PyObject_Str(text); -#endif - if (!unicode) - return NULL; - s = escape_unicode((PyUnicodeObject*)unicode); - Py_DECREF(unicode); - } - else - s = escape_unicode((PyUnicodeObject*)text); - - /* convert the unicode string into a markup object. */ - rv = PyObject_CallFunctionObjArgs(markup, (PyObject*)s, NULL); - Py_DECREF(s); - return rv; -} - - -static PyObject* -escape_silent(PyObject *self, PyObject *text) -{ - if (text != Py_None) - return escape(self, text); - return PyObject_CallFunctionObjArgs(markup, NULL); -} - - -static PyObject* -soft_unicode(PyObject *self, PyObject *s) -{ - if (!PyUnicode_Check(s)) -#if PY_MAJOR_VERSION < 3 - return PyObject_Unicode(s); -#else - return PyObject_Str(s); -#endif - Py_INCREF(s); - return s; -} - - -static PyMethodDef module_methods[] = { - {"escape", (PyCFunction)escape, METH_O, - "escape(s) -> markup\n\n" - "Convert the characters &, <, >, ', and \" in string s to HTML-safe\n" - "sequences. Use this if you need to display text that might contain\n" - "such characters in HTML. Marks return value as markup string."}, - {"escape_silent", (PyCFunction)escape_silent, METH_O, - "escape_silent(s) -> markup\n\n" - "Like escape but converts None to an empty string."}, - {"soft_unicode", (PyCFunction)soft_unicode, METH_O, - "soft_unicode(object) -> string\n\n" - "Make a string unicode if it isn't already. That way a markup\n" - "string is not converted back to unicode."}, - {NULL, NULL, 0, NULL} /* Sentinel */ -}; - - -#if PY_MAJOR_VERSION < 3 - -#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ -#define PyMODINIT_FUNC void -#endif -PyMODINIT_FUNC -init_speedups(void) -{ - if (!init_constants()) - return; - - Py_InitModule3("markupsafe._speedups", module_methods, ""); -} - -#else /* Python 3.x module initialization */ - -static struct PyModuleDef module_definition = { - PyModuleDef_HEAD_INIT, - "markupsafe._speedups", - NULL, - -1, - module_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit__speedups(void) -{ - if (!init_constants()) - return NULL; - - return PyModule_Create(&module_definition); -} - -#endif diff --git a/module/lib/markupsafe/tests.py b/module/lib/markupsafe/tests.py deleted file mode 100644 index 636993629..000000000 --- a/module/lib/markupsafe/tests.py +++ /dev/null @@ -1,179 +0,0 @@ -# -*- coding: utf-8 -*- -import gc -import sys -import unittest -from markupsafe import Markup, escape, escape_silent -from markupsafe._compat import text_type - - -class MarkupTestCase(unittest.TestCase): - - def test_adding(self): - # adding two strings should escape the unsafe one - unsafe = '' - safe = Markup('username') - assert unsafe + safe == text_type(escape(unsafe)) + text_type(safe) - - def test_string_interpolation(self): - # string interpolations are safe to use too - assert Markup('%s') % '' == \ - '<bad user>' - assert Markup('%(username)s') % { - 'username': '' - } == '<bad user>' - - assert Markup('%i') % 3.14 == '3' - assert Markup('%.2f') % 3.14 == '3.14' - - def test_type_behavior(self): - # an escaped object is markup too - assert type(Markup('foo') + 'bar') is Markup - - # and it implements __html__ by returning itself - x = Markup("foo") - assert x.__html__() is x - - def test_html_interop(self): - # it also knows how to treat __html__ objects - class Foo(object): - def __html__(self): - return 'awesome' - def __unicode__(self): - return 'awesome' - __str__ = __unicode__ - assert Markup(Foo()) == 'awesome' - assert Markup('%s') % Foo() == \ - 'awesome' - - def test_tuple_interpol(self): - self.assertEqual(Markup('%s:%s') % ( - '', - '', - ), Markup(u'<foo>:<bar>')) - - def test_dict_interpol(self): - self.assertEqual(Markup('%(foo)s') % { - 'foo': '', - }, Markup(u'<foo>')) - self.assertEqual(Markup('%(foo)s:%(bar)s') % { - 'foo': '', - 'bar': '', - }, Markup(u'<foo>:<bar>')) - - def test_escaping(self): - # escaping and unescaping - assert escape('"<>&\'') == '"<>&'' - assert Markup("Foo & Bar").striptags() == "Foo & Bar" - assert Markup("<test>").unescape() == "" - - def test_formatting(self): - for actual, expected in ( - (Markup('%i') % 3.14, '3'), - (Markup('%.2f') % 3.14159, '3.14'), - (Markup('%s %s %s') % ('<', 123, '>'), '< 123 >'), - (Markup('{awesome}').format(awesome=''), - '<awesome>'), - (Markup('{0[1][bar]}').format([0, {'bar': ''}]), - '<bar/>'), - (Markup('{0[1][bar]}').format([0, {'bar': Markup('')}]), - '')): - assert actual == expected, "%r should be %r!" % (actual, expected) - - # This is new in 2.7 - if sys.version_info >= (2, 7): - def test_formatting_empty(self): - formatted = Markup('{}').format(0) - assert formatted == Markup('0') - - def test_custom_formatting(self): - class HasHTMLOnly(object): - def __html__(self): - return Markup('') - - class HasHTMLAndFormat(object): - def __html__(self): - return Markup('') - def __html_format__(self, spec): - return Markup('') - - assert Markup('{0}').format(HasHTMLOnly()) == Markup('') - assert Markup('{0}').format(HasHTMLAndFormat()) == Markup('') - - def test_complex_custom_formatting(self): - class User(object): - def __init__(self, id, username): - self.id = id - self.username = username - def __html_format__(self, format_spec): - if format_spec == 'link': - return Markup('{1}').format( - self.id, - self.__html__(), - ) - elif format_spec: - raise ValueError('Invalid format spec') - return self.__html__() - def __html__(self): - return Markup('{0}').format(self.username) - - user = User(1, 'foo') - assert Markup('

    User: {0:link}').format(user) == \ - Markup('

    User: foo') - - def test_all_set(self): - import markupsafe as markup - for item in markup.__all__: - getattr(markup, item) - - def test_escape_silent(self): - assert escape_silent(None) == Markup() - assert escape(None) == Markup(None) - assert escape_silent('') == Markup(u'<foo>') - - def test_splitting(self): - self.assertEqual(Markup('a b').split(), [ - Markup('a'), - Markup('b') - ]) - self.assertEqual(Markup('a b').rsplit(), [ - Markup('a'), - Markup('b') - ]) - self.assertEqual(Markup('a\nb').splitlines(), [ - Markup('a'), - Markup('b') - ]) - - def test_mul(self): - self.assertEqual(Markup('a') * 3, Markup('aaa')) - - -class MarkupLeakTestCase(unittest.TestCase): - - def test_markup_leaks(self): - counts = set() - for count in range(20): - for item in range(1000): - escape("foo") - escape("") - escape(u"foo") - escape(u"") - counts.add(len(gc.get_objects())) - assert len(counts) == 1, 'ouch, c extension seems to leak objects' - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(MarkupTestCase)) - - # this test only tests the c extension - if not hasattr(escape, 'func_code'): - suite.addTest(unittest.makeSuite(MarkupLeakTestCase)) - - return suite - - -if __name__ == '__main__': - unittest.main(defaultTest='suite') - -# vim:sts=4:sw=4:et: diff --git a/module/lib/rename_process.py b/module/lib/rename_process.py deleted file mode 100644 index 2527cef39..000000000 --- a/module/lib/rename_process.py +++ /dev/null @@ -1,14 +0,0 @@ -import sys - -def renameProcess(new_name): - """ Renames the process calling the function to the given name. """ - if sys.platform != 'linux2': - return False - try: - from ctypes import CDLL - libc = CDLL('libc.so.6') - libc.prctl(15, new_name, 0, 0, 0) - return True - except Exception, e: - #print "Rename process failed", e - return False diff --git a/module/lib/simplejson/__init__.py b/module/lib/simplejson/__init__.py deleted file mode 100644 index a5c01379a..000000000 --- a/module/lib/simplejson/__init__.py +++ /dev/null @@ -1,560 +0,0 @@ -r"""JSON (JavaScript Object Notation) is a subset of -JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data -interchange format. - -:mod:`simplejson` exposes an API familiar to users of the standard library -:mod:`marshal` and :mod:`pickle` modules. It is the externally maintained -version of the :mod:`json` library contained in Python 2.6, but maintains -compatibility with Python 2.4 and Python 2.5 and (currently) has -significant performance advantages, even without using the optional C -extension for speedups. - -Encoding basic Python object hierarchies:: - - >>> import simplejson as json - >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) - '["foo", {"bar": ["baz", null, 1.0, 2]}]' - >>> print(json.dumps("\"foo\bar")) - "\"foo\bar" - >>> print(json.dumps(u'\u1234')) - "\u1234" - >>> print(json.dumps('\\')) - "\\" - >>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)) - {"a": 0, "b": 0, "c": 0} - >>> from simplejson.compat import StringIO - >>> io = StringIO() - >>> json.dump(['streaming API'], io) - >>> io.getvalue() - '["streaming API"]' - -Compact encoding:: - - >>> import simplejson as json - >>> obj = [1,2,3,{'4': 5, '6': 7}] - >>> json.dumps(obj, separators=(',',':'), sort_keys=True) - '[1,2,3,{"4":5,"6":7}]' - -Pretty printing:: - - >>> import simplejson as json - >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=' ')) - { - "4": 5, - "6": 7 - } - -Decoding JSON:: - - >>> import simplejson as json - >>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}] - >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj - True - >>> json.loads('"\\"foo\\bar"') == u'"foo\x08ar' - True - >>> from simplejson.compat import StringIO - >>> io = StringIO('["streaming API"]') - >>> json.load(io)[0] == 'streaming API' - True - -Specializing JSON object decoding:: - - >>> import simplejson as json - >>> def as_complex(dct): - ... if '__complex__' in dct: - ... return complex(dct['real'], dct['imag']) - ... return dct - ... - >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}', - ... object_hook=as_complex) - (1+2j) - >>> from decimal import Decimal - >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1') - True - -Specializing JSON object encoding:: - - >>> import simplejson as json - >>> def encode_complex(obj): - ... if isinstance(obj, complex): - ... return [obj.real, obj.imag] - ... raise TypeError(repr(o) + " is not JSON serializable") - ... - >>> json.dumps(2 + 1j, default=encode_complex) - '[2.0, 1.0]' - >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j) - '[2.0, 1.0]' - >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j)) - '[2.0, 1.0]' - - -Using simplejson.tool from the shell to validate and pretty-print:: - - $ echo '{"json":"obj"}' | python -m simplejson.tool - { - "json": "obj" - } - $ echo '{ 1.2:3.4}' | python -m simplejson.tool - Expecting property name: line 1 column 3 (char 2) -""" -from __future__ import absolute_import -__version__ = '3.5.3' -__all__ = [ - 'dump', 'dumps', 'load', 'loads', - 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder', - 'OrderedDict', 'simple_first', -] - -__author__ = 'Bob Ippolito ' - -from decimal import Decimal - -from .scanner import JSONDecodeError -from .decoder import JSONDecoder -from .encoder import JSONEncoder, JSONEncoderForHTML -def _import_OrderedDict(): - import collections - try: - return collections.OrderedDict - except AttributeError: - from . import ordered_dict - return ordered_dict.OrderedDict -OrderedDict = _import_OrderedDict() - -def _import_c_make_encoder(): - try: - from ._speedups import make_encoder - return make_encoder - except ImportError: - return None - -_default_encoder = JSONEncoder( - skipkeys=False, - ensure_ascii=True, - check_circular=True, - allow_nan=True, - indent=None, - separators=None, - encoding='utf-8', - default=None, - use_decimal=True, - namedtuple_as_object=True, - tuple_as_array=True, - bigint_as_string=False, - item_sort_key=None, - for_json=False, - ignore_nan=False, - int_as_string_bitcount=None, -) - -def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, - allow_nan=True, cls=None, indent=None, separators=None, - encoding='utf-8', default=None, use_decimal=True, - namedtuple_as_object=True, tuple_as_array=True, - bigint_as_string=False, sort_keys=False, item_sort_key=None, - for_json=False, ignore_nan=False, int_as_string_bitcount=None, **kw): - """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a - ``.write()``-supporting file-like object). - - If *skipkeys* is true then ``dict`` keys that are not basic types - (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) - will be skipped instead of raising a ``TypeError``. - - If *ensure_ascii* is false, then the some chunks written to ``fp`` - may be ``unicode`` instances, subject to normal Python ``str`` to - ``unicode`` coercion rules. Unless ``fp.write()`` explicitly - understands ``unicode`` (as in ``codecs.getwriter()``) this is likely - to cause an error. - - If *check_circular* is false, then the circular reference check - for container types will be skipped and a circular reference will - result in an ``OverflowError`` (or worse). - - If *allow_nan* is false, then it will be a ``ValueError`` to - serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) - in strict compliance of the original JSON specification, instead of using - the JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). See - *ignore_nan* for ECMA-262 compliant behavior. - - If *indent* is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, *separators* should be an - ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')`` - if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most - compact JSON representation, you should specify ``(',', ':')`` to eliminate - whitespace. - - *encoding* is the character encoding for str instances, default is UTF-8. - - *default(obj)* is a function that should return a serializable version - of obj or raise ``TypeError``. The default simply raises ``TypeError``. - - If *use_decimal* is true (default: ``True``) then decimal.Decimal - will be natively serialized to JSON with full precision. - - If *namedtuple_as_object* is true (default: ``True``), - :class:`tuple` subclasses with ``_asdict()`` methods will be encoded - as JSON objects. - - If *tuple_as_array* is true (default: ``True``), - :class:`tuple` (and subclasses) will be encoded as JSON arrays. - - If *bigint_as_string* is true (default: ``False``), ints 2**53 and higher - or lower than -2**53 will be encoded as strings. This is to avoid the - rounding that happens in Javascript otherwise. Note that this is still a - lossy operation that will not round-trip correctly and should be used - sparingly. - - If *int_as_string_bitcount* is a positive number (n), then int of size - greater than or equal to 2**n or lower than or equal to -2**n will be - encoded as strings. - - If specified, *item_sort_key* is a callable used to sort the items in - each dictionary. This is useful if you want to sort items other than - in alphabetical order by key. This option takes precedence over - *sort_keys*. - - If *sort_keys* is true (default: ``False``), the output of dictionaries - will be sorted by item. - - If *for_json* is true (default: ``False``), objects with a ``for_json()`` - method will use the return value of that method for encoding as JSON - instead of the object. - - If *ignore_nan* is true (default: ``False``), then out of range - :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as - ``null`` in compliance with the ECMA-262 specification. If true, this will - override *allow_nan*. - - To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the - ``.default()`` method to serialize additional types), specify it with - the ``cls`` kwarg. NOTE: You should use *default* or *for_json* instead - of subclassing whenever possible. - - """ - # cached encoder - if (not skipkeys and ensure_ascii and - check_circular and allow_nan and - cls is None and indent is None and separators is None and - encoding == 'utf-8' and default is None and use_decimal - and namedtuple_as_object and tuple_as_array - and not bigint_as_string and int_as_string_bitcount is None - and not item_sort_key and not for_json and not ignore_nan and not kw): - iterable = _default_encoder.iterencode(obj) - else: - if cls is None: - cls = JSONEncoder - iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, - check_circular=check_circular, allow_nan=allow_nan, indent=indent, - separators=separators, encoding=encoding, - default=default, use_decimal=use_decimal, - namedtuple_as_object=namedtuple_as_object, - tuple_as_array=tuple_as_array, - bigint_as_string=bigint_as_string, - sort_keys=sort_keys, - item_sort_key=item_sort_key, - for_json=for_json, - ignore_nan=ignore_nan, - int_as_string_bitcount=int_as_string_bitcount, - **kw).iterencode(obj) - # could accelerate with writelines in some versions of Python, at - # a debuggability cost - for chunk in iterable: - fp.write(chunk) - - -def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, - allow_nan=True, cls=None, indent=None, separators=None, - encoding='utf-8', default=None, use_decimal=True, - namedtuple_as_object=True, tuple_as_array=True, - bigint_as_string=False, sort_keys=False, item_sort_key=None, - for_json=False, ignore_nan=False, int_as_string_bitcount=None, **kw): - """Serialize ``obj`` to a JSON formatted ``str``. - - If ``skipkeys`` is false then ``dict`` keys that are not basic types - (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) - will be skipped instead of raising a ``TypeError``. - - If ``ensure_ascii`` is false, then the return value will be a - ``unicode`` instance subject to normal Python ``str`` to ``unicode`` - coercion rules instead of being escaped to an ASCII ``str``. - - If ``check_circular`` is false, then the circular reference check - for container types will be skipped and a circular reference will - result in an ``OverflowError`` (or worse). - - If ``allow_nan`` is false, then it will be a ``ValueError`` to - serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in - strict compliance of the JSON specification, instead of using the - JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). - - If ``indent`` is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, ``separators`` should be an - ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')`` - if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most - compact JSON representation, you should specify ``(',', ':')`` to eliminate - whitespace. - - ``encoding`` is the character encoding for str instances, default is UTF-8. - - ``default(obj)`` is a function that should return a serializable version - of obj or raise TypeError. The default simply raises TypeError. - - If *use_decimal* is true (default: ``True``) then decimal.Decimal - will be natively serialized to JSON with full precision. - - If *namedtuple_as_object* is true (default: ``True``), - :class:`tuple` subclasses with ``_asdict()`` methods will be encoded - as JSON objects. - - If *tuple_as_array* is true (default: ``True``), - :class:`tuple` (and subclasses) will be encoded as JSON arrays. - - If *bigint_as_string* is true (not the default), ints 2**53 and higher - or lower than -2**53 will be encoded as strings. This is to avoid the - rounding that happens in Javascript otherwise. - - If *int_as_string_bitcount* is a positive number (n), then int of size - greater than or equal to 2**n or lower than or equal to -2**n will be - encoded as strings. - - If specified, *item_sort_key* is a callable used to sort the items in - each dictionary. This is useful if you want to sort items other than - in alphabetical order by key. This option takes precendence over - *sort_keys*. - - If *sort_keys* is true (default: ``False``), the output of dictionaries - will be sorted by item. - - If *for_json* is true (default: ``False``), objects with a ``for_json()`` - method will use the return value of that method for encoding as JSON - instead of the object. - - If *ignore_nan* is true (default: ``False``), then out of range - :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as - ``null`` in compliance with the ECMA-262 specification. If true, this will - override *allow_nan*. - - To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the - ``.default()`` method to serialize additional types), specify it with - the ``cls`` kwarg. NOTE: You should use *default* instead of subclassing - whenever possible. - - """ - # cached encoder - if ( - not skipkeys and ensure_ascii and - check_circular and allow_nan and - cls is None and indent is None and separators is None and - encoding == 'utf-8' and default is None and use_decimal - and namedtuple_as_object and tuple_as_array - and not bigint_as_string and int_as_string_bitcount is None - and not sort_keys and not item_sort_key and not for_json - and not ignore_nan and not kw - ): - return _default_encoder.encode(obj) - if cls is None: - cls = JSONEncoder - return cls( - skipkeys=skipkeys, ensure_ascii=ensure_ascii, - check_circular=check_circular, allow_nan=allow_nan, indent=indent, - separators=separators, encoding=encoding, default=default, - use_decimal=use_decimal, - namedtuple_as_object=namedtuple_as_object, - tuple_as_array=tuple_as_array, - bigint_as_string=bigint_as_string, - sort_keys=sort_keys, - item_sort_key=item_sort_key, - for_json=for_json, - ignore_nan=ignore_nan, - int_as_string_bitcount=int_as_string_bitcount, - **kw).encode(obj) - - -_default_decoder = JSONDecoder(encoding=None, object_hook=None, - object_pairs_hook=None) - - -def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, object_pairs_hook=None, - use_decimal=False, namedtuple_as_object=True, tuple_as_array=True, - **kw): - """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing - a JSON document) to a Python object. - - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - If *use_decimal* is true (default: ``False``) then it implies - parse_float=decimal.Decimal for parity with ``dump``. - - To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` - kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead - of subclassing whenever possible. - - """ - return loads(fp.read(), - encoding=encoding, cls=cls, object_hook=object_hook, - parse_float=parse_float, parse_int=parse_int, - parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, - use_decimal=use_decimal, **kw) - - -def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, object_pairs_hook=None, - use_decimal=False, **kw): - """Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON - document) to a Python object. - - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - If *use_decimal* is true (default: ``False``) then it implies - parse_float=decimal.Decimal for parity with ``dump``. - - To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` - kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead - of subclassing whenever possible. - - """ - if (cls is None and encoding is None and object_hook is None and - parse_int is None and parse_float is None and - parse_constant is None and object_pairs_hook is None - and not use_decimal and not kw): - return _default_decoder.decode(s) - if cls is None: - cls = JSONDecoder - if object_hook is not None: - kw['object_hook'] = object_hook - if object_pairs_hook is not None: - kw['object_pairs_hook'] = object_pairs_hook - if parse_float is not None: - kw['parse_float'] = parse_float - if parse_int is not None: - kw['parse_int'] = parse_int - if parse_constant is not None: - kw['parse_constant'] = parse_constant - if use_decimal: - if parse_float is not None: - raise TypeError("use_decimal=True implies parse_float=Decimal") - kw['parse_float'] = Decimal - return cls(encoding=encoding, **kw).decode(s) - - -def _toggle_speedups(enabled): - from . import decoder as dec - from . import encoder as enc - from . import scanner as scan - c_make_encoder = _import_c_make_encoder() - if enabled: - dec.scanstring = dec.c_scanstring or dec.py_scanstring - enc.c_make_encoder = c_make_encoder - enc.encode_basestring_ascii = (enc.c_encode_basestring_ascii or - enc.py_encode_basestring_ascii) - scan.make_scanner = scan.c_make_scanner or scan.py_make_scanner - else: - dec.scanstring = dec.py_scanstring - enc.c_make_encoder = None - enc.encode_basestring_ascii = enc.py_encode_basestring_ascii - scan.make_scanner = scan.py_make_scanner - dec.make_scanner = scan.make_scanner - global _default_decoder - _default_decoder = JSONDecoder( - encoding=None, - object_hook=None, - object_pairs_hook=None, - ) - global _default_encoder - _default_encoder = JSONEncoder( - skipkeys=False, - ensure_ascii=True, - check_circular=True, - allow_nan=True, - indent=None, - separators=None, - encoding='utf-8', - default=None, - ) - -def simple_first(kv): - """Helper function to pass to item_sort_key to sort simple - elements to the top, then container elements. - """ - return (isinstance(kv[1], (list, dict, tuple)), kv[0]) diff --git a/module/lib/simplejson/compat.py b/module/lib/simplejson/compat.py deleted file mode 100644 index a0af4a1cb..000000000 --- a/module/lib/simplejson/compat.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Python 3 compatibility shims -""" -import sys -if sys.version_info[0] < 3: - PY3 = False - def b(s): - return s - def u(s): - return unicode(s, 'unicode_escape') - import cStringIO as StringIO - StringIO = BytesIO = StringIO.StringIO - text_type = unicode - binary_type = str - string_types = (basestring,) - integer_types = (int, long) - unichr = unichr - reload_module = reload - def fromhex(s): - return s.decode('hex') - -else: - PY3 = True - if sys.version_info[:2] >= (3, 4): - from importlib import reload as reload_module - else: - from imp import reload as reload_module - import codecs - def b(s): - return codecs.latin_1_encode(s)[0] - def u(s): - return s - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - text_type = str - binary_type = bytes - string_types = (str,) - integer_types = (int,) - - def unichr(s): - return u(chr(s)) - - def fromhex(s): - return bytes.fromhex(s) - -long_type = integer_types[-1] diff --git a/module/lib/simplejson/decoder.py b/module/lib/simplejson/decoder.py deleted file mode 100644 index 1a6c5d938..000000000 --- a/module/lib/simplejson/decoder.py +++ /dev/null @@ -1,393 +0,0 @@ -"""Implementation of JSONDecoder -""" -from __future__ import absolute_import -import re -import sys -import struct -from .compat import fromhex, b, u, text_type, binary_type, PY3, unichr -from .scanner import make_scanner, JSONDecodeError - -def _import_c_scanstring(): - try: - from ._speedups import scanstring - return scanstring - except ImportError: - return None -c_scanstring = _import_c_scanstring() - -# NOTE (3.1.0): JSONDecodeError may still be imported from this module for -# compatibility, but it was never in the __all__ -__all__ = ['JSONDecoder'] - -FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL - -def _floatconstants(): - _BYTES = fromhex('7FF80000000000007FF0000000000000') - # The struct module in Python 2.4 would get frexp() out of range here - # when an endian is specified in the format string. Fixed in Python 2.5+ - if sys.byteorder != 'big': - _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1] - nan, inf = struct.unpack('dd', _BYTES) - return nan, inf, -inf - -NaN, PosInf, NegInf = _floatconstants() - -_CONSTANTS = { - '-Infinity': NegInf, - 'Infinity': PosInf, - 'NaN': NaN, -} - -STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS) -BACKSLASH = { - '"': u('"'), '\\': u('\u005c'), '/': u('/'), - 'b': u('\b'), 'f': u('\f'), 'n': u('\n'), 'r': u('\r'), 't': u('\t'), -} - -DEFAULT_ENCODING = "utf-8" - -def py_scanstring(s, end, encoding=None, strict=True, - _b=BACKSLASH, _m=STRINGCHUNK.match, _join=u('').join, - _PY3=PY3, _maxunicode=sys.maxunicode): - """Scan the string s for a JSON string. End is the index of the - character in s after the quote that started the JSON string. - Unescapes all valid JSON string escape sequences and raises ValueError - on attempt to decode an invalid string. If strict is False then literal - control characters are allowed in the string. - - Returns a tuple of the decoded string and the index of the character in s - after the end quote.""" - if encoding is None: - encoding = DEFAULT_ENCODING - chunks = [] - _append = chunks.append - begin = end - 1 - while 1: - chunk = _m(s, end) - if chunk is None: - raise JSONDecodeError( - "Unterminated string starting at", s, begin) - end = chunk.end() - content, terminator = chunk.groups() - # Content is contains zero or more unescaped string characters - if content: - if not _PY3 and not isinstance(content, text_type): - content = text_type(content, encoding) - _append(content) - # Terminator is the end of string, a literal control character, - # or a backslash denoting that an escape sequence follows - if terminator == '"': - break - elif terminator != '\\': - if strict: - msg = "Invalid control character %r at" - raise JSONDecodeError(msg, s, end) - else: - _append(terminator) - continue - try: - esc = s[end] - except IndexError: - raise JSONDecodeError( - "Unterminated string starting at", s, begin) - # If not a unicode escape sequence, must be in the lookup table - if esc != 'u': - try: - char = _b[esc] - except KeyError: - msg = "Invalid \\X escape sequence %r" - raise JSONDecodeError(msg, s, end) - end += 1 - else: - # Unicode escape sequence - msg = "Invalid \\uXXXX escape sequence" - esc = s[end + 1:end + 5] - escX = esc[1:2] - if len(esc) != 4 or escX == 'x' or escX == 'X': - raise JSONDecodeError(msg, s, end - 1) - try: - uni = int(esc, 16) - except ValueError: - raise JSONDecodeError(msg, s, end - 1) - end += 5 - # Check for surrogate pair on UCS-4 systems - # Note that this will join high/low surrogate pairs - # but will also pass unpaired surrogates through - if (_maxunicode > 65535 and - uni & 0xfc00 == 0xd800 and - s[end:end + 2] == '\\u'): - esc2 = s[end + 2:end + 6] - escX = esc2[1:2] - if len(esc2) == 4 and not (escX == 'x' or escX == 'X'): - try: - uni2 = int(esc2, 16) - except ValueError: - raise JSONDecodeError(msg, s, end) - if uni2 & 0xfc00 == 0xdc00: - uni = 0x10000 + (((uni - 0xd800) << 10) | - (uni2 - 0xdc00)) - end += 6 - char = unichr(uni) - # Append the unescaped character - _append(char) - return _join(chunks), end - - -# Use speedup if available -scanstring = c_scanstring or py_scanstring - -WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS) -WHITESPACE_STR = ' \t\n\r' - -def JSONObject(state, encoding, strict, scan_once, object_hook, - object_pairs_hook, memo=None, - _w=WHITESPACE.match, _ws=WHITESPACE_STR): - (s, end) = state - # Backwards compatibility - if memo is None: - memo = {} - memo_get = memo.setdefault - pairs = [] - # Use a slice to prevent IndexError from being raised, the following - # check will raise a more specific ValueError if the string is empty - nextchar = s[end:end + 1] - # Normally we expect nextchar == '"' - if nextchar != '"': - if nextchar in _ws: - end = _w(s, end).end() - nextchar = s[end:end + 1] - # Trivial empty object - if nextchar == '}': - if object_pairs_hook is not None: - result = object_pairs_hook(pairs) - return result, end + 1 - pairs = {} - if object_hook is not None: - pairs = object_hook(pairs) - return pairs, end + 1 - elif nextchar != '"': - raise JSONDecodeError( - "Expecting property name enclosed in double quotes", - s, end) - end += 1 - while True: - key, end = scanstring(s, end, encoding, strict) - key = memo_get(key, key) - - # To skip some function call overhead we optimize the fast paths where - # the JSON key separator is ": " or just ":". - if s[end:end + 1] != ':': - end = _w(s, end).end() - if s[end:end + 1] != ':': - raise JSONDecodeError("Expecting ':' delimiter", s, end) - - end += 1 - - try: - if s[end] in _ws: - end += 1 - if s[end] in _ws: - end = _w(s, end + 1).end() - except IndexError: - pass - - value, end = scan_once(s, end) - pairs.append((key, value)) - - try: - nextchar = s[end] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end] - except IndexError: - nextchar = '' - end += 1 - - if nextchar == '}': - break - elif nextchar != ',': - raise JSONDecodeError("Expecting ',' delimiter or '}'", s, end - 1) - - try: - nextchar = s[end] - if nextchar in _ws: - end += 1 - nextchar = s[end] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end] - except IndexError: - nextchar = '' - - end += 1 - if nextchar != '"': - raise JSONDecodeError( - "Expecting property name enclosed in double quotes", - s, end - 1) - - if object_pairs_hook is not None: - result = object_pairs_hook(pairs) - return result, end - pairs = dict(pairs) - if object_hook is not None: - pairs = object_hook(pairs) - return pairs, end - -def JSONArray(state, scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR): - (s, end) = state - values = [] - nextchar = s[end:end + 1] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end:end + 1] - # Look-ahead for trivial empty array - if nextchar == ']': - return values, end + 1 - elif nextchar == '': - raise JSONDecodeError("Expecting value or ']'", s, end) - _append = values.append - while True: - value, end = scan_once(s, end) - _append(value) - nextchar = s[end:end + 1] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end:end + 1] - end += 1 - if nextchar == ']': - break - elif nextchar != ',': - raise JSONDecodeError("Expecting ',' delimiter or ']'", s, end - 1) - - try: - if s[end] in _ws: - end += 1 - if s[end] in _ws: - end = _w(s, end + 1).end() - except IndexError: - pass - - return values, end - -class JSONDecoder(object): - """Simple JSON decoder - - Performs the following translations in decoding by default: - - +---------------+-------------------+ - | JSON | Python | - +===============+===================+ - | object | dict | - +---------------+-------------------+ - | array | list | - +---------------+-------------------+ - | string | str, unicode | - +---------------+-------------------+ - | number (int) | int, long | - +---------------+-------------------+ - | number (real) | float | - +---------------+-------------------+ - | true | True | - +---------------+-------------------+ - | false | False | - +---------------+-------------------+ - | null | None | - +---------------+-------------------+ - - It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as - their corresponding ``float`` values, which is outside the JSON spec. - - """ - - def __init__(self, encoding=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, strict=True, - object_pairs_hook=None): - """ - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - *strict* controls the parser's behavior when it encounters an - invalid control character in a string. The default setting of - ``True`` means that unescaped control characters are parse errors, if - ``False`` then control characters will be allowed in strings. - - """ - if encoding is None: - encoding = DEFAULT_ENCODING - self.encoding = encoding - self.object_hook = object_hook - self.object_pairs_hook = object_pairs_hook - self.parse_float = parse_float or float - self.parse_int = parse_int or int - self.parse_constant = parse_constant or _CONSTANTS.__getitem__ - self.strict = strict - self.parse_object = JSONObject - self.parse_array = JSONArray - self.parse_string = scanstring - self.memo = {} - self.scan_once = make_scanner(self) - - def decode(self, s, _w=WHITESPACE.match, _PY3=PY3): - """Return the Python representation of ``s`` (a ``str`` or ``unicode`` - instance containing a JSON document) - - """ - if _PY3 and isinstance(s, binary_type): - s = s.decode(self.encoding) - obj, end = self.raw_decode(s) - end = _w(s, end).end() - if end != len(s): - raise JSONDecodeError("Extra data", s, end, len(s)) - return obj - - def raw_decode(self, s, idx=0, _w=WHITESPACE.match, _PY3=PY3): - """Decode a JSON document from ``s`` (a ``str`` or ``unicode`` - beginning with a JSON document) and return a 2-tuple of the Python - representation and the index in ``s`` where the document ended. - Optionally, ``idx`` can be used to specify an offset in ``s`` where - the JSON document begins. - - This can be used to decode a JSON document from a string that may - have extraneous data at the end. - - """ - if idx < 0: - # Ensure that raw_decode bails on negative indexes, the regex - # would otherwise mask this behavior. #98 - raise JSONDecodeError('Expecting value', s, idx) - if _PY3 and not isinstance(s, text_type): - raise TypeError("Input string must be text, not bytes") - return self.scan_once(s, idx=_w(s, idx).end()) diff --git a/module/lib/simplejson/encoder.py b/module/lib/simplejson/encoder.py deleted file mode 100644 index db18244ec..000000000 --- a/module/lib/simplejson/encoder.py +++ /dev/null @@ -1,648 +0,0 @@ -"""Implementation of JSONEncoder -""" -from __future__ import absolute_import -import re -from operator import itemgetter -from decimal import Decimal -from .compat import u, unichr, binary_type, string_types, integer_types, PY3 -def _import_speedups(): - try: - from . import _speedups - return _speedups.encode_basestring_ascii, _speedups.make_encoder - except ImportError: - return None, None -c_encode_basestring_ascii, c_make_encoder = _import_speedups() - -from simplejson.decoder import PosInf - -#ESCAPE = re.compile(ur'[\x00-\x1f\\"\b\f\n\r\t\u2028\u2029]') -# This is required because u() will mangle the string and ur'' isn't valid -# python3 syntax -ESCAPE = re.compile(u'[\\x00-\\x1f\\\\"\\b\\f\\n\\r\\t\u2028\u2029]') -ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') -HAS_UTF8 = re.compile(r'[\x80-\xff]') -ESCAPE_DCT = { - '\\': '\\\\', - '"': '\\"', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', -} -for i in range(0x20): - #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) - ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,)) -for i in [0x2028, 0x2029]: - ESCAPE_DCT.setdefault(unichr(i), '\\u%04x' % (i,)) - -FLOAT_REPR = repr - -def encode_basestring(s, _PY3=PY3, _q=u('"')): - """Return a JSON representation of a Python string - - """ - if _PY3: - if isinstance(s, binary_type): - s = s.decode('utf-8') - else: - if isinstance(s, str) and HAS_UTF8.search(s) is not None: - s = s.decode('utf-8') - def replace(match): - return ESCAPE_DCT[match.group(0)] - return _q + ESCAPE.sub(replace, s) + _q - - -def py_encode_basestring_ascii(s, _PY3=PY3): - """Return an ASCII-only JSON representation of a Python string - - """ - if _PY3: - if isinstance(s, binary_type): - s = s.decode('utf-8') - else: - if isinstance(s, str) and HAS_UTF8.search(s) is not None: - s = s.decode('utf-8') - def replace(match): - s = match.group(0) - try: - return ESCAPE_DCT[s] - except KeyError: - n = ord(s) - if n < 0x10000: - #return '\\u{0:04x}'.format(n) - return '\\u%04x' % (n,) - else: - # surrogate pair - n -= 0x10000 - s1 = 0xd800 | ((n >> 10) & 0x3ff) - s2 = 0xdc00 | (n & 0x3ff) - #return '\\u{0:04x}\\u{1:04x}'.format(s1, s2) - return '\\u%04x\\u%04x' % (s1, s2) - return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"' - - -encode_basestring_ascii = ( - c_encode_basestring_ascii or py_encode_basestring_ascii) - -class JSONEncoder(object): - """Extensible JSON encoder for Python data structures. - - Supports the following objects and types by default: - - +-------------------+---------------+ - | Python | JSON | - +===================+===============+ - | dict, namedtuple | object | - +-------------------+---------------+ - | list, tuple | array | - +-------------------+---------------+ - | str, unicode | string | - +-------------------+---------------+ - | int, long, float | number | - +-------------------+---------------+ - | True | true | - +-------------------+---------------+ - | False | false | - +-------------------+---------------+ - | None | null | - +-------------------+---------------+ - - To extend this to recognize other objects, subclass and implement a - ``.default()`` method with another method that returns a serializable - object for ``o`` if possible, otherwise it should call the superclass - implementation (to raise ``TypeError``). - - """ - item_separator = ', ' - key_separator = ': ' - - def __init__(self, skipkeys=False, ensure_ascii=True, - check_circular=True, allow_nan=True, sort_keys=False, - indent=None, separators=None, encoding='utf-8', default=None, - use_decimal=True, namedtuple_as_object=True, - tuple_as_array=True, bigint_as_string=False, - item_sort_key=None, for_json=False, ignore_nan=False, - int_as_string_bitcount=None): - """Constructor for JSONEncoder, with sensible defaults. - - If skipkeys is false, then it is a TypeError to attempt - encoding of keys that are not str, int, long, float or None. If - skipkeys is True, such items are simply skipped. - - If ensure_ascii is true, the output is guaranteed to be str - objects with all incoming unicode characters escaped. If - ensure_ascii is false, the output will be unicode object. - - If check_circular is true, then lists, dicts, and custom encoded - objects will be checked for circular references during encoding to - prevent an infinite recursion (which would cause an OverflowError). - Otherwise, no such check takes place. - - If allow_nan is true, then NaN, Infinity, and -Infinity will be - encoded as such. This behavior is not JSON specification compliant, - but is consistent with most JavaScript based encoders and decoders. - Otherwise, it will be a ValueError to encode such floats. - - If sort_keys is true, then the output of dictionaries will be - sorted by key; this is useful for regression tests to ensure - that JSON serializations can be compared on a day-to-day basis. - - If indent is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, separators should be an (item_separator, key_separator) - tuple. The default is (', ', ': ') if *indent* is ``None`` and - (',', ': ') otherwise. To get the most compact JSON representation, - you should specify (',', ':') to eliminate whitespace. - - If specified, default is a function that gets called for objects - that can't otherwise be serialized. It should return a JSON encodable - version of the object or raise a ``TypeError``. - - If encoding is not None, then all input strings will be - transformed into unicode using that encoding prior to JSON-encoding. - The default is UTF-8. - - If use_decimal is true (not the default), ``decimal.Decimal`` will - be supported directly by the encoder. For the inverse, decode JSON - with ``parse_float=decimal.Decimal``. - - If namedtuple_as_object is true (the default), objects with - ``_asdict()`` methods will be encoded as JSON objects. - - If tuple_as_array is true (the default), tuple (and subclasses) will - be encoded as JSON arrays. - - If bigint_as_string is true (not the default), ints 2**53 and higher - or lower than -2**53 will be encoded as strings. This is to avoid the - rounding that happens in Javascript otherwise. - - If int_as_string_bitcount is a positive number (n), then int of size - greater than or equal to 2**n or lower than or equal to -2**n will be - encoded as strings. - - If specified, item_sort_key is a callable used to sort the items in - each dictionary. This is useful if you want to sort items other than - in alphabetical order by key. - - If for_json is true (not the default), objects with a ``for_json()`` - method will use the return value of that method for encoding as JSON - instead of the object. - - If *ignore_nan* is true (default: ``False``), then out of range - :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized - as ``null`` in compliance with the ECMA-262 specification. If true, - this will override *allow_nan*. - - """ - - self.skipkeys = skipkeys - self.ensure_ascii = ensure_ascii - self.check_circular = check_circular - self.allow_nan = allow_nan - self.sort_keys = sort_keys - self.use_decimal = use_decimal - self.namedtuple_as_object = namedtuple_as_object - self.tuple_as_array = tuple_as_array - self.bigint_as_string = bigint_as_string - self.item_sort_key = item_sort_key - self.for_json = for_json - self.ignore_nan = ignore_nan - self.int_as_string_bitcount = int_as_string_bitcount - if indent is not None and not isinstance(indent, string_types): - indent = indent * ' ' - self.indent = indent - if separators is not None: - self.item_separator, self.key_separator = separators - elif indent is not None: - self.item_separator = ',' - if default is not None: - self.default = default - self.encoding = encoding - - def default(self, o): - """Implement this method in a subclass such that it returns - a serializable object for ``o``, or calls the base implementation - (to raise a ``TypeError``). - - For example, to support arbitrary iterators, you could - implement default like this:: - - def default(self, o): - try: - iterable = iter(o) - except TypeError: - pass - else: - return list(iterable) - return JSONEncoder.default(self, o) - - """ - raise TypeError(repr(o) + " is not JSON serializable") - - def encode(self, o): - """Return a JSON string representation of a Python data structure. - - >>> from simplejson import JSONEncoder - >>> JSONEncoder().encode({"foo": ["bar", "baz"]}) - '{"foo": ["bar", "baz"]}' - - """ - # This is for extremely simple cases and benchmarks. - if isinstance(o, binary_type): - _encoding = self.encoding - if (_encoding is not None and not (_encoding == 'utf-8')): - o = o.decode(_encoding) - if isinstance(o, string_types): - if self.ensure_ascii: - return encode_basestring_ascii(o) - else: - return encode_basestring(o) - # This doesn't pass the iterator directly to ''.join() because the - # exceptions aren't as detailed. The list call should be roughly - # equivalent to the PySequence_Fast that ''.join() would do. - chunks = self.iterencode(o, _one_shot=True) - if not isinstance(chunks, (list, tuple)): - chunks = list(chunks) - if self.ensure_ascii: - return ''.join(chunks) - else: - return u''.join(chunks) - - def iterencode(self, o, _one_shot=False): - """Encode the given object and yield each string - representation as available. - - For example:: - - for chunk in JSONEncoder().iterencode(bigobject): - mysocket.write(chunk) - - """ - if self.check_circular: - markers = {} - else: - markers = None - if self.ensure_ascii: - _encoder = encode_basestring_ascii - else: - _encoder = encode_basestring - if self.encoding != 'utf-8': - def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding): - if isinstance(o, binary_type): - o = o.decode(_encoding) - return _orig_encoder(o) - - def floatstr(o, allow_nan=self.allow_nan, ignore_nan=self.ignore_nan, - _repr=FLOAT_REPR, _inf=PosInf, _neginf=-PosInf): - # Check for specials. Note that this type of test is processor - # and/or platform-specific, so do tests which don't depend on - # the internals. - - if o != o: - text = 'NaN' - elif o == _inf: - text = 'Infinity' - elif o == _neginf: - text = '-Infinity' - else: - return _repr(o) - - if ignore_nan: - text = 'null' - elif not allow_nan: - raise ValueError( - "Out of range float values are not JSON compliant: " + - repr(o)) - - return text - - key_memo = {} - int_as_string_bitcount = ( - 53 if self.bigint_as_string else self.int_as_string_bitcount) - if (_one_shot and c_make_encoder is not None - and self.indent is None): - _iterencode = c_make_encoder( - markers, self.default, _encoder, self.indent, - self.key_separator, self.item_separator, self.sort_keys, - self.skipkeys, self.allow_nan, key_memo, self.use_decimal, - self.namedtuple_as_object, self.tuple_as_array, - int_as_string_bitcount, - self.item_sort_key, self.encoding, self.for_json, - self.ignore_nan, Decimal) - else: - _iterencode = _make_iterencode( - markers, self.default, _encoder, self.indent, floatstr, - self.key_separator, self.item_separator, self.sort_keys, - self.skipkeys, _one_shot, self.use_decimal, - self.namedtuple_as_object, self.tuple_as_array, - int_as_string_bitcount, - self.item_sort_key, self.encoding, self.for_json, - Decimal=Decimal) - try: - return _iterencode(o, 0) - finally: - key_memo.clear() - - -class JSONEncoderForHTML(JSONEncoder): - """An encoder that produces JSON safe to embed in HTML. - - To embed JSON content in, say, a script tag on a web page, the - characters &, < and > should be escaped. They cannot be escaped - with the usual entities (e.g. &) because they are not expanded - within ', response)[-1] - jseval = self.js.eval("document = { write: function(e) { return e; } }; %s" % jscode) - dlLink = re.search(r'http://linksave\.in/dl-\w+', jseval).group(0) - self.logDebug("JsEngine returns value [%s] for redirection link" % dlLink) - response = self.load(dlLink) - link = unescape(re.search(r'') - for pattern in patterns: - rexpr = re.compile(pattern, re.DOTALL) - content = re.sub(rexpr, "", content) - return content - - def isOnline(self): - if "Your folder does not exist" in self.cleanedHtml: - self.logDebug("File not m") - return False - return True - - def isProtected(self): - form = re.search(r'(.*?)', self.cleanedHtml, re.DOTALL) - if form is not None: - content = form.group(1) - for keyword in ("password", "captcha"): - if keyword in content: - self.protection_type = keyword - self.logDebug("Links are %s protected" % self.protection_type) - return True - return False - - def getPackageInfo(self): - m = re.search(self.NAME_PATTERN, self.html) - if m: - name = folder = m.group('N').strip() - self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) - else: - name = self.package.name - folder = self.package.folder - self.logDebug("Package info not m, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) - return name, folder - - def unlockProtection(self): - - postData = {} - - form = re.search(r'
    ', self.cleanedHtml, re.DOTALL).group(1) - - # Submit package password - if "password" in form: - password = self.getPassword() - self.logDebug("Submitting password [%s] for protected links" % password) - postData['password'] = password - - # Resolve anicaptcha - if "anicaptcha" in form: - self.logDebug("Captcha protected") - captchaUri = re.search(r'src="(/temp/anicaptcha/[^"]+)', form).group(1) - captcha = self.decryptCaptcha("http://ncrypt.in" + captchaUri) - self.logDebug("Captcha resolved [%s]" % captcha) - postData['captcha'] = captcha - - # Resolve recaptcha - if "recaptcha" in form: - self.logDebug("ReCaptcha protected") - captcha_key = re.search(r'\?k=(.*?)"', form).group(1) - self.logDebug("Resolving ReCaptcha with key [%s]" % captcha_key) - recaptcha = ReCaptcha(self) - challenge, code = recaptcha.challenge(captcha_key) - postData['recaptcha_challenge_field'] = challenge - postData['recaptcha_response_field'] = code - - # Resolve circlecaptcha - if "circlecaptcha" in form: - self.logDebug("CircleCaptcha protected") - captcha_img_url = "http://ncrypt.in/classes/captcha/circlecaptcha.php" - coords = self.decryptCaptcha(captcha_img_url, forceUser=True, imgtype="png", result_type='positional') - self.logDebug("Captcha resolved, coords [%s]" % str(coords)) - postData['circle.x'] = coords[0] - postData['circle.y'] = coords[1] - - # Unlock protection - postData['submit_protected'] = 'Continue to folder' - return self.load(self.pyfile.url, post=postData, decode=True) - - def handleErrors(self): - if self.protection_type == "password": - if "This password is invalid!" in self.cleanedHtml: - self.logDebug("Incorrect password, please set right password on 'Edit package' form and retry") - self.fail("Incorrect password, please set right password on 'Edit package' form and retry") - - if self.protection_type == "captcha": - if "The securitycheck was wrong!" in self.cleanedHtml: - self.logDebug("Invalid captcha, retrying") - self.invalidCaptcha() - self.retry() - else: - self.correctCaptcha() - - def handleLinkSource(self, link_source_type): - # Check for JS engine - require_js_engine = link_source_type in ("cnl2", "rsdf", "ccf", "dlc") - if require_js_engine and not self.js: - self.logDebug("No JS engine available, skip %s links" % link_source_type) - return [] - - # Select suitable handler - if link_source_type == 'single': - return self.handleSingleLink() - if link_source_type == 'cnl2': - return self.handleCNL2() - elif link_source_type in ("rsdf", "ccf", "dlc"): - return self.handleContainer(link_source_type) - elif link_source_type == "web": - return self.handleWebLinks() - else: - self.fail('unknown source type "%s" (this is probably a bug)' % link_source_type) - - def handleSingleLink(self): - - self.logDebug("Handling Single link") - package_links = [] - - # Decrypt single link - decrypted_link = self.decryptLink(self.pyfile.url) - if decrypted_link: - package_links.append(decrypted_link) - - return package_links - - def handleCNL2(self): - - self.logDebug("Handling CNL2 links") - package_links = [] - - if 'cnl2_output' in self.cleanedHtml: - try: - (vcrypted, vjk) = self._getCipherParams() - for (crypted, jk) in zip(vcrypted, vjk): - package_links.extend(self._getLinks(crypted, jk)) - except: - self.fail("Unable to decrypt CNL2 links") - - return package_links - - def handleContainers(self): - - self.logDebug("Handling Container links") - package_links = [] - - pattern = r"/container/(rsdf|dlc|ccf)/([a-z0-9]+)" - containersLinks = re.findall(pattern, self.html) - self.logDebug("Decrypting %d Container links" % len(containersLinks)) - for containerLink in containersLinks: - link = "http://ncrypt.in/container/%s/%s.%s" % (containerLink[0], containerLink[1], containerLink[0]) - package_links.append(link) - - return package_links - - def handleWebLinks(self): - - self.logDebug("Handling Web links") - pattern = r"(http://ncrypt\.in/link-.*?=)" - links = re.findall(pattern, self.html) - - package_links = [] - self.logDebug("Decrypting %d Web links" % len(links)) - for i, link in enumerate(links): - self.logDebug("Decrypting Web link %d, %s" % (i + 1, link)) - decrypted_link = self.decrypt(link) - if decrypted_link: - package_links.append(decrypted_link) - - return package_links - - def decryptLink(self, link): - try: - url = link.replace("link-", "frame-") - link = self.load(url, just_header=True)['location'] - return link - except Exception, detail: - self.logDebug("Error decrypting link %s, %s" % (link, detail)) - - def _getCipherParams(self): - - pattern = r'\w+)/\w+|folder.php\?folder_id=(?P\w+))' - - __description__ = """NetFolder.in decrypter plugin""" - __author_name__ = ("RaNaN", "fragonib") - __author_mail__ = ("RaNaN@pyload.org", "fragonib[AT]yahoo[DOT]es") - - TITLE_PATTERN = r'

    Inhalt des Ordners (?P.+)</span></div>' - - - def decrypt(self, pyfile): - # Request package - self.html = self.load(pyfile.url) - - # Check for password protection - if self.isPasswordProtected(): - self.html = self.submitPassword() - if not self.html: - self.fail("Incorrect password, please set right password on Add package form and retry") - - # Get package name and folder - (package_name, folder_name) = self.getPackageNameAndFolder() - - # Get package links - package_links = self.getLinks() - - # Set package - self.packages = [(package_name, package_links, folder_name)] - - def isPasswordProtected(self): - if '<input type="password" name="password"' in self.html: - self.logDebug("Links are password protected") - return True - return False - - def submitPassword(self): - # Gather data - try: - m = re.match(self.__pattern__, self.pyfile.url) - id = max(m.group('id1'), m.group('id2')) - except AttributeError: - self.logDebug("Unable to get package id from url [%s]" % self.pyfile.url) - return - url = "http://netfolder.in/folder.php?folder_id=" + id - password = self.getPassword() - - # Submit package password - post = {'password': password, 'save': 'Absenden'} - self.logDebug("Submitting password [%s] for protected links with id [%s]" % (password, id)) - html = self.load(url, {}, post) - - # Check for invalid password - if '<div class="InPage_Error">' in html: - self.logDebug("Incorrect password, please set right password on Edit package form and retry") - return None - - return html - - def getLinks(self): - links = re.search(r'name="list" value="(.*?)"', self.html).group(1).split(",") - self.logDebug("Package has %d links" % len(links)) - return links diff --git a/module/plugins/crypter/NosvideoCom.py b/module/plugins/crypter/NosvideoCom.py deleted file mode 100644 index a3bb11b16..000000000 --- a/module/plugins/crypter/NosvideoCom.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter - - -class NosvideoCom(SimpleCrypter): - __name__ = "NosvideoCom" - __type__ = "crypter" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?nosvideo\.com/\?v=\w+' - - __description__ = """Nosvideo.com decrypter plugin""" - __author_name__ = "igel" - __author_mail__ = "igelkun@myopera.com" - - LINK_PATTERN = r'href="(http://(?:w{3}\.)?nosupload.com/\?d=\w+)"' - TITLE_PATTERN = r'<[tT]itle>Watch (?P<title>.+)</[tT]itle>' diff --git a/module/plugins/crypter/OneKhDe.py b/module/plugins/crypter/OneKhDe.py deleted file mode 100644 index ba93278d5..000000000 --- a/module/plugins/crypter/OneKhDe.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.unescape import unescape -from module.plugins.Crypter import Crypter - - -class OneKhDe(Crypter): - __name__ = "OneKhDe" - __type__ = "crypter" - __version__ = "0.1" - - __pattern__ = r'http://(?:www\.)?1kh.de/f/' - - __description__ = """1kh.de decrypter plugin""" - __author_name__ = "spoob" - __author_mail__ = "spoob@pyload.org" - - - def __init__(self, parent): - Crypter.__init__(self, parent) - self.parent = parent - self.html = None - - def file_exists(self): - """ returns True or False - """ - return True - - def proceed(self, url, location): - url = self.parent.url - self.html = self.req.load(url) - link_ids = re.findall(r"<a id=\"DownloadLink_(\d*)\" href=\"http://1kh.de/", self.html) - for id in link_ids: - new_link = unescape( - re.search("width=\"100%\" src=\"(.*)\"></iframe>", self.req.load("http://1kh.de/l/" + id)).group(1)) - self.urls.append(new_link) diff --git a/module/plugins/crypter/OronComFolder.py b/module/plugins/crypter/OronComFolder.py deleted file mode 100755 index f0b2f943c..000000000 --- a/module/plugins/crypter/OronComFolder.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter - - -class OronComFolder(DeadCrypter): - __name__ = "OronComFolder" - __type__ = "crypter" - __version__ = "0.11" - - __pattern__ = r'http://(?:www\.)?oron.com/folder/\w+' - - __description__ = """Oron.com folder decrypter plugin""" - __author_name__ = "DHMH" - __author_mail__ = "webmaster@pcProfil.de" diff --git a/module/plugins/crypter/PastebinCom.py b/module/plugins/crypter/PastebinCom.py deleted file mode 100644 index 55aa2ee4a..000000000 --- a/module/plugins/crypter/PastebinCom.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter - - -class PastebinCom(SimpleCrypter): - __name__ = "PastebinCom" - __type__ = "crypter" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?pastebin\.com/\w+' - - __description__ = """Pastebin.com decrypter plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - LINK_PATTERN = r'<div class="de\d+">(https?://[^ <]+)(?:[^<]*)</div>' - TITLE_PATTERN = r'<div class="paste_box_line1" title="(?P<title>[^"]+)">' diff --git a/module/plugins/crypter/QuickshareCzFolder.py b/module/plugins/crypter/QuickshareCzFolder.py deleted file mode 100644 index 9840b84df..000000000 --- a/module/plugins/crypter/QuickshareCzFolder.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - - -class QuickshareCzFolder(Crypter): - __name__ = "QuickshareCzFolder" - __type__ = "crypter" - __version__ = "0.1" - - __pattern__ = r'http://(?:www\.)?quickshare.cz/slozka-\d+.*' - - __description__ = """Quickshare.cz folder decrypter plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FOLDER_PATTERN = r'<textarea[^>]*>(.*?)</textarea>' - LINK_PATTERN = r'(http://www.quickshare.cz/\S+)' - - - def decrypt(self, pyfile): - html = self.load(pyfile.url) - - m = re.search(self.FOLDER_PATTERN, html, re.DOTALL) - if m is None: - self.fail("Parse error (FOLDER)") - self.urls.extend(re.findall(self.LINK_PATTERN, m.group(1))) - - if not self.urls: - self.fail('Could not extract any links') diff --git a/module/plugins/crypter/RSLayerCom.py b/module/plugins/crypter/RSLayerCom.py deleted file mode 100644 index 7dda0beab..000000000 --- a/module/plugins/crypter/RSLayerCom.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter - - -class RSLayerCom(DeadCrypter): - __name__ = "RSLayerCom" - __type__ = "crypter" - __version__ = "0.21" - - __pattern__ = r'http://(?:www\.)?rs-layer.com/directory-' - - __description__ = """RS-Layer.com decrypter plugin""" - __author_name__ = "hzpz" - __author_mail__ = None diff --git a/module/plugins/crypter/RelinkUs.py b/module/plugins/crypter/RelinkUs.py deleted file mode 100644 index 1b120fc77..000000000 --- a/module/plugins/crypter/RelinkUs.py +++ /dev/null @@ -1,263 +0,0 @@ -# -*- coding: utf-8 -*- - -import base64 -import binascii -import re -import os - -from Crypto.Cipher import AES -from module.plugins.Crypter import Crypter - - -class RelinkUs(Crypter): - __name__ = "RelinkUs" - __type__ = "crypter" - __version__ = "3.0" - - __pattern__ = r'http://(?:www\.)?relink.us/(f/|((view|go).php\?id=))(?P<id>.+)' - - __description__ = """Relink.us decrypter plugin""" - __author_name__ = "fragonib" - __author_mail__ = "fragonib[AT]yahoo[DOT]es" - - # Constants - PREFERRED_LINK_SOURCES = ["cnl2", "dlc", "web"] - - OFFLINE_TOKEN = r'<title>Tattooside' - PASSWORD_TOKEN = r'container_password\.php' - PASSWORD_ERROR_ROKEN = r'You have entered an incorrect password' - PASSWORD_SUBMIT_URL = r'http://www\.relink\.us/container_password\.php' - CAPTCHA_TOKEN = r'container_captcha\.php' - CAPTCHA_ERROR_ROKEN = r'You have solved the captcha wrong' - CAPTCHA_IMG_URL = r'http://www\.relink\.us/core/captcha/circlecaptcha\.php' - CAPTCHA_SUBMIT_URL = r'http://www\.relink\.us/container_captcha\.php' - FILE_TITLE_REGEX = r'<th>Title</th><td><i>(.*)</i></td></tr>' - FILE_NOTITLE = r'No title' - - CNL2_FORM_REGEX = r'<form id="cnl_form-(.*?)</form>' - CNL2_FORMINPUT_REGEX = r'<input.*?name="%s".*?value="(.*?)"' - CNL2_JK_KEY = "jk" - CNL2_CRYPTED_KEY = "crypted" - DLC_LINK_REGEX = r'<a href=".*?" class="dlc_button" target="_blank">' - DLC_DOWNLOAD_URL = r'http://www\.relink\.us/download\.php' - WEB_FORWARD_REGEX = r"getFile\('(?P<link>.+)'\)" - WEB_FORWARD_URL = r'http://www\.relink\.us/frame\.php' - WEB_LINK_REGEX = r'<iframe name="Container" height="100%" frameborder="no" width="100%" src="(?P<link>.+)"></iframe>' - - - def setup(self): - self.fileid = None - self.package = None - self.password = None - self.html = None - self.captcha = False - - def decrypt(self, pyfile): - # Init - self.initPackage(pyfile) - - # Request package - self.requestPackage() - - # Check for online - if not self.isOnline(): - self.offline() - - # Check for protection - if self.isPasswordProtected(): - self.unlockPasswordProtection() - self.handleErrors() - - if self.isCaptchaProtected(): - self.captcha = True - self.unlockCaptchaProtection() - self.handleErrors() - - # Get package name and folder - (package_name, folder_name) = self.getPackageInfo() - - # Extract package links - package_links = [] - for sources in self.PREFERRED_LINK_SOURCES: - package_links.extend(self.handleLinkSource(sources)) - if package_links: # use only first source which provides links - break - package_links = set(package_links) - - # Pack - if package_links: - self.packages = [(package_name, package_links, folder_name)] - else: - self.fail('Could not extract any links') - - def initPackage(self, pyfile): - self.fileid = re.match(self.__pattern__, pyfile.url).group('id') - self.package = pyfile.package() - self.password = self.getPassword() - - def requestPackage(self): - self.html = self.load(self.pyfile.url, decode=True) - - def isOnline(self): - if self.OFFLINE_TOKEN in self.html: - self.logDebug("File not found") - return False - return True - - def isPasswordProtected(self): - if self.PASSWORD_TOKEN in self.html: - self.logDebug("Links are password protected") - return True - - def isCaptchaProtected(self): - if self.CAPTCHA_TOKEN in self.html: - self.logDebug("Links are captcha protected") - return True - return False - - def unlockPasswordProtection(self): - self.logDebug("Submitting password [%s] for protected links" % self.password) - passwd_url = self.PASSWORD_SUBMIT_URL + "?id=%s" % self.fileid - passwd_data = {'id': self.fileid, 'password': self.password, 'pw': 'submit'} - self.html = self.load(passwd_url, post=passwd_data, decode=True) - - def unlockCaptchaProtection(self): - self.logDebug("Request user positional captcha resolving") - captcha_img_url = self.CAPTCHA_IMG_URL + "?id=%s" % self.fileid - coords = self.decryptCaptcha(captcha_img_url, forceUser=True, imgtype="png", result_type='positional') - self.logDebug("Captcha resolved, coords [%s]" % str(coords)) - captcha_post_url = self.CAPTCHA_SUBMIT_URL + "?id=%s" % self.fileid - captcha_post_data = {'button.x': coords[0], 'button.y': coords[1], 'captcha': 'submit'} - self.html = self.load(captcha_post_url, post=captcha_post_data, decode=True) - - def getPackageInfo(self): - name = folder = None - - # Try to get info from web - m = re.search(self.FILE_TITLE_REGEX, self.html) - if m is not None: - title = m.group(1).strip() - if not self.FILE_NOTITLE in title: - name = folder = title - self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) - - # Fallback to defaults - if not name or not folder: - name = self.package.name - folder = self.package.folder - self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) - - # Return package info - return name, folder - - def handleErrors(self): - if self.PASSWORD_ERROR_ROKEN in self.html: - msg = "Incorrect password, please set right password on 'Edit package' form and retry" - self.logDebug(msg) - self.fail(msg) - - if self.captcha: - if self.CAPTCHA_ERROR_ROKEN in self.html: - self.logDebug("Invalid captcha, retrying") - self.invalidCaptcha() - self.retry() - else: - self.correctCaptcha() - - def handleLinkSource(self, source): - if source == 'cnl2': - return self.handleCNL2Links() - elif source == 'dlc': - return self.handleDLCLinks() - elif source == 'web': - return self.handleWEBLinks() - else: - self.fail('Unknown source [%s] (this is probably a bug)' % source) - - def handleCNL2Links(self): - self.logDebug("Search for CNL2 links") - package_links = [] - m = re.search(self.CNL2_FORM_REGEX, self.html, re.DOTALL) - if m is not None: - cnl2_form = m.group(1) - try: - (vcrypted, vjk) = self._getCipherParams(cnl2_form) - for (crypted, jk) in zip(vcrypted, vjk): - package_links.extend(self._getLinks(crypted, jk)) - except: - self.logDebug("Unable to decrypt CNL2 links") - return package_links - - def handleDLCLinks(self): - self.logDebug('Search for DLC links') - package_links = [] - m = re.search(self.DLC_LINK_REGEX, self.html) - if m is not None: - container_url = self.DLC_DOWNLOAD_URL + "?id=%s&dlc=1" % self.fileid - self.logDebug("Downloading DLC container link [%s]" % container_url) - try: - dlc = self.load(container_url) - dlc_filename = self.fileid + ".dlc" - dlc_filepath = os.path.join(self.config['general']['download_folder'], dlc_filename) - f = open(dlc_filepath, "wb") - f.write(dlc) - f.close() - package_links.append(dlc_filepath) - except: - self.logDebug("Unable to download DLC container") - return package_links - - def handleWEBLinks(self): - self.logDebug("Search for WEB links") - package_links = [] - fw_params = re.findall(self.WEB_FORWARD_REGEX, self.html) - self.logDebug("Decrypting %d Web links" % len(fw_params)) - for index, fw_param in enumerate(fw_params): - try: - fw_url = self.WEB_FORWARD_URL + "?%s" % fw_param - self.logDebug("Decrypting Web link %d, %s" % (index + 1, fw_url)) - fw_response = self.load(fw_url, decode=True) - dl_link = re.search(self.WEB_LINK_REGEX, fw_response).group('link') - package_links.append(dl_link) - except Exception, detail: - self.logDebug("Error decrypting Web link %s, %s" % (index, detail)) - self.setWait(4) - self.wait() - return package_links - - def _getCipherParams(self, cnl2_form): - # Get jk - jk_re = self.CNL2_FORMINPUT_REGEX % self.CNL2_JK_KEY - vjk = re.findall(jk_re, cnl2_form, re.IGNORECASE) - - # Get crypted - crypted_re = self.CNL2_FORMINPUT_REGEX % RelinkUs.CNL2_CRYPTED_KEY - vcrypted = re.findall(crypted_re, cnl2_form, re.IGNORECASE) - - # Log and return - self.logDebug("Detected %d crypted blocks" % len(vcrypted)) - return vcrypted, vjk - - def _getLinks(self, crypted, jk): - # Get key - jreturn = self.js.eval("%s f()" % jk) - self.logDebug("JsEngine returns value [%s]" % jreturn) - key = binascii.unhexlify(jreturn) - - # Decode crypted - crypted = base64.standard_b64decode(crypted) - - # Decrypt - Key = key - IV = key - obj = AES.new(Key, AES.MODE_CBC, IV) - text = obj.decrypt(crypted) - - # Extract links - text = text.replace("\x00", "").replace("\r", "") - links = text.split("\n") - links = filter(lambda x: x != "", links) - - # Log and return - self.logDebug("Package has %d links" % len(links)) - return links diff --git a/module/plugins/crypter/SafelinkingNet.py b/module/plugins/crypter/SafelinkingNet.py deleted file mode 100644 index e0c165705..000000000 --- a/module/plugins/crypter/SafelinkingNet.py +++ /dev/null @@ -1,82 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from pycurl import FOLLOWLOCATION - -from module.lib.BeautifulSoup import BeautifulSoup - -from module.common.json_layer import json_loads -from module.plugins.Crypter import Crypter -from module.plugins.internal.CaptchaService import SolveMedia - - -class SafelinkingNet(Crypter): - __name__ = "SafelinkingNet" - __type__ = "crypter" - __version__ = "0.1" - - __pattern__ = r'https?://(?:www\.)?safelinking.net/([pd])/\w+' - - __description__ = """Safelinking.net decrypter plugin""" - __author_name__ = "quareevo" - __author_mail__ = "quareevo@arcor.de" - - SOLVEMEDIA_PATTERN = "solvemediaApiKey = '([\w\.\-_]+)';" - - - def decrypt(self, pyfile): - url = pyfile.url - if re.match(self.__pattern__, url).group(1) == "d": - self.req.http.c.setopt(FOLLOWLOCATION, 0) - self.load(url) - m = re.search("^Location: (.+)$", self.req.http.header, re.MULTILINE) - if m: - self.urls = [m.group(1)] - else: - self.fail("Couldn't find forwarded Link") - - else: - password = "" - postData = {"post-protect": "1"} - - self.html = self.load(url) - - if "link-password" in self.html: - password = pyfile.package().password - postData['link-password'] = password - - if "altcaptcha" in self.html: - for _ in xrange(5): - m = re.search(self.SOLVEMEDIA_PATTERN, self.html) - if m: - captchaKey = m.group(1) - captcha = SolveMedia(self) - captchaProvider = "Solvemedia" - else: - self.fail("Error parsing captcha") - - challenge, response = captcha.challenge(captchaKey) - postData['adcopy_challenge'] = challenge - postData['adcopy_response'] = response - - self.html = self.load(url, post=postData) - if "The password you entered was incorrect" in self.html: - self.fail("Incorrect Password") - if not "The CAPTCHA code you entered was wrong" in self.html: - break - - pyfile.package().password = "" - soup = BeautifulSoup(self.html) - scripts = soup.findAll("script") - for s in scripts: - if "d_links" in s.text: - break - m = re.search('d_links":(\[.*?\])', s.text) - if m: - linkDict = json_loads(m.group(1)) - for link in linkDict: - if not "http://" in link['full']: - self.urls.append("https://safelinking.net/d/" + link['full']) - else: - self.urls.append(link['full']) diff --git a/module/plugins/crypter/SecuredIn.py b/module/plugins/crypter/SecuredIn.py deleted file mode 100644 index 0b558c688..000000000 --- a/module/plugins/crypter/SecuredIn.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter - - -class SecuredIn(DeadCrypter): - __name__ = "SecuredIn" - __type__ = "crypter" - __version__ = "0.21" - - __pattern__ = r'http://(?:www\.)?secured\.in/download-[\d]+-[\w]{8}\.html' - - __description__ = """Secured.in decrypter plugin""" - __author_name__ = "mkaay" - __author_mail__ = "mkaay@mkaay.de" diff --git a/module/plugins/crypter/SerienjunkiesOrg.py b/module/plugins/crypter/SerienjunkiesOrg.py deleted file mode 100644 index fe4ee4e36..000000000 --- a/module/plugins/crypter/SerienjunkiesOrg.py +++ /dev/null @@ -1,324 +0,0 @@ -# -*- coding: utf-8 -*- - -import random -import re - -from time import sleep - -from module.lib.BeautifulSoup import BeautifulSoup - -from module.plugins.Crypter import Crypter -from module.unescape import unescape - - -class SerienjunkiesOrg(Crypter): - __name__ = "SerienjunkiesOrg" - __type__ = "crypter" - __version__ = "0.39" - - __pattern__ = r'http://(?:www\.)?(serienjunkies.org|dokujunkies.org)/.*?' - __config__ = [("changeNameSJ", "Packagename;Show;Season;Format;Episode", "Take SJ.org name", "Show"), - ("changeNameDJ", "Packagename;Show;Format;Episode", "Take DJ.org name", "Show"), - ("randomPreferred", "bool", "Randomize Preferred-List", False), - ("hosterListMode", "OnlyOne;OnlyPreferred(One);OnlyPreferred(All);All", - "Use for hosters (if supported)", "All"), - ("hosterList", "str", "Preferred Hoster list (comma separated)", - "RapidshareCom,UploadedTo,NetloadIn,FilefactoryCom,FreakshareNet,FilebaseTo,HotfileCom,DepositfilesCom,EasyshareCom,KickloadCom"), - ("ignoreList", "str", "Ignored Hoster list (comma separated)", "MegauploadCom")] - - __description__ = """Serienjunkies.org decrypter plugin""" - __author_name__ = ("mkaay", "godofdream") - __author_mail__ = ("mkaay@mkaay.de", "soilfiction@gmail.com") - - - def setup(self): - self.multiDL = False - - def getSJSrc(self, url): - src = self.req.load(str(url)) - if "This website is not available in your country" in src: - self.fail("Not available in your country") - if not src.find("Enter Serienjunkies") == -1: - sleep(1) - src = self.req.load(str(url)) - return src - - def handleShow(self, url): - src = self.getSJSrc(url) - soup = BeautifulSoup(src) - packageName = self.pyfile.package().name - if self.getConfig("changeNameSJ") == "Show": - found = unescape(soup.find("h2").find("a").string.split(' –')[0]) - if found: - packageName = found - - nav = soup.find("div", attrs={"id": "scb"}) - - package_links = [] - for a in nav.findAll("a"): - if self.getConfig("changeNameSJ") == "Show": - package_links.append(a['href']) - else: - package_links.append(a['href'] + "#hasName") - if self.getConfig("changeNameSJ") == "Show": - self.packages.append((packageName, package_links, packageName)) - else: - self.core.files.addLinks(package_links, self.pyfile.package().id) - - def handleSeason(self, url): - src = self.getSJSrc(url) - soup = BeautifulSoup(src) - post = soup.find("div", attrs={"class": "post-content"}) - ps = post.findAll("p") - - seasonName = unescape(soup.find("a", attrs={"rel": "bookmark"}).string).replace("–", "-") - groups = {} - gid = -1 - for p in ps: - if re.search("<strong>Sprache|<strong>Format", str(p)): - var = p.findAll("strong") - opts = {"Sprache": "", "Format": ""} - for v in var: - n = unescape(v.string).strip() - n = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', n) - if n.strip() not in opts: - continue - val = v.nextSibling - if not val: - continue - val = val.replace("|", "").strip() - val = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', val) - opts[n.strip()] = val.strip() - gid += 1 - groups[gid] = {} - groups[gid]['ep'] = {} - groups[gid]['opts'] = opts - elif re.search("<strong>Download:", str(p)): - parts = str(p).split("<br />") - if re.search("<strong>", parts[0]): - ename = re.search('<strong>(.*?)</strong>', parts[0]).group(1).strip().decode("utf-8").replace( - "–", "-") - groups[gid]['ep'][ename] = {} - parts.remove(parts[0]) - for part in parts: - hostername = re.search(r" \| ([-a-zA-Z0-9]+\.\w+)", part) - if hostername: - hostername = hostername.group(1) - groups[gid]['ep'][ename][hostername] = [] - links = re.findall('href="(.*?)"', part) - for link in links: - groups[gid]['ep'][ename][hostername].append(link + "#hasName") - - links = [] - for g in groups.values(): - for ename in g['ep']: - links.extend(self.getpreferred(g['ep'][ename])) - if self.getConfig("changeNameSJ") == "Episode": - self.packages.append((ename, links, ename)) - links = [] - package = "%s (%s, %s)" % (seasonName, g['opts']['Format'], g['opts']['Sprache']) - if self.getConfig("changeNameSJ") == "Format": - self.packages.append((package, links, package)) - links = [] - if (self.getConfig("changeNameSJ") == "Packagename") or re.search("#hasName", url): - self.core.files.addLinks(links, self.pyfile.package().id) - elif (self.getConfig("changeNameSJ") == "Season") or not re.search("#hasName", url): - self.packages.append((seasonName, links, seasonName)) - - def handleEpisode(self, url): - src = self.getSJSrc(url) - if not src.find( - "Du hast das Download-Limit überschritten! Bitte versuche es später nocheinmal.") == -1: - self.fail(_("Downloadlimit reached")) - else: - soup = BeautifulSoup(src) - form = soup.find("form") - h1 = soup.find("h1") - - if h1.get("class") == "wrap": - captchaTag = soup.find(attrs={"src": re.compile("^/secure/")}) - if not captchaTag: - sleep(5) - self.retry() - - captchaUrl = "http://download.serienjunkies.org" + captchaTag['src'] - result = self.decryptCaptcha(str(captchaUrl), imgtype="png") - sinp = form.find(attrs={"name": "s"}) - - self.req.lastURL = str(url) - sj = self.load(str(url), post={'s': sinp['value'], 'c': result, 'action': "Download"}) - - soup = BeautifulSoup(sj) - rawLinks = soup.findAll(attrs={"action": re.compile("^http://download.serienjunkies.org/")}) - - if not len(rawLinks) > 0: - sleep(1) - self.retry() - return - - self.correctCaptcha() - - links = [] - for link in rawLinks: - frameUrl = link['action'].replace("/go-", "/frame/go-") - links.append(self.handleFrame(frameUrl)) - if re.search("#hasName", url) or ((self.getConfig("changeNameSJ") == "Packagename") and - (self.getConfig("changeNameDJ") == "Packagename")): - self.core.files.addLinks(links, self.pyfile.package().id) - else: - if h1.text[2] == "_": - eName = h1.text[3:] - else: - eName = h1.text - self.packages.append((eName, links, eName)) - - def handleOldStyleLink(self, url): - sj = self.req.load(str(url)) - soup = BeautifulSoup(sj) - form = soup.find("form", attrs={"action": re.compile("^http://serienjunkies.org")}) - captchaTag = form.find(attrs={"src": re.compile("^/safe/secure/")}) - captchaUrl = "http://serienjunkies.org" + captchaTag['src'] - result = self.decryptCaptcha(str(captchaUrl)) - url = form['action'] - sinp = form.find(attrs={"name": "s"}) - - self.req.load(str(url), post={'s': sinp['value'], 'c': result, 'dl.start': "Download"}, cookies=False, - just_header=True) - decrypted = self.req.lastEffectiveURL - if decrypted == str(url): - self.retry() - self.core.files.addLinks([decrypted], self.pyfile.package().id) - - def handleFrame(self, url): - self.req.load(str(url)) - return self.req.lastEffectiveURL - - def handleShowDJ(self, url): - src = self.getSJSrc(url) - soup = BeautifulSoup(src) - post = soup.find("div", attrs={"id": "page_post"}) - ps = post.findAll("p") - found = unescape(soup.find("h2").find("a").string.split(' –')[0]) - if found: - seasonName = found - - groups = {} - gid = -1 - for p in ps: - if re.search("<strong>Sprache|<strong>Format", str(p)): - var = p.findAll("strong") - opts = {"Sprache": "", "Format": ""} - for v in var: - n = unescape(v.string).strip() - n = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', n) - if n.strip() not in opts: - continue - val = v.nextSibling - if not val: - continue - val = val.replace("|", "").strip() - val = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', val) - opts[n.strip()] = val.strip() - gid += 1 - groups[gid] = {} - groups[gid]['ep'] = {} - groups[gid]['opts'] = opts - elif re.search("<strong>Download:", str(p)): - parts = str(p).split("<br />") - if re.search("<strong>", parts[0]): - ename = re.search('<strong>(.*?)</strong>', parts[0]).group(1).strip().decode("utf-8").replace( - "–", "-") - groups[gid]['ep'][ename] = {} - parts.remove(parts[0]) - for part in parts: - hostername = re.search(r" \| ([-a-zA-Z0-9]+\.\w+)", part) - if hostername: - hostername = hostername.group(1) - groups[gid]['ep'][ename][hostername] = [] - links = re.findall('href="(.*?)"', part) - for link in links: - groups[gid]['ep'][ename][hostername].append(link + "#hasName") - - links = [] - for g in groups.values(): - for ename in g['ep']: - links.extend(self.getpreferred(g['ep'][ename])) - if self.getConfig("changeNameDJ") == "Episode": - self.packages.append((ename, links, ename)) - links = [] - package = "%s (%s, %s)" % (seasonName, g['opts']['Format'], g['opts']['Sprache']) - if self.getConfig("changeNameDJ") == "Format": - self.packages.append((package, links, package)) - links = [] - if (self.getConfig("changeNameDJ") == "Packagename") or re.search("#hasName", url): - self.core.files.addLinks(links, self.pyfile.package().id) - elif (self.getConfig("changeNameDJ") == "Show") or not re.search("#hasName", url): - self.packages.append((seasonName, links, seasonName)) - - def handleCategoryDJ(self, url): - package_links = [] - src = self.getSJSrc(url) - soup = BeautifulSoup(src) - content = soup.find("div", attrs={"id": "content"}) - for a in content.findAll("a", attrs={"rel": "bookmark"}): - package_links.append(a['href']) - self.core.files.addLinks(package_links, self.pyfile.package().id) - - def decrypt(self, pyfile): - showPattern = re.compile("^http://serienjunkies.org/serie/(.*)/$") - seasonPattern = re.compile("^http://serienjunkies.org/.*?/(.*)/$") - episodePattern = re.compile("^http://download.serienjunkies.org/f-.*?.html(#hasName)?$") - oldStyleLink = re.compile("^http://serienjunkies.org/safe/(.*)$") - categoryPatternDJ = re.compile("^http://dokujunkies.org/.*?(.*)$") - showPatternDJ = re.compile(r"^http://dokujunkies.org/.*?/(.*)\.html(#hasName)?$") - framePattern = re.compile("^http://download.(serienjunkies.org|dokujunkies.org)/frame/go-.*?/$") - url = pyfile.url - if framePattern.match(url): - self.packages.append((pyfile.package().name, [self.handleFrame(url)], pyfile.package().name)) - elif episodePattern.match(url): - self.handleEpisode(url) - elif oldStyleLink.match(url): - self.handleOldStyleLink(url) - elif showPattern.match(url): - self.handleShow(url) - elif showPatternDJ.match(url): - self.handleShowDJ(url) - elif seasonPattern.match(url): - self.handleSeason(url) - elif categoryPatternDJ.match(url): - self.handleCategoryDJ(url) - - #selects the preferred hoster, after that selects any hoster (ignoring the one to ignore) - def getpreferred(self, hosterlist): - - result = [] - preferredList = self.getConfig("hosterList").strip().lower().replace( - '|', ',').replace('.', '').replace(';', ',').split(',') - if (self.getConfig("randomPreferred") is True) and ( - self.getConfig("hosterListMode") in ["OnlyOne", "OnlyPreferred(One)"]): - random.shuffle(preferredList) - # we don't want hosters be read two times - hosterlist2 = hosterlist.copy() - - for preferred in preferredList: - for Hoster in hosterlist: - if preferred == Hoster.lower().replace('.', ''): - for Part in hosterlist[Hoster]: - self.logDebug("selected " + Part) - result.append(str(Part)) - del (hosterlist2[Hoster]) - if self.getConfig("hosterListMode") in ["OnlyOne", "OnlyPreferred(One)"]: - return result - - ignorelist = self.getConfig("ignoreList").strip().lower().replace( - '|', ',').replace('.', '').replace(';', ',').split(',') - if self.getConfig('hosterListMode') in ["OnlyOne", "All"]: - for Hoster in hosterlist2: - if Hoster.strip().lower().replace('.', '') not in ignorelist: - for Part in hosterlist2[Hoster]: - self.logDebug("selected2 " + Part) - result.append(str(Part)) - - if self.getConfig('hosterListMode') == "OnlyOne": - return result - return result diff --git a/module/plugins/crypter/ShareLinksBiz.py b/module/plugins/crypter/ShareLinksBiz.py deleted file mode 100644 index 87bb16a50..000000000 --- a/module/plugins/crypter/ShareLinksBiz.py +++ /dev/null @@ -1,269 +0,0 @@ -# -*- coding: utf-8 -*- - -import base64 -import binascii -import re - -from Crypto.Cipher import AES -from module.plugins.Crypter import Crypter - - -class ShareLinksBiz(Crypter): - __name__ = "ShareLinksBiz" - __type__ = "crypter" - __version__ = "1.13" - - __pattern__ = r'http://(?:www\.)?(share-links|s2l)\.biz/(?P<ID>_?\w+)' - - __description__ = """Share-Links.biz decrypter plugin""" - __author_name__ = "fragonib" - __author_mail__ = "fragonib[AT]yahoo[DOT]es" - - - def setup(self): - self.baseUrl = None - self.fileId = None - self.package = None - self.html = None - self.captcha = False - - def decrypt(self, pyfile): - # Init - self.initFile(pyfile) - - # Request package - url = self.baseUrl + '/' + self.fileId - self.html = self.load(url, decode=True) - - # Unblock server (load all images) - self.unblockServer() - - # Check for protection - if self.isPasswordProtected(): - self.unlockPasswordProtection() - self.handleErrors() - - if self.isCaptchaProtected(): - self.captcha = True - self.unlockCaptchaProtection() - self.handleErrors() - - # Extract package links - package_links = [] - package_links.extend(self.handleWebLinks()) - package_links.extend(self.handleContainers()) - package_links.extend(self.handleCNL2()) - package_links = set(package_links) - - # Get package info - package_name, package_folder = self.getPackageInfo() - - # Pack - self.packages = [(package_name, package_links, package_folder)] - - def initFile(self, pyfile): - url = pyfile.url - if 's2l.biz' in url: - url = self.load(url, just_header=True)['location'] - self.baseUrl = "http://www.%s.biz" % re.match(self.__pattern__, url).group(1) - self.fileId = re.match(self.__pattern__, url).group('ID') - self.package = pyfile.package() - - def isOnline(self): - if "No usable content was found" in self.html: - self.logDebug("File not found") - return False - return True - - def isPasswordProtected(self): - if re.search(r'''<form.*?id="passwordForm".*?>''', self.html): - self.logDebug("Links are protected") - return True - return False - - def isCaptchaProtected(self): - if '<map id="captchamap"' in self.html: - self.logDebug("Links are captcha protected") - return True - return False - - def unblockServer(self): - imgs = re.findall(r"(/template/images/.*?\.gif)", self.html) - for img in imgs: - self.load(self.baseUrl + img) - - def unlockPasswordProtection(self): - password = self.getPassword() - self.logDebug("Submitting password [%s] for protected links" % password) - post = {"password": password, 'login': 'Submit form'} - url = self.baseUrl + '/' + self.fileId - self.html = self.load(url, post=post, decode=True) - - def unlockCaptchaProtection(self): - # Get captcha map - captchaMap = self._getCaptchaMap() - self.logDebug("Captcha map with [%d] positions" % len(captchaMap.keys())) - - # Request user for captcha coords - m = re.search(r'<img src="/captcha.gif\?d=(.*?)&PHPSESSID=(.*?)&legend=1"', self.html) - captchaUrl = self.baseUrl + '/captcha.gif?d=%s&PHPSESSID=%s' % (m.group(1), m.group(2)) - self.logDebug("Waiting user for correct position") - coords = self.decryptCaptcha(captchaUrl, forceUser=True, imgtype="gif", result_type='positional') - self.logDebug("Captcha resolved, coords [%s]" % str(coords)) - - # Resolve captcha - href = self._resolveCoords(coords, captchaMap) - if href is None: - self.logDebug("Invalid captcha resolving, retrying") - self.invalidCaptcha() - self.setWait(5, False) - self.wait() - self.retry() - url = self.baseUrl + href - self.html = self.load(url, decode=True) - - def _getCaptchaMap(self): - mapp = {} - for m in re.finditer(r'<area shape="rect" coords="(.*?)" href="(.*?)"', self.html): - rect = eval('(' + m.group(1) + ')') - href = m.group(2) - mapp[rect] = href - return mapp - - def _resolveCoords(self, coords, captchaMap): - x, y = coords - for rect, href in captchaMap.items(): - x1, y1, x2, y2 = rect - if (x >= x1 and x <= x2) and (y >= y1 and y <= y2): - return href - - def handleErrors(self): - if "The inserted password was wrong" in self.html: - self.logDebug("Incorrect password, please set right password on 'Edit package' form and retry") - self.fail("Incorrect password, please set right password on 'Edit package' form and retry") - - if self.captcha: - if "Your choice was wrong" in self.html: - self.logDebug("Invalid captcha, retrying") - self.invalidCaptcha() - self.setWait(5) - self.wait() - self.retry() - else: - self.correctCaptcha() - - def getPackageInfo(self): - name = folder = None - - # Extract from web package header - title_re = r'<h2><img.*?/>(.*)</h2>' - m = re.search(title_re, self.html, re.DOTALL) - if m is not None: - title = m.group(1).strip() - if 'unnamed' not in title: - name = folder = title - self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) - - # Fallback to defaults - if not name or not folder: - name = self.package.name - folder = self.package.folder - self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) - - # Return package info - return name, folder - - def handleWebLinks(self): - package_links = [] - self.logDebug("Handling Web links") - - #@TODO: Gather paginated web links - pattern = r"javascript:_get\('(.*?)', \d+, ''\)" - ids = re.findall(pattern, self.html) - self.logDebug("Decrypting %d Web links" % len(ids)) - for i, ID in enumerate(ids): - try: - self.logDebug("Decrypting Web link %d, [%s]" % (i + 1, ID)) - dwLink = self.baseUrl + "/get/lnk/" + ID - response = self.load(dwLink) - code = re.search(r'frm/(\d+)', response).group(1) - fwLink = self.baseUrl + "/get/frm/" + code - response = self.load(fwLink) - jscode = re.search(r'<script language="javascript">\s*eval\((.*)\)\s*</script>', response, - re.DOTALL).group(1) - jscode = self.js.eval("f = %s" % jscode) - jslauncher = "window=''; parent={frames:{Main:{location:{href:''}}},location:''}; %s; parent.frames.Main.location.href" - dlLink = self.js.eval(jslauncher % jscode) - self.logDebug("JsEngine returns value [%s] for redirection link" % dlLink) - package_links.append(dlLink) - except Exception, detail: - self.logDebug("Error decrypting Web link [%s], %s" % (ID, detail)) - return package_links - - def handleContainers(self): - package_links = [] - self.logDebug("Handling Container links") - - pattern = r"javascript:_get\('(.*?)', 0, '(rsdf|ccf|dlc)'\)" - containersLinks = re.findall(pattern, self.html) - self.logDebug("Decrypting %d Container links" % len(containersLinks)) - for containerLink in containersLinks: - link = "%s/get/%s/%s" % (self.baseUrl, containerLink[1], containerLink[0]) - package_links.append(link) - return package_links - - def handleCNL2(self): - package_links = [] - self.logDebug("Handling CNL2 links") - - if '/lib/cnl2/ClicknLoad.swf' in self.html: - try: - (crypted, jk) = self._getCipherParams() - package_links.extend(self._getLinks(crypted, jk)) - except: - self.fail("Unable to decrypt CNL2 links") - return package_links - - def _getCipherParams(self): - # Request CNL2 - code = re.search(r'ClicknLoad.swf\?code=(.*?)"', self.html).group(1) - url = "%s/get/cnl2/%s" % (self.baseUrl, code) - response = self.load(url) - params = response.split(";;") - - # Get jk - strlist = list(base64.standard_b64decode(params[1])) - strlist.reverse() - jk = ''.join(strlist) - - # Get crypted - strlist = list(base64.standard_b64decode(params[2])) - strlist.reverse() - crypted = ''.join(strlist) - - # Log and return - return crypted, jk - - def _getLinks(self, crypted, jk): - # Get key - jreturn = self.js.eval("%s f()" % jk) - self.logDebug("JsEngine returns value [%s]" % jreturn) - key = binascii.unhexlify(jreturn) - - # Decode crypted - crypted = base64.standard_b64decode(crypted) - - # Decrypt - Key = key - IV = key - obj = AES.new(Key, AES.MODE_CBC, IV) - text = obj.decrypt(crypted) - - # Extract links - text = text.replace("\x00", "").replace("\r", "") - links = text.split("\n") - links = filter(lambda x: x != "", links) - - # Log and return - self.logDebug("Block has %d links" % len(links)) - return links diff --git a/module/plugins/crypter/ShareRapidComFolder.py b/module/plugins/crypter/ShareRapidComFolder.py deleted file mode 100644 index fd12ff96f..000000000 --- a/module/plugins/crypter/ShareRapidComFolder.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter - - -class ShareRapidComFolder(SimpleCrypter): - __name__ = "ShareRapidComFolder" - __type__ = "crypter" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?((share(-?rapid\.(biz|com|cz|info|eu|net|org|pl|sk)|-(central|credit|free|net)\.cz|-ms\.net)|(s-?rapid|rapids)\.(cz|sk))|(e-stahuj|mediatack|premium-rapidshare|rapidshare-premium|qiuck)\.cz|kadzet\.com|stahuj-zdarma\.eu|strelci\.net|universal-share\.com)/(slozka/.+)' - - __description__ = """Share-Rapid.com folder decrypter plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - LINK_PATTERN = r'<td class="soubor"[^>]*><a href="([^"]+)">' diff --git a/module/plugins/crypter/SpeedLoadOrgFolder.py b/module/plugins/crypter/SpeedLoadOrgFolder.py deleted file mode 100644 index 092d3efe4..000000000 --- a/module/plugins/crypter/SpeedLoadOrgFolder.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter - - -class SpeedLoadOrgFolder(DeadCrypter): - __name__ = "SpeedLoadOrgFolder" - __type__ = "crypter" - __version__ = "0.3" - - __pattern__ = r'http://(?:www\.)?speedload\.org/(\d+~f$|folder/\d+/)' - - __description__ = """Speedload decrypter plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" diff --git a/module/plugins/crypter/StealthTo.py b/module/plugins/crypter/StealthTo.py deleted file mode 100644 index 402724e89..000000000 --- a/module/plugins/crypter/StealthTo.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter - - -class StealthTo(DeadCrypter): - __name__ = "StealthTo" - __type__ = "crypter" - __version__ = "0.2" - - __pattern__ = r'http://(?:www\.)?stealth\.to/folder/.+' - - __description__ = """Stealth.to decrypter plugin""" - __author_name__ = "spoob" - __author_mail__ = "spoob@pyload.org" diff --git a/module/plugins/crypter/TnyCz.py b/module/plugins/crypter/TnyCz.py deleted file mode 100644 index 3ae2c5ed2..000000000 --- a/module/plugins/crypter/TnyCz.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter - -import re - - -class TnyCz(SimpleCrypter): - __name__ = "TnyCz" - __type__ = "crypter" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?tny\.cz/\w+' - - __description__ = """Tny.cz decrypter plugin""" - __author_name__ = "Walter Purcaro" - __author_mail__ = "vuolter@gmail.com" - - TITLE_PATTERN = r'<title>(?P<title>.+) - .+' - - - def getLinks(self): - m = re.search(r'', self.html) - return re.findall(".+", self.load(m.group(1), decode=True)) if m else None diff --git a/module/plugins/crypter/TrailerzoneInfo.py b/module/plugins/crypter/TrailerzoneInfo.py deleted file mode 100644 index 42e45a819..000000000 --- a/module/plugins/crypter/TrailerzoneInfo.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter - - -class TrailerzoneInfo(DeadCrypter): - __name__ = "TrailerzoneInfo" - __type__ = "crypter" - __version__ = "0.03" - - __pattern__ = r'http://(?:www\.)?trailerzone.info/.*?' - - __description__ = """TrailerZone.info decrypter plugin""" - __author_name__ = "godofdream" - __author_mail__ = "soilfiction@gmail.com" diff --git a/module/plugins/crypter/TurbobitNetFolder.py b/module/plugins/crypter/TurbobitNetFolder.py deleted file mode 100644 index 0810e0ed1..000000000 --- a/module/plugins/crypter/TurbobitNetFolder.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleCrypter import SimpleCrypter -from module.common.json_layer import json_loads - - -class TurbobitNetFolder(SimpleCrypter): - __name__ = "TurbobitNetFolder" - __type__ = "crypter" - __version__ = "0.03" - - __pattern__ = r'http://(?:www\.)?turbobit\.net/download/folder/(?P\w+)' - - __description__ = """Turbobit.net folder decrypter plugin""" - __author_name__ = ("stickell", "Walter Purcaro") - __author_mail__ = ("l.stickell@yahoo.it", "vuolter@gmail.com") - - TITLE_PATTERN = r"src='/js/lib/grid/icon/folder.png'> (?P.+?)</span>" - - - def _getLinks(self, id, page=1): - gridFile = self.load("http://turbobit.net/downloadfolder/gridFile", - get={"rootId": id, "rows": 200, "page": page}, decode=True) - grid = json_loads(gridFile) - - if grid['rows']: - for i in grid['rows']: - yield i['id'] - for id in self._getLinks(id, page + 1): - yield id - else: - return - - def getLinks(self): - id = re.match(self.__pattern__, self.pyfile.url).group("ID") - fixurl = lambda id: "http://turbobit.net/%s.html" % id - return map(fixurl, self._getLinks(id)) diff --git a/module/plugins/crypter/TusfilesNetFolder.py b/module/plugins/crypter/TusfilesNetFolder.py deleted file mode 100644 index f51c2b715..000000000 --- a/module/plugins/crypter/TusfilesNetFolder.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- - -import math -import re -from urlparse import urljoin - -from module.plugins.internal.SimpleCrypter import SimpleCrypter - - -class TusfilesNetFolder(SimpleCrypter): - __name__ = "TusfilesNetFolder" - __type__ = "crypter" - __version__ = "0.02" - - __pattern__ = r'https?://(?:www\.)?tusfiles\.net/go/(?P<ID>\w+)/?' - - __description__ = """Tusfiles.net folder decrypter plugin""" - __author_name__ = ("Walter Purcaro", "stickell") - __author_mail__ = ("vuolter@gmail.com", "l.stickell@yahoo.it") - - LINK_PATTERN = r'<TD align=left><a href="(.*?)">' - TITLE_PATTERN = r'<Title>.*?\: (?P<title>.+) folder' - PAGES_PATTERN = r'>\((?P\d+) \w+\)<' - - URL_REPLACEMENTS = [(__pattern__, r'https://www.tusfiles.net/go/\g/')] - - - def loadPage(self, page_n): - return self.load(urljoin(self.pyfile.url, str(page_n)), decode=True) - - def handleMultiPages(self): - pages = re.search(self.PAGES_PATTERN, self.html) - if pages: - pages = int(math.ceil(int(pages.group('pages')) / 25.0)) - else: - return - - for p in xrange(2, pages + 1): - self.html = self.loadPage(p) - self.package_links += self.getLinks() diff --git a/module/plugins/crypter/UlozToFolder.py b/module/plugins/crypter/UlozToFolder.py deleted file mode 100644 index 06d30099c..000000000 --- a/module/plugins/crypter/UlozToFolder.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - - -class UlozToFolder(Crypter): - __name__ = "UlozToFolder" - __type__ = "crypter" - __version__ = "0.2" - - __pattern__ = r'http://(?:www\.)?(uloz\.to|ulozto\.(cz|sk|net)|bagruj.cz|zachowajto.pl)/(m|soubory)/.*' - - __description__ = """Uloz.to folder decrypter plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FOLDER_PATTERN = r'
      (.*?)
    ' - LINK_PATTERN = r'
    [^<]+' - NEXT_PAGE_PATTERN = r'' - - - def decrypt(self, pyfile): - html = self.load(pyfile.url) - - new_links = [] - for i in xrange(1, 100): - self.logInfo("Fetching links from page %i" % i) - m = re.search(self.FOLDER_PATTERN, html, re.DOTALL) - if m is None: - self.fail("Parse error (FOLDER)") - - new_links.extend(re.findall(self.LINK_PATTERN, m.group(1))) - m = re.search(self.NEXT_PAGE_PATTERN, html) - if m: - html = self.load("http://ulozto.net/" + m.group(1)) - else: - break - else: - self.logInfo("Limit of 99 pages reached, aborting") - - if new_links: - self.urls = [map(lambda s: "http://ulozto.net/%s" % s, new_links)] - else: - self.fail('Could not extract any links') diff --git a/module/plugins/crypter/UploadableChFolder.py b/module/plugins/crypter/UploadableChFolder.py deleted file mode 100644 index b76076531..000000000 --- a/module/plugins/crypter/UploadableChFolder.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter - - -class UploadableChFolder(SimpleCrypter): - __name__ = "UploadableChFolder" - __type__ = "crypter" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?uploadable\.ch/list/\w+' - - __description__ = """ Uploadable.ch folder decrypter plugin """ - __author_name__ = ("guidobelix", "Walter Purcaro") - __author_mail__ = ("guidobelix@hotmail.it", "vuolter@gmail.com") - - - LINK_PATTERN = r'"(.+?)" class="icon_zipfile">' - TITLE_PATTERN = r'
     (?P.+?)</div>' - OFFLINE_PATTERN = r'We are sorry... The URL you entered cannot be found on the server.' - TEMP_OFFLINE_PATTERN = r'<div class="icon_err">' diff --git a/module/plugins/crypter/UploadedToFolder.py b/module/plugins/crypter/UploadedToFolder.py deleted file mode 100644 index 068412062..000000000 --- a/module/plugins/crypter/UploadedToFolder.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleCrypter import SimpleCrypter - - -class UploadedToFolder(SimpleCrypter): - __name__ = "UploadedToFolder" - __type__ = "crypter" - __version__ = "0.3" - - __pattern__ = r'http://(?:www\.)?(uploaded|ul)\.(to|net)/(f|folder|list)/(?P<id>\w+)' - - __description__ = """UploadedTo decrypter plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - PLAIN_PATTERN = r'<small class="date"><a href="(?P<plain>[\w/]+)" onclick=' - TITLE_PATTERN = r'<title>(?P<title>[^<]+)' - - - def decrypt(self, pyfile): - self.html = self.load(pyfile.url) - - package_name, folder_name = self.getPackageNameAndFolder() - - m = re.search(self.PLAIN_PATTERN, self.html) - if m: - plain_link = 'http://uploaded.net/' + m.group('plain') - else: - self.fail('Parse error - Unable to find plain url list') - - self.html = self.load(plain_link) - package_links = self.html.split('\n')[:-1] - self.logDebug('Package has %d links' % len(package_links)) - - self.packages = [(package_name, package_links, folder_name)] diff --git a/module/plugins/crypter/WiiReloadedOrg.py b/module/plugins/crypter/WiiReloadedOrg.py deleted file mode 100644 index cb02fbd2d..000000000 --- a/module/plugins/crypter/WiiReloadedOrg.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter - - -class WiiReloadedOrg(DeadCrypter): - __name__ = "WiiReloadedOrg" - __type__ = "crypter" - __version__ = "0.11" - - __pattern__ = r'http://(?:www\.)?wii-reloaded\.org/protect/get\.php\?i=.+' - - __description__ = """Wii-Reloaded.org decrypter plugin""" - __author_name__ = "hzpz" - __author_mail__ = None diff --git a/module/plugins/crypter/XupPl.py b/module/plugins/crypter/XupPl.py deleted file mode 100644 index 5e5f511a8..000000000 --- a/module/plugins/crypter/XupPl.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.Crypter import Crypter - - -class XupPl(Crypter): - __name__ = "XupPl" - __type__ = "crypter" - __version__ = "0.1" - - __pattern__ = r'https?://(?:[^/]*\.)?xup\.pl/.*' - - __description__ = """Xup.pl decrypter plugin""" - __author_name__ = "z00nx" - __author_mail__ = "z00nx0@gmail.com" - - - def decrypt(self, pyfile): - header = self.load(pyfile.url, just_header=True) - if 'location' in header: - self.urls = [header['location']] - else: - self.fail('Unable to find link') diff --git a/module/plugins/crypter/YoutubeBatch.py b/module/plugins/crypter/YoutubeBatch.py deleted file mode 100644 index 158dfeee9..000000000 --- a/module/plugins/crypter/YoutubeBatch.py +++ /dev/null @@ -1,138 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from urlparse import urljoin - -from module.common.json_layer import json_loads -from module.plugins.Crypter import Crypter -from module.utils import safe_join - -API_URL = "AIzaSyCKnWLNlkX-L4oD1aEzqqhRw1zczeD6_k0" - - -class YoutubeBatch(Crypter): - __name__ = "YoutubeBatch" - __type__ = "crypter" - __version__ = "1.00" - - __pattern__ = r'https?://(?:www\.|m\.)?youtube\.com/(?Puser|playlist|view_play_list)(/|.*?[?&](?:list|p)=)(?P[\w-]+)' - __config__ = [("likes", "bool", "Grab user (channel) liked videos", False), - ("favorites", "bool", "Grab user (channel) favorite videos", False), - ("uploads", "bool", "Grab channel unplaylisted videos", True)] - - __description__ = """Youtube.com channel & playlist decrypter plugin""" - __author_name__ = "Walter Purcaro" - __author_mail__ = "vuolter@gmail.com" - - - def api_response(self, ref, req): - req.update({"key": API_KEY}) - url = urljoin("https://www.googleapis.com/youtube/v3/", ref) - page = self.load(url, get=req) - return json_loads(page) - - def getChannel(self, user): - channels = self.api_response("channels", {"part": "id,snippet,contentDetails", "forUsername": user, "maxResults": "50"}) - if channels['items']: - channel = channels['items'][0] - return {"id": channel['id'], - "title": channel['snippet']['title'], - "relatedPlaylists": channel['contentDetails']['relatedPlaylists'], - "user": user} # One lone channel for user? - - def getPlaylist(self, p_id): - playlists = self.api_response("playlists", {"part": "snippet", "id": p_id}) - if playlists['items']: - playlist = playlists['items'][0] - return {"id": p_id, - "title": playlist['snippet']['title'], - "channelId": playlist['snippet']['channelId'], - "channelTitle": playlist['snippet']['channelTitle']} - - def _getPlaylists(self, id, token=None): - req = {"part": "id", "maxResults": "50", "channelId": id} - if token: - req.update({"pageToken": token}) - - playlists = self.api_response("playlists", req) - - for playlist in playlists['items']: - yield playlist['id'] - - if "nextPageToken" in playlists: - for item in self._getPlaylists(id, playlists['nextPageToken']): - yield item - - def getPlaylists(self, ch_id): - return map(self.getPlaylist, self._getPlaylists(ch_id)) - - def _getVideosId(self, id, token=None): - req = {"part": "contentDetails", "maxResults": "50", "playlistId": id} - if token: - req.update({"pageToken": token}) - - playlist = self.api_response("playlistItems", req) - - for item in playlist['items']: - yield item['contentDetails']['videoId'] - - if "nextPageToken" in playlist: - for item in self._getVideosId(id, playlist['nextPageToken']): - yield item - - def getVideosId(self, p_id): - return list(self._getVideosId(p_id)) - - def decrypt(self, pyfile): - m = re.match(self.__pattern__, pyfile.url) - m_id = m.group("ID") - m_type = m.group("TYPE") - - if m_type == "user": - self.logDebug("Url recognized as Channel") - user = m_id - channel = self.getChannel(user) - - if channel: - playlists = self.getPlaylists(channel['id']) - self.logDebug("%s playlist\s found on channel \"%s\"" % (len(playlists), channel['title'])) - - relatedplaylist = {p_name: self.getPlaylist(p_id) for p_name, p_id in channel['relatedPlaylists'].iteritems()} - self.logDebug("Channel's related playlists found = %s" % relatedplaylist.keys()) - - relatedplaylist['uploads']['title'] = "Unplaylisted videos" - relatedplaylist['uploads']['checkDups'] = True #: checkDups flag - - for p_name, p_data in relatedplaylist.iteritems(): - if self.getConfig(p_name): - p_data['title'] += " of " + user - playlists.append(p_data) - else: - playlists = [] - else: - self.logDebug("Url recognized as Playlist") - playlists = [self.getPlaylist(m_id)] - - if not playlists: - self.fail("No playlist available") - - addedvideos = [] - urlize = lambda x: "https://www.youtube.com/watch?v=" + x - for p in playlists: - p_name = p['title'] - p_videos = self.getVideosId(p['id']) - p_folder = safe_join(self.config['general']['download_folder'], p['channelTitle'], p_name) - self.logDebug("%s video\s found on playlist \"%s\"" % (len(p_videos), p_name)) - - if not p_videos: - continue - elif "checkDups" in p: - p_urls = [urlize(v_id) for v_id in p_videos if v_id not in addedvideos] - self.logDebug("%s video\s available on playlist \"%s\" after duplicates cleanup" % (len(p_urls), p_name)) - else: - p_urls = map(urlize, p_videos) - - self.packages.append((p_name, p_urls, p_folder)) #: folder is NOT recognized by pyload 0.4.9! - - addedvideos.extend(p_videos) diff --git a/module/plugins/crypter/__init__.py b/module/plugins/crypter/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/module/plugins/hooks/AlldebridCom.py b/module/plugins/hooks/AlldebridCom.py deleted file mode 100644 index 906875a69..000000000 --- a/module/plugins/hooks/AlldebridCom.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class AlldebridCom(MultiHoster): - __name__ = "AlldebridCom" - __type__ = "hook" - __version__ = "0.13" - - __config__ = [("activated", "bool", "Activated", False), - ("https", "bool", "Enable HTTPS", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to stanard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """Alldebrid.com hook plugin""" - __author_name__ = "Andy Voigt" - __author_mail__ = "spamsales@online.de" - - - def getHoster(self): - https = "https" if self.getConfig("https") else "http" - page = getURL(https + "://www.alldebrid.com/api.php?action=get_host").replace("\"", "").strip() - - return [x.strip() for x in page.split(",") if x.strip()] diff --git a/module/plugins/hooks/BypassCaptcha.py b/module/plugins/hooks/BypassCaptcha.py deleted file mode 100644 index d62de24a7..000000000 --- a/module/plugins/hooks/BypassCaptcha.py +++ /dev/null @@ -1,127 +0,0 @@ -# -*- coding: utf-8 -*- - -from pycurl import FORM_FILE, LOW_SPEED_TIME -from thread import start_new_thread - -from module.network.HTTPRequest import BadHeader -from module.network.RequestFactory import getURL, getRequest -from module.plugins.Hook import Hook - - -class BypassCaptchaException(Exception): - - def __init__(self, err): - self.err = err - - def getCode(self): - return self.err - - def __str__(self): - return "" % self.err - - def __repr__(self): - return "" % self.err - - -class BypassCaptcha(Hook): - __name__ = "BypassCaptcha" - __type__ = "hook" - __version__ = "0.04" - - __config__ = [("activated", "bool", "Activated", False), - ("force", "bool", "Force BC even if client is connected", False), - ("passkey", "password", "Passkey", "")] - - __description__ = """Send captchas to BypassCaptcha.com""" - __author_name__ = ("RaNaN", "Godofdream", "zoidberg") - __author_mail__ = ("RaNaN@pyload.org", "soilfcition@gmail.com", "zoidberg@mujmail.cz") - - PYLOAD_KEY = "4f771155b640970d5607f919a615bdefc67e7d32" - - SUBMIT_URL = "http://bypasscaptcha.com/upload.php" - RESPOND_URL = "http://bypasscaptcha.com/check_value.php" - GETCREDITS_URL = "http://bypasscaptcha.com/ex_left.php" - - - def setup(self): - self.info = {} - - def getCredits(self): - response = getURL(self.GETCREDITS_URL, post={"key": self.getConfig("passkey")}) - - data = dict([x.split(' ', 1) for x in response.splitlines()]) - return int(data['Left']) - - def submit(self, captcha, captchaType="file", match=None): - req = getRequest() - - #raise timeout threshold - req.c.setopt(LOW_SPEED_TIME, 80) - - try: - response = req.load(self.SUBMIT_URL, - post={"vendor_key": self.PYLOAD_KEY, - "key": self.getConfig("passkey"), - "gen_task_id": "1", - "file": (FORM_FILE, captcha)}, - multipart=True) - finally: - req.close() - - data = dict([x.split(' ', 1) for x in response.splitlines()]) - if not data or "Value" not in data: - raise BypassCaptchaException(response) - - result = data['Value'] - ticket = data['TaskId'] - self.logDebug("result %s : %s" % (ticket, result)) - - return ticket, result - - def respond(self, ticket, success): - try: - response = getURL(self.RESPOND_URL, post={"task_id": ticket, "key": self.getConfig("passkey"), - "cv": 1 if success else 0}) - except BadHeader, e: - self.logError("Could not send response.", str(e)) - - def newCaptchaTask(self, task): - if "service" in task.data: - return False - - if not task.isTextual(): - return False - - if not self.getConfig("passkey"): - return False - - if self.core.isClientConnected() and not self.getConfig("force"): - return False - - if self.getCredits() > 0: - task.handler.append(self) - task.data['service'] = self.__name__ - task.setWaiting(100) - start_new_thread(self.processCaptcha, (task,)) - - else: - self.logInfo("Your %s account has not enough credits" % self.__name__) - - def captchaCorrect(self, task): - if task.data['service'] == self.__name__ and "ticket" in task.data: - self.respond(task.data['ticket'], True) - - def captchaInvalid(self, task): - if task.data['service'] == self.__name__ and "ticket" in task.data: - self.respond(task.data['ticket'], False) - - def processCaptcha(self, task): - c = task.captchaFile - try: - ticket, result = self.submit(c) - except BypassCaptchaException, e: - task.error = e.getCode() - return - - task.data['ticket'] = ticket - task.setResult(result) diff --git a/module/plugins/hooks/Captcha9kw.py b/module/plugins/hooks/Captcha9kw.py deleted file mode 100755 index 1b7406edd..000000000 --- a/module/plugins/hooks/Captcha9kw.py +++ /dev/null @@ -1,156 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -import time - -from base64 import b64encode -from thread import start_new_thread - -from module.network.HTTPRequest import BadHeader -from module.network.RequestFactory import getURL -from module.plugins.Hook import Hook - - -class Captcha9kw(Hook): - __name__ = "Captcha9kw" - __type__ = "hook" - __version__ = "0.09" - - __config__ = [("activated", "bool", "Activated", False), - ("force", "bool", "Force CT even if client is connected", True), - ("https", "bool", "Enable HTTPS", False), - ("confirm", "bool", "Confirm Captcha (Cost +6)", False), - ("captchaperhour", "int", "Captcha per hour (max. 9999)", 9999), - ("prio", "int", "Prio 1-10 (Cost +1-10)", 0), - ("selfsolve", "bool", - "If enabled and you have a 9kw client active only you will get your captcha to solve it (Selfsolve)", - False), - ("timeout", "int", "Timeout (max. 300)", 300), - ("passkey", "password", "API key", "")] - - __description__ = """Send captchas to 9kw.eu""" - __author_name__ = "RaNaN" - __author_mail__ = "RaNaN@pyload.org" - - API_URL = "://www.9kw.eu/index.cgi" - - - def setup(self): - self.API_URL = "https" + self.API_URL if self.getConfig("https") else "http" + self.API_URL - self.info = {} - - def getCredits(self): - response = getURL(self.API_URL, get={"apikey": self.getConfig("passkey"), "pyload": "1", "source": "pyload", - "action": "usercaptchaguthaben"}) - - if response.isdigit(): - self.logInfo(_("%s credits left") % response) - self.info['credits'] = credits = int(response) - return credits - else: - self.logError(response) - return 0 - - def processCaptcha(self, task): - result = None - - with open(task.captchaFile, 'rb') as f: - data = f.read() - data = b64encode(data) - self.logDebug("%s : %s" % (task.captchaFile, data)) - if task.isPositional(): - mouse = 1 - else: - mouse = 0 - - response = getURL(self.API_URL, post={ - "apikey": self.getConfig("passkey"), - "prio": self.getConfig("prio"), - "confirm": self.getConfig("confirm"), - "captchaperhour": self.getConfig("captchaperhour"), - "maxtimeout": self.getConfig("timeout"), - "selfsolve": self.getConfig("selfsolve"), - "pyload": "1", - "source": "pyload", - "base64": "1", - "mouse": mouse, - "file-upload-01": data, - "action": "usercaptchaupload"}) - - if response.isdigit(): - self.logInfo(_("New CaptchaID from upload: %s : %s") % (response, task.captchaFile)) - - for _ in xrange(1, 100, 1): - response2 = getURL(self.API_URL, get={"apikey": self.getConfig("passkey"), "id": response, - "pyload": "1", "source": "pyload", - "action": "usercaptchacorrectdata"}) - - if response2 != "": - break - - time.sleep(3) - - result = response2 - task.data['ticket'] = response - self.logInfo("result %s : %s" % (response, result)) - task.setResult(result) - else: - self.logError("Bad upload: %s" % response) - return False - - def newCaptchaTask(self, task): - if not task.isTextual() and not task.isPositional(): - return False - - if not self.getConfig("passkey"): - return False - - if self.core.isClientConnected() and not self.getConfig("force"): - return False - - if self.getCredits() > 0: - task.handler.append(self) - task.setWaiting(self.getConfig("timeout")) - start_new_thread(self.processCaptcha, (task,)) - - else: - self.logError(_("Your Captcha 9kw.eu Account has not enough credits")) - - def captchaCorrect(self, task): - if "ticket" in task.data: - - try: - response = getURL(self.API_URL, - post={"action": "usercaptchacorrectback", - "apikey": self.getConfig("passkey"), - "api_key": self.getConfig("passkey"), - "correct": "1", - "pyload": "1", - "source": "pyload", - "id": task.data['ticket']}) - self.logInfo("Request correct: %s" % response) - - except BadHeader, e: - self.logError("Could not send correct request.", str(e)) - else: - self.logError("No CaptchaID for correct request (task %s) found." % task) - - def captchaInvalid(self, task): - if "ticket" in task.data: - - try: - response = getURL(self.API_URL, - post={"action": "usercaptchacorrectback", - "apikey": self.getConfig("passkey"), - "api_key": self.getConfig("passkey"), - "correct": "2", - "pyload": "1", - "source": "pyload", - "id": task.data['ticket']}) - self.logInfo("Request refund: %s" % response) - - except BadHeader, e: - self.logError("Could not send refund request.", str(e)) - else: - self.logError("No CaptchaID for not correct request (task %s) found." % task) diff --git a/module/plugins/hooks/CaptchaBrotherhood.py b/module/plugins/hooks/CaptchaBrotherhood.py deleted file mode 100644 index e240cbbc0..000000000 --- a/module/plugins/hooks/CaptchaBrotherhood.py +++ /dev/null @@ -1,157 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -import StringIO -import pycurl - -from PIL import Image -from thread import start_new_thread -from time import sleep -from urllib import urlencode - -from module.network.RequestFactory import getURL, getRequest -from module.plugins.Hook import Hook - - -class CaptchaBrotherhoodException(Exception): - - def __init__(self, err): - self.err = err - - def getCode(self): - return self.err - - def __str__(self): - return "" % self.err - - def __repr__(self): - return "" % self.err - - -class CaptchaBrotherhood(Hook): - __name__ = "CaptchaBrotherhood" - __type__ = "hook" - __version__ = "0.05" - - __config__ = [("activated", "bool", "Activated", False), - ("username", "str", "Username", ""), - ("force", "bool", "Force CT even if client is connected", False), - ("passkey", "password", "Password", "")] - - __description__ = """Send captchas to CaptchaBrotherhood.com""" - __author_name__ = ("RaNaN", "zoidberg") - __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") - - API_URL = "http://www.captchabrotherhood.com/" - - - def setup(self): - self.info = {} - - def getCredits(self): - response = getURL(self.API_URL + "askCredits.aspx", - get={"username": self.getConfig("username"), "password": self.getConfig("passkey")}) - if not response.startswith("OK"): - raise CaptchaBrotherhoodException(response) - else: - credits = int(response[3:]) - self.logInfo(_("%d credits left") % credits) - self.info['credits'] = credits - return credits - - def submit(self, captcha, captchaType="file", match=None): - try: - img = Image.open(captcha) - output = StringIO.StringIO() - self.logDebug("CAPTCHA IMAGE", img, img.format, img.mode) - if img.format in ("GIF", "JPEG"): - img.save(output, img.format) - else: - if img.mode != "RGB": - img = img.convert("RGB") - img.save(output, "JPEG") - data = output.getvalue() - output.close() - except Exception, e: - raise CaptchaBrotherhoodException("Reading or converting captcha image failed: %s" % e) - - req = getRequest() - - url = "%ssendNewCaptcha.aspx?%s" % (self.API_URL, - urlencode({"username": self.getConfig("username"), - "password": self.getConfig("passkey"), - "captchaSource": "pyLoad", - "timeout": "80"})) - - req.c.setopt(pycurl.URL, url) - req.c.setopt(pycurl.POST, 1) - req.c.setopt(pycurl.POSTFIELDS, data) - req.c.setopt(pycurl.HTTPHEADER, ["Content-Type: text/html"]) - - try: - req.c.perform() - response = req.getResponse() - except Exception, e: - raise CaptchaBrotherhoodException("Submit captcha image failed") - - req.close() - - if not response.startswith("OK"): - raise CaptchaBrotherhoodException(response[1]) - - ticket = response[3:] - - for _ in xrange(15): - sleep(5) - response = self.get_api("askCaptchaResult", ticket) - if response.startswith("OK-answered"): - return ticket, response[12:] - - raise CaptchaBrotherhoodException("No solution received in time") - - def get_api(self, api, ticket): - response = getURL("%s%s.aspx" % (self.API_URL, api), - get={"username": self.getConfig("username"), - "password": self.getConfig("passkey"), - "captchaID": ticket}) - if not response.startswith("OK"): - raise CaptchaBrotherhoodException("Unknown response: %s" % response) - - return response - - def newCaptchaTask(self, task): - if "service" in task.data: - return False - - if not task.isTextual(): - return False - - if not self.getConfig("username") or not self.getConfig("passkey"): - return False - - if self.core.isClientConnected() and not self.getConfig("force"): - return False - - if self.getCredits() > 10: - task.handler.append(self) - task.data['service'] = self.__name__ - task.setWaiting(100) - start_new_thread(self.processCaptcha, (task,)) - else: - self.logInfo("Your CaptchaBrotherhood Account has not enough credits") - - def captchaInvalid(self, task): - if task.data['service'] == self.__name__ and "ticket" in task.data: - response = self.get_api("complainCaptcha", task.data['ticket']) - - def processCaptcha(self, task): - c = task.captchaFile - try: - ticket, result = self.submit(c) - except CaptchaBrotherhoodException, e: - task.error = e.getCode() - return - - task.data['ticket'] = ticket - task.setResult(result) diff --git a/module/plugins/hooks/Checksum.py b/module/plugins/hooks/Checksum.py deleted file mode 100644 index c2c088066..000000000 --- a/module/plugins/hooks/Checksum.py +++ /dev/null @@ -1,175 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -import hashlib -import re -import zlib - -from os import remove -from os.path import getsize, isfile, splitext - -from module.plugins.Hook import Hook -from module.utils import safe_join, fs_encode - - -def computeChecksum(local_file, algorithm): - if algorithm in getattr(hashlib, "algorithms", ("md5", "sha1", "sha224", "sha256", "sha384", "sha512")): - h = getattr(hashlib, algorithm)() - - with open(local_file, 'rb') as f: - for chunk in iter(lambda: f.read(128 * h.block_size), b''): - h.update(chunk) - - return h.hexdigest() - - elif algorithm in ("adler32", "crc32"): - hf = getattr(zlib, algorithm) - last = 0 - - with open(local_file, 'rb') as f: - for chunk in iter(lambda: f.read(8192), b''): - last = hf(chunk, last) - - return "%x" % last - - else: - return None - - -class Checksum(Hook): - __name__ = "Checksum" - __type__ = "hook" - __version__ = "0.13" - - __config__ = [("activated", "bool", "Activated", False), - ("check_checksum", "bool", "Check checksum? (If False only size will be verified)", True), - ("check_action", "fail;retry;nothing", "What to do if check fails?", "retry"), - ("max_tries", "int", "Number of retries", 2), - ("retry_action", "fail;nothing", "What to do if all retries fail?", "fail"), - ("wait_time", "int", "Time to wait before each retry (seconds)", 1)] - - __description__ = """Verify downloaded file size and checksum""" - __author_name__ = ("zoidberg", "Walter Purcaro", "stickell") - __author_mail__ = ("zoidberg@mujmail.cz", "vuolter@gmail.com", "l.stickell@yahoo.it") - - methods = {'sfv': 'crc32', 'crc': 'crc32', 'hash': 'md5'} - regexps = {'sfv': r'^(?P[^;].+)\s+(?P[0-9A-Fa-f]{8})$', - 'md5': r'^(?P[0-9A-Fa-f]{32}) (?P.+)$', - 'crc': r'filename=(?P.+)\nsize=(?P\d+)\ncrc32=(?P[0-9A-Fa-f]{8})$', - 'default': r'^(?P[0-9A-Fa-f]+)\s+\*?(?P.+)$'} - - - def coreReady(self): - if not self.getConfig("check_checksum"): - self.logInfo("Checksum validation is disabled in plugin configuration") - - def setup(self): - self.algorithms = sorted( - getattr(hashlib, "algorithms", ("md5", "sha1", "sha224", "sha256", "sha384", "sha512")), reverse=True) - self.algorithms.extend(["crc32", "adler32"]) - self.formats = self.algorithms + ["sfv", "crc", "hash"] - - def downloadFinished(self, pyfile): - """ - Compute checksum for the downloaded file and compare it with the hash provided by the hoster. - pyfile.plugin.check_data should be a dictionary which can contain: - a) if known, the exact filesize in bytes (e.g. "size": 123456789) - b) hexadecimal hash string with algorithm name as key (e.g. "md5": "d76505d0869f9f928a17d42d66326307") - """ - if hasattr(pyfile.plugin, "check_data") and (isinstance(pyfile.plugin.check_data, dict)): - data = pyfile.plugin.check_data.copy() - elif hasattr(pyfile.plugin, "api_data") and (isinstance(pyfile.plugin.api_data, dict)): - data = pyfile.plugin.api_data.copy() - else: - return - - self.logDebug(data) - - if not pyfile.plugin.lastDownload: - self.checkFailed(pyfile, None, "No file downloaded") - - local_file = fs_encode(pyfile.plugin.lastDownload) - #download_folder = self.config['general']['download_folder'] - #local_file = fs_encode(safe_join(download_folder, pyfile.package().folder, pyfile.name)) - - if not isfile(local_file): - self.checkFailed(pyfile, None, "File does not exist") - - # validate file size - if "size" in data: - api_size = int(data['size']) - file_size = getsize(local_file) - if api_size != file_size: - self.logWarning("File %s has incorrect size: %d B (%d expected)" % (pyfile.name, file_size, api_size)) - self.checkFailed(pyfile, local_file, "Incorrect file size") - del data['size'] - - # validate checksum - if data and self.getConfig("check_checksum"): - if "checksum" in data: - data['md5'] = data['checksum'] - - for key in self.algorithms: - if key in data: - checksum = computeChecksum(local_file, key.replace("-", "").lower()) - if checksum: - if checksum == data[key].lower(): - self.logInfo('File integrity of "%s" verified by %s checksum (%s).' % - (pyfile.name, key.upper(), checksum)) - break - else: - self.logWarning("%s checksum for file %s does not match (%s != %s)" % - (key.upper(), pyfile.name, checksum, data[key])) - self.checkFailed(pyfile, local_file, "Checksums do not match") - else: - self.logWarning("Unsupported hashing algorithm: %s" % key.upper()) - else: - self.logWarning("Unable to validate checksum for file %s" % pyfile.name) - - def checkFailed(self, pyfile, local_file, msg): - check_action = self.getConfig("check_action") - if check_action == "retry": - max_tries = self.getConfig("max_tries") - retry_action = self.getConfig("retry_action") - if pyfile.plugin.retries < max_tries: - if local_file: - remove(local_file) - pyfile.plugin.retry(max_tries=max_tries, wait_time=self.getConfig("wait_time"), reason=msg) - elif retry_action == "nothing": - return - elif check_action == "nothing": - return - pyfile.plugin.fail(reason=msg) - - def packageFinished(self, pypack): - download_folder = safe_join(self.config['general']['download_folder'], pypack.folder, "") - - for link in pypack.getChildren().itervalues(): - file_type = splitext(link['name'])[1][1:].lower() - #self.logDebug(link, file_type) - - if file_type not in self.formats: - continue - - hash_file = fs_encode(safe_join(download_folder, link['name'])) - if not isfile(hash_file): - self.logWarning("File not found: %s" % link['name']) - continue - - with open(hash_file) as f: - text = f.read() - - for m in re.finditer(self.regexps.get(file_type, self.regexps['default']), text): - data = m.groupdict() - self.logDebug(link['name'], data) - - local_file = fs_encode(safe_join(download_folder, data['name'])) - algorithm = self.methods.get(file_type, file_type) - checksum = computeChecksum(local_file, algorithm) - if checksum == data['hash']: - self.logInfo('File integrity of "%s" verified by %s checksum (%s).' % - (data['name'], algorithm, checksum)) - else: - self.logWarning("%s checksum for file %s does not match (%s != %s)" % - (algorithm, data['name'], checksum, data['hash'])) diff --git a/module/plugins/hooks/ClickAndLoad.py b/module/plugins/hooks/ClickAndLoad.py deleted file mode 100644 index 5c523caf7..000000000 --- a/module/plugins/hooks/ClickAndLoad.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- - -import socket -import thread - -from module.plugins.Hook import Hook - - -class ClickAndLoad(Hook): - __name__ = "ClickAndLoad" - __type__ = "hook" - __version__ = "0.22" - - __config__ = [("activated", "bool", "Activated", True), - ("extern", "bool", "Allow external link adding", False)] - - __description__ = """Gives abillity to use jd's click and load. depends on webinterface""" - __author_name__ = ("RaNaN", "mkaay") - __author_mail__ = ("RaNaN@pyload.de", "mkaay@mkaay.de") - - - def coreReady(self): - self.port = int(self.config['webinterface']['port']) - if self.config['webinterface']['activated']: - try: - if self.getConfig("extern"): - ip = "0.0.0.0" - else: - ip = "127.0.0.1" - - thread.start_new_thread(proxy, (self, ip, self.port, 9666)) - except: - self.logError("ClickAndLoad port already in use.") - - -def proxy(self, *settings): - thread.start_new_thread(server, (self,) + settings) - lock = thread.allocate_lock() - lock.acquire() - lock.acquire() - - -def server(self, *settings): - try: - dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - dock_socket.bind((settings[0], settings[2])) - dock_socket.listen(5) - while True: - client_socket = dock_socket.accept()[0] - server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - server_socket.connect(("127.0.0.1", settings[1])) - thread.start_new_thread(forward, (client_socket, server_socket)) - thread.start_new_thread(forward, (server_socket, client_socket)) - except socket.error, e: - if hasattr(e, "errno"): - errno = e.errno - else: - errno = e.args[0] - - if errno == 98: - self.logWarning(_("Click'N'Load: Port 9666 already in use")) - return - thread.start_new_thread(server, (self,) + settings) - except: - thread.start_new_thread(server, (self,) + settings) - - -def forward(source, destination): - string = ' ' - while string: - string = source.recv(1024) - if string: - destination.sendall(string) - else: - #source.shutdown(socket.SHUT_RD) - destination.shutdown(socket.SHUT_WR) diff --git a/module/plugins/hooks/DeathByCaptcha.py b/module/plugins/hooks/DeathByCaptcha.py deleted file mode 100644 index 530395d32..000000000 --- a/module/plugins/hooks/DeathByCaptcha.py +++ /dev/null @@ -1,202 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -import re - -from base64 import b64encode -from pycurl import FORM_FILE, HTTPHEADER -from thread import start_new_thread -from time import sleep - -from module.common.json_layer import json_loads -from module.network.HTTPRequest import BadHeader -from module.network.RequestFactory import getRequest -from module.plugins.Hook import Hook - - -class DeathByCaptchaException(Exception): - DBC_ERRORS = {'not-logged-in': 'Access denied, check your credentials', - 'invalid-credentials': 'Access denied, check your credentials', - 'banned': 'Access denied, account is suspended', - 'insufficient-funds': 'Insufficient account balance to decrypt CAPTCHA', - 'invalid-captcha': 'CAPTCHA is not a valid image', - 'service-overload': 'CAPTCHA was rejected due to service overload, try again later', - 'invalid-request': 'Invalid request', - 'timed-out': 'No CAPTCHA solution received in time'} - - def __init__(self, err): - self.err = err - - def getCode(self): - return self.err - - def getDesc(self): - if self.err in self.DBC_ERRORS.keys(): - return self.DBC_ERRORS[self.err] - else: - return self.err - - def __str__(self): - return "" % self.err - - def __repr__(self): - return "" % self.err - - -class DeathByCaptcha(Hook): - __name__ = "DeathByCaptcha" - __type__ = "hook" - __version__ = "0.03" - - __config__ = [("activated", "bool", "Activated", False), - ("username", "str", "Username", ""), - ("passkey", "password", "Password", ""), - ("force", "bool", "Force DBC even if client is connected", False)] - - __description__ = """Send captchas to DeathByCaptcha.com""" - __author_name__ = ("RaNaN", "zoidberg") - __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") - - API_URL = "http://api.dbcapi.me/api/" - - - def setup(self): - self.info = {} - - def call_api(self, api="captcha", post=False, multipart=False): - req = getRequest() - req.c.setopt(HTTPHEADER, ["Accept: application/json", "User-Agent: pyLoad %s" % self.core.version]) - - if post: - if not isinstance(post, dict): - post = {} - post.update({"username": self.getConfig("username"), - "password": self.getConfig("passkey")}) - - response = None - try: - json = req.load("%s%s" % (self.API_URL, api), - post=post, - multipart=multipart) - self.logDebug(json) - response = json_loads(json) - - if "error" in response: - raise DeathByCaptchaException(response['error']) - elif "status" not in response: - raise DeathByCaptchaException(str(response)) - - except BadHeader, e: - if 403 == e.code: - raise DeathByCaptchaException('not-logged-in') - elif 413 == e.code: - raise DeathByCaptchaException('invalid-captcha') - elif 503 == e.code: - raise DeathByCaptchaException('service-overload') - elif e.code in (400, 405): - raise DeathByCaptchaException('invalid-request') - else: - raise - - finally: - req.close() - - return response - - def getCredits(self): - response = self.call_api("user", True) - - if 'is_banned' in response and response['is_banned']: - raise DeathByCaptchaException('banned') - elif 'balance' in response and 'rate' in response: - self.info.update(response) - else: - raise DeathByCaptchaException(response) - - def getStatus(self): - response = self.call_api("status", False) - - if 'is_service_overloaded' in response and response['is_service_overloaded']: - raise DeathByCaptchaException('service-overload') - - def submit(self, captcha, captchaType="file", match=None): - #workaround multipart-post bug in HTTPRequest.py - if re.match("^[A-Za-z0-9]*$", self.getConfig("passkey")): - multipart = True - data = (FORM_FILE, captcha) - else: - multipart = False - with open(captcha, 'rb') as f: - data = f.read() - data = "base64:" + b64encode(data) - - response = self.call_api("captcha", {"captchafile": data}, multipart) - - if "captcha" not in response: - raise DeathByCaptchaException(response) - ticket = response['captcha'] - - for _ in xrange(24): - sleep(5) - response = self.call_api("captcha/%d" % ticket, False) - if response['text'] and response['is_correct']: - break - else: - raise DeathByCaptchaException('timed-out') - - result = response['text'] - self.logDebug("result %s : %s" % (ticket, result)) - - return ticket, result - - def newCaptchaTask(self, task): - if "service" in task.data: - return False - - if not task.isTextual(): - return False - - if not self.getConfig("username") or not self.getConfig("passkey"): - return False - - if self.core.isClientConnected() and not self.getConfig("force"): - return False - - try: - self.getStatus() - self.getCredits() - except DeathByCaptchaException, e: - self.logError(e.getDesc()) - return False - - balance, rate = self.info['balance'], self.info['rate'] - self.logInfo("Account balance: US$%.3f (%d captchas left at %.2f cents each)" % (balance / 100, - balance // rate, rate)) - - if balance > rate: - task.handler.append(self) - task.data['service'] = self.__name__ - task.setWaiting(180) - start_new_thread(self.processCaptcha, (task,)) - - def captchaInvalid(self, task): - if task.data['service'] == self.__name__ and "ticket" in task.data: - try: - response = self.call_api("captcha/%d/report" % task.data['ticket'], True) - except DeathByCaptchaException, e: - self.logError(e.getDesc()) - except Exception, e: - self.logError(e) - - def processCaptcha(self, task): - c = task.captchaFile - try: - ticket, result = self.submit(c) - except DeathByCaptchaException, e: - task.error = e.getCode() - self.logError(e.getDesc()) - return - - task.data['ticket'] = ticket - task.setResult(result) diff --git a/module/plugins/hooks/DebridItaliaCom.py b/module/plugins/hooks/DebridItaliaCom.py deleted file mode 100644 index 88efb6b2a..000000000 --- a/module/plugins/hooks/DebridItaliaCom.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.MultiHoster import MultiHoster - - -class DebridItaliaCom(MultiHoster): - __name__ = "DebridItaliaCom" - __type__ = "hook" - __version__ = "0.07" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to standard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """Debriditalia.com hook plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - - def getHoster(self): - return ["netload.in", "hotfile.com", "rapidshare.com", "multiupload.com", - "uploading.com", "megashares.com", "crocko.com", "filepost.com", - "bitshare.com", "share-links.biz", "putlocker.com", "uploaded.to", - "speedload.org", "rapidgator.net", "likeupload.net", "cyberlocker.ch", - "depositfiles.com", "extabit.com", "filefactory.com", "sharefiles.co", - "ryushare.com", "tusfiles.net", "nowvideo.co", "cloudzer.net", "letitbit.net", - "easybytez.com", "uptobox.com", "ddlstorage.com"] diff --git a/module/plugins/hooks/DeleteFinished.py b/module/plugins/hooks/DeleteFinished.py deleted file mode 100644 index bc926906f..000000000 --- a/module/plugins/hooks/DeleteFinished.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.database import style -from module.plugins.Hook import Hook - - -class DeleteFinished(Hook): - __name__ = "DeleteFinished" - __type__ = "hook" - __version__ = "1.09" - - __config__ = [('activated', 'bool', 'Activated', 'False'), - ('interval', 'int', 'Delete every (hours)', '72'), - ('deloffline', 'bool', 'Delete packages with offline links', 'False')] - - __description__ = """Automatically delete all finished packages from queue""" - __author_name__ = "Walter Purcaro" - __author_mail__ = "vuolter@gmail.com" - - - ## overwritten methods ## - def periodical(self): - if not self.info['sleep']: - deloffline = self.getConfig('deloffline') - mode = '0,1,4' if deloffline else '0,4' - msg = 'delete all finished packages in queue list (%s packages with offline links)' - self.logInfo(msg % ('including' if deloffline else 'excluding')) - self.deleteFinished(mode) - self.info['sleep'] = True - self.addEvent('packageFinished', self.wakeup) - - def pluginConfigChanged(self, plugin, name, value): - if name == 'interval' and value != self.interval: - self.interval = value * 3600 - self.initPeriodical() - - def unload(self): - self.removeEvent('packageFinished', self.wakeup) - - def coreReady(self): - self.info = {'sleep': True} - interval = self.getConfig('interval') - self.pluginConfigChanged('DeleteFinished', 'interval', interval) - self.addEvent('packageFinished', self.wakeup) - - ## own methods ## - @style.queue - def deleteFinished(self, mode): - self.c.execute('DELETE FROM packages WHERE NOT EXISTS(SELECT 1 FROM links WHERE package=packages.id AND status NOT IN (%s))' % mode) - self.c.execute('DELETE FROM links WHERE NOT EXISTS(SELECT 1 FROM packages WHERE id=links.package)') - - def wakeup(self, pypack): - self.removeEvent('packageFinished', self.wakeup) - self.info['sleep'] = False - - ## event managing ## - def addEvent(self, event, func): - """Adds an event listener for event name""" - if event in self.m.events: - if func in self.m.events[event]: - self.logDebug('Function already registered %s' % func) - else: - self.m.events[event].append(func) - else: - self.m.events[event] = [func] - - def setup(self): - self.m = self.manager - self.removeEvent = self.m.removeEvent diff --git a/module/plugins/hooks/DownloadScheduler.py b/module/plugins/hooks/DownloadScheduler.py deleted file mode 100644 index a3d70b3ab..000000000 --- a/module/plugins/hooks/DownloadScheduler.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from time import localtime - -from module.plugins.Hook import Hook - - -class DownloadScheduler(Hook): - __name__ = "DownloadScheduler" - __type__ = "hook" - __version__ = "0.21" - - __config__ = [("activated", "bool", "Activated", False), - ("timetable", "str", "List time periods as hh:mm full or number(kB/s)", - "0:00 full, 7:00 250, 10:00 0, 17:00 150"), - ("abort", "bool", "Abort active downloads when start period with speed 0", False)] - - __description__ = """Download Scheduler""" - __author_name__ = ("zoidberg", "stickell") - __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it") - - - def setup(self): - self.cb = None # callback to scheduler job; will be by removed hookmanager when hook unloaded - - def coreReady(self): - self.updateSchedule() - - def updateSchedule(self, schedule=None): - if schedule is None: - schedule = self.getConfig("timetable") - - schedule = re.findall("(\d{1,2}):(\d{2})[\s]*(-?\d+)", - schedule.lower().replace("full", "-1").replace("none", "0")) - if not schedule: - self.logError("Invalid schedule") - return - - t0 = localtime() - now = (t0.tm_hour, t0.tm_min, t0.tm_sec, "X") - schedule = sorted([(int(x[0]), int(x[1]), 0, int(x[2])) for x in schedule] + [now]) - - self.logDebug("Schedule", schedule) - - for i, v in enumerate(schedule): - if v[3] == "X": - last, next = schedule[i - 1], schedule[(i + 1) % len(schedule)] - self.logDebug("Now/Last/Next", now, last, next) - - self.setDownloadSpeed(last[3]) - - next_time = (((24 + next[0] - now[0]) * 60 + next[1] - now[1]) * 60 + next[2] - now[2]) % 86400 - self.core.scheduler.removeJob(self.cb) - self.cb = self.core.scheduler.addJob(next_time, self.updateSchedule, threaded=False) - - def setDownloadSpeed(self, speed): - if speed == 0: - abort = self.getConfig("abort") - self.logInfo("Stopping download server. (Running downloads will %sbe aborted.)" % ('' if abort else 'not ')) - self.core.api.pauseServer() - if abort: - self.core.api.stopAllDownloads() - else: - self.core.api.unpauseServer() - - if speed > 0: - self.logInfo("Setting download speed to %d kB/s" % speed) - self.core.api.setConfigValue("download", "limit_speed", 1) - self.core.api.setConfigValue("download", "max_speed", speed) - else: - self.logInfo("Setting download speed to FULL") - self.core.api.setConfigValue("download", "limit_speed", 0) - self.core.api.setConfigValue("download", "max_speed", -1) diff --git a/module/plugins/hooks/EasybytezCom.py b/module/plugins/hooks/EasybytezCom.py deleted file mode 100644 index da37297d9..000000000 --- a/module/plugins/hooks/EasybytezCom.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.MultiHoster import MultiHoster - - -class EasybytezCom(MultiHoster): - __name__ = "EasybytezCom" - __type__ = "hook" - __version__ = "0.03" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", "")] - - __description__ = """EasyBytez.com hook plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - - def getHoster(self): - self.account = self.core.accountManager.getAccountPlugin(self.__name__) - user = self.account.selectAccount()[0] - - try: - req = self.account.getAccountRequest(user) - page = req.load("http://www.easybytez.com") - - m = re.search(r'\s*Supported sites:(.*)', page) - return m.group(1).split(',') - except Exception, e: - self.logDebug(e) - self.logWarning("Unable to load supported hoster list, using last known") - return ["bitshare.com", "crocko.com", "ddlstorage.com", "depositfiles.com", "extabit.com", "hotfile.com", - "mediafire.com", "netload.in", "rapidgator.net", "rapidshare.com", "uploading.com", "uload.to", - "uploaded.to"] diff --git a/module/plugins/hooks/Ev0InFetcher.py b/module/plugins/hooks/Ev0InFetcher.py deleted file mode 100644 index c54c38bc6..000000000 --- a/module/plugins/hooks/Ev0InFetcher.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- - -from time import mktime, time - -from module.lib import feedparser - -from module.plugins.Hook import Hook - - -class Ev0InFetcher(Hook): - __name__ = "Ev0InFetcher" - __type__ = "hook" - __version__ = "0.21" - - __config__ = [("activated", "bool", "Activated", False), - ("interval", "int", "Check interval in minutes", 10), - ("queue", "bool", "Move new shows directly to Queue", False), - ("shows", "str", "Shows to check for (comma seperated)", ""), - ("quality", "xvid;x264;rmvb", "Video Format", "xvid"), - ("hoster", "str", "Hoster to use (comma seperated)", - "NetloadIn,RapidshareCom,MegauploadCom,HotfileCom")] - - __description__ = """Checks rss feeds for Ev0.in""" - __author_name__ = "mkaay" - __author_mail__ = "mkaay@mkaay.de" - - - def setup(self): - self.interval = self.getConfig("interval") * 60 - - def filterLinks(self, links): - results = self.core.pluginManager.parseUrls(links) - sortedLinks = {} - - for url, hoster in results: - if hoster not in sortedLinks: - sortedLinks[hoster] = [] - sortedLinks[hoster].append(url) - - for h in self.getConfig("hoster").split(","): - try: - return sortedLinks[h.strip()] - except: - continue - return [] - - - def periodical(self): - - def normalizefiletitle(filename): - filename = filename.replace('.', ' ') - filename = filename.replace('_', ' ') - filename = filename.lower() - return filename - - shows = [s.strip() for s in self.getConfig("shows").split(",")] - - feed = feedparser.parse("http://feeds.feedburner.com/ev0in/%s?format=xml" % self.getConfig("quality")) - - showStorage = {} - for show in shows: - showStorage[show] = int(self.getStorage("show_%s_lastfound" % show, 0)) - - found = False - for item in feed['items']: - for show, lastfound in showStorage.iteritems(): - if show.lower() in normalizefiletitle(item['title']) and lastfound < int(mktime(item.date_parsed)): - links = self.filterLinks(item['description'].split("
    ")) - packagename = item['title'].encode("utf-8") - self.logInfo("Ev0InFetcher: new episode '%s' (matched '%s')" % (packagename, show)) - self.core.api.addPackage(packagename, links, 1 if self.getConfig("queue") else 0) - self.setStorage("show_%s_lastfound" % show, int(mktime(item.date_parsed))) - found = True - if not found: - #self.logDebug("Ev0InFetcher: no new episodes found") - pass - - for show, lastfound in self.getStorage().iteritems(): - if int(lastfound) > 0 and int(lastfound) + (3600 * 24 * 30) < int(time()): - self.delStorage("show_%s_lastfound" % show) - self.logDebug("Ev0InFetcher: cleaned '%s' record" % show) diff --git a/module/plugins/hooks/ExpertDecoders.py b/module/plugins/hooks/ExpertDecoders.py deleted file mode 100644 index c7ab80da0..000000000 --- a/module/plugins/hooks/ExpertDecoders.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -from base64 import b64encode -from pycurl import LOW_SPEED_TIME -from thread import start_new_thread -from uuid import uuid4 - -from module.network.HTTPRequest import BadHeader -from module.network.RequestFactory import getURL, getRequest -from module.plugins.Hook import Hook - - -class ExpertDecoders(Hook): - __name__ = "ExpertDecoders" - __type__ = "hook" - __version__ = "0.01" - - __config__ = [("activated", "bool", "Activated", False), - ("force", "bool", "Force CT even if client is connected", False), - ("passkey", "password", "Access key", "")] - - __description__ = """Send captchas to expertdecoders.com""" - __author_name__ = ("RaNaN", "zoidberg") - __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") - - API_URL = "http://www.fasttypers.org/imagepost.ashx" - - - def setup(self): - self.info = {} - - def getCredits(self): - response = getURL(self.API_URL, post={"key": self.getConfig("passkey"), "action": "balance"}) - - if response.isdigit(): - self.logInfo(_("%s credits left") % response) - self.info['credits'] = credits = int(response) - return credits - else: - self.logError(response) - return 0 - - def processCaptcha(self, task): - task.data['ticket'] = ticket = uuid4() - result = None - - with open(task.captchaFile, 'rb') as f: - data = f.read() - data = b64encode(data) - #self.logDebug("%s: %s : %s" % (ticket, task.captchaFile, data)) - - req = getRequest() - #raise timeout threshold - req.c.setopt(LOW_SPEED_TIME, 80) - - try: - result = req.load(self.API_URL, post={"action": "upload", "key": self.getConfig("passkey"), - "file": data, "gen_task_id": ticket}) - finally: - req.close() - - self.logDebug("result %s : %s" % (ticket, result)) - task.setResult(result) - - def newCaptchaTask(self, task): - if not task.isTextual(): - return False - - if not self.getConfig("passkey"): - return False - - if self.core.isClientConnected() and not self.getConfig("force"): - return False - - if self.getCredits() > 0: - task.handler.append(self) - task.setWaiting(100) - start_new_thread(self.processCaptcha, (task,)) - - else: - self.logInfo(_("Your ExpertDecoders Account has not enough credits")) - - def captchaInvalid(self, task): - if "ticket" in task.data: - - try: - response = getURL(self.API_URL, post={"action": "refund", "key": self.getConfig("passkey"), - "gen_task_id": task.data['ticket']}) - self.logInfo("Request refund: %s" % response) - - except BadHeader, e: - self.logError("Could not send refund request.", str(e)) diff --git a/module/plugins/hooks/ExternalScripts.py b/module/plugins/hooks/ExternalScripts.py deleted file mode 100644 index 90ae3bee0..000000000 --- a/module/plugins/hooks/ExternalScripts.py +++ /dev/null @@ -1,104 +0,0 @@ -# -*- coding: utf-8 -*- - -import subprocess - -from os import listdir, access, X_OK, makedirs -from os.path import join, exists, basename, abspath - -from module.plugins.Hook import Hook -from module.utils import safe_join - - -class ExternalScripts(Hook): - __name__ = "ExternalScripts" - __type__ = "hook" - __version__ = "0.23" - - __config__ = [("activated", "bool", "Activated", True)] - - __description__ = """Run external scripts""" - __author_name__ = ("mkaay", "RaNaN", "spoob") - __author_mail__ = ("mkaay@mkaay.de", "ranan@pyload.org", "spoob@pyload.org") - - event_list = ["unrarFinished", "allDownloadsFinished", "allDownloadsProcessed"] - - - def setup(self): - self.scripts = {} - - folders = ["download_preparing", "download_finished", "package_finished", - "before_reconnect", "after_reconnect", "unrar_finished", - "all_dls_finished", "all_dls_processed"] - - for folder in folders: - self.scripts[folder] = [] - - self.initPluginType(folder, join(pypath, 'scripts', folder)) - self.initPluginType(folder, join('scripts', folder)) - - for script_type, names in self.scripts.iteritems(): - if names: - self.logInfo((_("Installed scripts for %s: ") % script_type) + ", ".join([basename(x) for x in names])) - - def initPluginType(self, folder, path): - if not exists(path): - try: - makedirs(path) - except: - self.logDebug("Script folder %s not created" % folder) - return - - for f in listdir(path): - if f.startswith("#") or f.startswith(".") or f.startswith("_") or f.endswith("~") or f.endswith(".swp"): - continue - - if not access(join(path, f), X_OK): - self.logWarning(_("Script not executable:") + " %s/%s" % (folder, f)) - - self.scripts[folder].append(join(path, f)) - - def callScript(self, script, *args): - try: - cmd = [script] + [str(x) if not isinstance(x, basestring) else x for x in args] - self.logDebug("Executing %(script)s: %(cmd)s" % {"script": abspath(script), "cmd": " ".join(cmd)}) - #output goes to pyload - subprocess.Popen(cmd, bufsize=-1) - except Exception, e: - self.logError(_("Error in %(script)s: %(error)s") % {"script": basename(script), "error": str(e)}) - - def downloadPreparing(self, pyfile): - for script in self.scripts['download_preparing']: - self.callScript(script, pyfile.pluginname, pyfile.url, pyfile.id) - - def downloadFinished(self, pyfile): - for script in self.scripts['download_finished']: - self.callScript(script, pyfile.pluginname, pyfile.url, pyfile.name, - safe_join(self.config['general']['download_folder'], - pyfile.package().folder, pyfile.name), pyfile.id) - - def packageFinished(self, pypack): - for script in self.scripts['package_finished']: - folder = self.config['general']['download_folder'] - folder = safe_join(folder, pypack.folder) - - self.callScript(script, pypack.name, folder, pypack.password, pypack.id) - - def beforeReconnecting(self, ip): - for script in self.scripts['before_reconnect']: - self.callScript(script, ip) - - def afterReconnecting(self, ip): - for script in self.scripts['after_reconnect']: - self.callScript(script, ip) - - def unrarFinished(self, folder, fname): - for script in self.scripts['unrar_finished']: - self.callScript(script, folder, fname) - - def allDownloadsFinished(self): - for script in self.scripts['all_dls_finished']: - self.callScript(script) - - def allDownloadsProcessed(self): - for script in self.scripts['all_dls_processed']: - self.callScript(script) diff --git a/module/plugins/hooks/ExtractArchive.py b/module/plugins/hooks/ExtractArchive.py deleted file mode 100644 index 183f189a6..000000000 --- a/module/plugins/hooks/ExtractArchive.py +++ /dev/null @@ -1,320 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import sys - -from copy import copy -from os import remove, chmod, makedirs -from os.path import exists, basename, isfile, isdir -from traceback import print_exc - -# monkey patch bug in python 2.6 and lower -# http://bugs.python.org/issue6122 , http://bugs.python.org/issue1236 , http://bugs.python.org/issue1731717 -if sys.version_info < (2, 7) and os.name != "nt": - import errno - from subprocess import Popen - - def _eintr_retry_call(func, *args): - while True: - try: - return func(*args) - except OSError, e: - if e.errno == errno.EINTR: - continue - raise - - # unsued timeout option for older python version - def wait(self, timeout=0): - """Wait for child process to terminate. Returns returncode - attribute.""" - if self.returncode is None: - try: - pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) - except OSError, e: - if e.errno != errno.ECHILD: - raise - # This happens if SIGCLD is set to be ignored or waiting - # for child processes has otherwise been disabled for our - # process. This child is dead, we can't get the status. - sts = 0 - self._handle_exitstatus(sts) - return self.returncode - - Popen.wait = wait - -if os.name != "nt": - from grp import getgrnam - from os import chown - from pwd import getpwnam - -from module.plugins.Hook import Hook, threaded, Expose -from module.plugins.internal.AbstractExtractor import ArchiveError, CRCError, WrongPassword -from module.utils import safe_join, fs_encode - - -class ExtractArchive(Hook): - """ - Provides: unrarFinished (folder, filename) - """ - __name__ = "ExtractArchive" - __type__ = "hook" - __version__ = "0.16" - - __config__ = [("activated", "bool", "Activated", True), - ("fullpath", "bool", "Extract full path", True), - ("overwrite", "bool", "Overwrite files", True), - ("passwordfile", "file", "password file", "unrar_passwords.txt"), - ("deletearchive", "bool", "Delete archives when done", False), - ("subfolder", "bool", "Create subfolder for each package", False), - ("destination", "folder", "Extract files to", ""), - ("excludefiles", "str", "Exclude files from unpacking (seperated by ;)", ""), - ("recursive", "bool", "Extract archives in archvies", True), - ("queue", "bool", "Wait for all downloads to be finished", True), - ("renice", "int", "CPU Priority", 0)] - - __description__ = """Extract different kind of archives""" - __author_name__ = ("pyLoad Team", "AndroKev") - __author_mail__ = ("admin@pyload.org", "@pyloadforum") - - event_list = ["allDownloadsProcessed"] - - - def setup(self): - self.plugins = [] - self.passwords = [] - names = [] - - for p in ("UnRar", "UnZip"): - try: - module = self.core.pluginManager.loadModule("internal", p) - klass = getattr(module, p) - if klass.checkDeps(): - names.append(p) - self.plugins.append(klass) - - except OSError, e: - if e.errno == 2: - self.logInfo(_("No %s installed") % p) - else: - self.logWarning(_("Could not activate %s") % p, str(e)) - if self.core.debug: - print_exc() - - except Exception, e: - self.logWarning(_("Could not activate %s") % p, str(e)) - if self.core.debug: - print_exc() - - if names: - self.logInfo(_("Activated") + " " + " ".join(names)) - else: - self.logInfo(_("No Extract plugins activated")) - - # queue with package ids - self.queue = [] - - @Expose - def extractPackage(self, id): - """ Extract package with given id""" - self.manager.startThread(self.extract, [id]) - - def packageFinished(self, pypack): - if self.getConfig("queue"): - self.logInfo(_("Package %s queued for later extracting") % pypack.name) - self.queue.append(pypack.id) - else: - self.manager.startThread(self.extract, [pypack.id]) - - @threaded - def allDownloadsProcessed(self, thread): - local = copy(self.queue) - del self.queue[:] - self.extract(local, thread) - - def extract(self, ids, thread=None): - # reload from txt file - self.reloadPasswords() - - # dl folder - dl = self.config['general']['download_folder'] - - extracted = [] - - #iterate packages -> plugins -> targets - for pid in ids: - p = self.core.files.getPackage(pid) - self.logInfo(_("Check package %s") % p.name) - if not p: - continue - - # determine output folder - out = safe_join(dl, p.folder, "") - # force trailing slash - - if self.getConfig("destination") and self.getConfig("destination").lower() != "none": - - out = safe_join(dl, p.folder, self.getConfig("destination"), "") - #relative to package folder if destination is relative, otherwise absolute path overwrites them - - if self.getConfig("subfolder"): - out = safe_join(out, fs_encode(p.folder)) - - if not exists(out): - makedirs(out) - - files_ids = [(safe_join(dl, p.folder, x['name']), x['id']) for x in p.getChildren().itervalues()] - matched = False - - # check as long there are unseen files - while files_ids: - new_files_ids = [] - - for plugin in self.plugins: - targets = plugin.getTargets(files_ids) - if targets: - self.logDebug("Targets for %s: %s" % (plugin.__name__, targets)) - matched = True - for target, fid in targets: - if target in extracted: - self.logDebug(basename(target), "skipped") - continue - extracted.append(target) # prevent extracting same file twice - - klass = plugin(self, target, out, self.getConfig("fullpath"), self.getConfig("overwrite"), self.getConfig("excludefiles"), - self.getConfig("renice")) - klass.init() - - self.logInfo(basename(target), _("Extract to %s") % out) - new_files = self.startExtracting(klass, fid, p.password.strip().splitlines(), thread) - self.logDebug("Extracted: %s" % new_files) - self.setPermissions(new_files) - - for file in new_files: - if not exists(file): - self.logDebug("new file %s does not exists" % file) - continue - if self.getConfig("recursive") and isfile(file): - new_files_ids.append((file, fid)) # append as new target - - files_ids = new_files_ids # also check extracted files - - if not matched: - self.logInfo(_("No files found to extract")) - - def startExtracting(self, plugin, fid, passwords, thread): - pyfile = self.core.files.getFile(fid) - if not pyfile: - return [] - - pyfile.setCustomStatus(_("extracting")) - thread.addActive(pyfile) # keep this file until everything is done - - try: - progress = lambda x: pyfile.setProgress(x) - success = False - - if not plugin.checkArchive(): - plugin.extract(progress) - success = True - else: - self.logInfo(basename(plugin.file), _("Password protected")) - self.logDebug("Passwords: %s" % str(passwords)) - - pwlist = copy(self.getPasswords()) - #remove already supplied pws from list (only local) - for pw in passwords: - if pw in pwlist: - pwlist.remove(pw) - - for pw in passwords + pwlist: - try: - self.logDebug("Try password: %s" % pw) - if plugin.checkPassword(pw): - plugin.extract(progress, pw) - self.addPassword(pw) - success = True - break - except WrongPassword: - self.logDebug("Password was wrong") - - if not success: - self.logError(basename(plugin.file), _("Wrong password")) - return [] - - if self.core.debug: - self.logDebug("Would delete: %s" % ", ".join(plugin.getDeleteFiles())) - - if self.getConfig("deletearchive"): - files = plugin.getDeleteFiles() - self.logInfo(_("Deleting %s files") % len(files)) - for f in files: - if exists(f): - remove(f) - else: - self.logDebug("%s does not exists" % f) - - self.logInfo(basename(plugin.file), _("Extracting finished")) - self.manager.dispatchEvent("unrarFinished", plugin.out, plugin.file) - - return plugin.getExtractedFiles() - - except ArchiveError, e: - self.logError(basename(plugin.file), _("Archive Error"), str(e)) - except CRCError: - self.logError(basename(plugin.file), _("CRC Mismatch")) - except Exception, e: - if self.core.debug: - print_exc() - self.logError(basename(plugin.file), _("Unknown Error"), str(e)) - - return [] - - @Expose - def getPasswords(self): - """ List of saved passwords """ - return self.passwords - - def reloadPasswords(self): - pwfile = self.getConfig("passwordfile") - if not exists(pwfile): - open(pwfile, "wb").close() - - passwords = [] - f = open(pwfile, "rb") - for pw in f.read().splitlines(): - passwords.append(pw) - f.close() - - self.passwords = passwords - - @Expose - def addPassword(self, pw): - """ Adds a password to saved list""" - pwfile = self.getConfig("passwordfile") - - if pw in self.passwords: - self.passwords.remove(pw) - self.passwords.insert(0, pw) - - f = open(pwfile, "wb") - for pw in self.passwords: - f.write(pw + "\n") - f.close() - - def setPermissions(self, files): - for f in files: - if not exists(f): - continue - try: - if self.config['permission']['change_file']: - if isfile(f): - chmod(f, int(self.config['permission']['file'], 8)) - elif isdir(f): - chmod(f, int(self.config['permission']['folder'], 8)) - - if self.config['permission']['change_dl'] and os.name != "nt": - uid = getpwnam(self.config['permission']['user'])[2] - gid = getgrnam(self.config['permission']['group'])[2] - chown(f, uid, gid) - except Exception, e: - self.logWarning(_("Setting User and Group failed"), e) diff --git a/module/plugins/hooks/FastixRu.py b/module/plugins/hooks/FastixRu.py deleted file mode 100644 index 879dba277..000000000 --- a/module/plugins/hooks/FastixRu.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.common.json_layer import json_loads -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class FastixRu(MultiHoster): - __name__ = "FastixRu" - __type__ = "hook" - __version__ = "0.02" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("unloadFailing", "bool", "Revert to standard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """Fastix.ru hook plugin""" - __author_name__ = "Massimo Rosamilia" - __author_mail__ = "max@spiritix.eu" - - - def getHoster(self): - page = getURL( - "http://fastix.ru/api_v2/?apikey=5182964c3f8f9a7f0b00000a_kelmFB4n1IrnCDYuIFn2y&sub=allowed_sources") - host_list = json_loads(page) - host_list = host_list['allow'] - return host_list diff --git a/module/plugins/hooks/FreeWayMe.py b/module/plugins/hooks/FreeWayMe.py deleted file mode 100644 index 12d58ac8a..000000000 --- a/module/plugins/hooks/FreeWayMe.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class FreeWayMe(MultiHoster): - __name__ = "FreeWayMe" - __type__ = "hook" - __version__ = "0.11" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to stanard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """FreeWay.me hook plugin""" - __author_name__ = "Nicolas Giese" - __author_mail__ = "james@free-way.me" - - - def getHoster(self): - hostis = getURL("https://www.free-way.me/ajax/jd.php", get={"id": 3}).replace("\"", "").strip() - self.logDebug("hosters: %s" % hostis) - return [x.strip() for x in hostis.split(",") if x.strip()] diff --git a/module/plugins/hooks/HotFolder.py b/module/plugins/hooks/HotFolder.py deleted file mode 100644 index 4c81292e3..000000000 --- a/module/plugins/hooks/HotFolder.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- - -import time - -from os import listdir, makedirs -from os.path import exists, isfile, join -from shutil import move - -from module.plugins.Hook import Hook - - -class HotFolder(Hook): - __name__ = "HotFolder" - __type__ = "hook" - __version__ = "0.11" - - __config__ = [("activated", "bool", "Activated", False), - ("folder", "str", "Folder to observe", "container"), - ("watch_file", "bool", "Observe link file", False), - ("keep", "bool", "Keep added containers", True), - ("file", "str", "Link file", "links.txt")] - - __description__ = """Observe folder and file for changes and add container and links""" - __author_name__ = "RaNaN" - __author_mail__ = "RaNaN@pyload.de" - - - def setup(self): - self.interval = 10 - - def periodical(self): - if not exists(join(self.getConfig("folder"), "finished")): - makedirs(join(self.getConfig("folder"), "finished")) - - if self.getConfig("watch_file"): - - if not exists(self.getConfig("file")): - f = open(self.getConfig("file"), "wb") - f.close() - - f = open(self.getConfig("file"), "rb") - content = f.read().strip() - f.close() - f = open(self.getConfig("file"), "wb") - f.close() - if content: - name = "%s_%s.txt" % (self.getConfig("file"), time.strftime("%H-%M-%S_%d%b%Y")) - - f = open(join(self.getConfig("folder"), "finished", name), "wb") - f.write(content) - f.close() - - self.core.api.addPackage(f.name, [f.name], 1) - - for f in listdir(self.getConfig("folder")): - path = join(self.getConfig("folder"), f) - - if not isfile(path) or f.endswith("~") or f.startswith("#") or f.startswith("."): - continue - - newpath = join(self.getConfig("folder"), "finished", f if self.getConfig("keep") else "tmp_" + f) - move(path, newpath) - - self.logInfo(_("Added %s from HotFolder") % f) - self.core.api.addPackage(f, [newpath], 1) diff --git a/module/plugins/hooks/IRCInterface.py b/module/plugins/hooks/IRCInterface.py deleted file mode 100644 index 7ebc0275f..000000000 --- a/module/plugins/hooks/IRCInterface.py +++ /dev/null @@ -1,404 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import socket -import time - -from pycurl import FORM_FILE -from select import select -from threading import Thread -from time import sleep -from traceback import print_exc - -from module.Api import PackageDoesNotExists, FileDoesNotExists -from module.network.RequestFactory import getURL -from module.plugins.Hook import Hook -from module.utils import formatSize - - -class IRCInterface(Thread, Hook): - __name__ = "IRCInterface" - __type__ = "hook" - __version__ = "0.11" - - __config__ = [("activated", "bool", "Activated", False), - ("host", "str", "IRC-Server Address", "Enter your server here!"), - ("port", "int", "IRC-Server Port", 6667), - ("ident", "str", "Clients ident", "pyload-irc"), - ("realname", "str", "Realname", "pyload-irc"), - ("nick", "str", "Nickname the Client will take", "pyLoad-IRC"), - ("owner", "str", "Nickname the Client will accept commands from", "Enter your nick here!"), - ("info_file", "bool", "Inform about every file finished", False), - ("info_pack", "bool", "Inform about every package finished", True), - ("captcha", "bool", "Send captcha requests", True)] - - __description__ = """Connect to irc and let owner perform different tasks""" - __author_name__ = "Jeix" - __author_mail__ = "Jeix@hasnomail.com" - - - def __init__(self, core, manager): - Thread.__init__(self) - Hook.__init__(self, core, manager) - self.setDaemon(True) - # self.sm = core.server_methods - self.api = core.api # todo, only use api - - def coreReady(self): - self.abort = False - self.more = [] - self.new_package = {} - - self.start() - - def packageFinished(self, pypack): - try: - if self.getConfig("info_pack"): - self.response(_("Package finished: %s") % pypack.name) - except: - pass - - def downloadFinished(self, pyfile): - try: - if self.getConfig("info_file"): - self.response( - _("Download finished: %(name)s @ %(plugin)s ") % {"name": pyfile.name, "plugin": pyfile.pluginname}) - except: - pass - - def newCaptchaTask(self, task): - if self.getConfig("captcha") and task.isTextual(): - task.handler.append(self) - task.setWaiting(60) - - page = getURL("http://www.freeimagehosting.net/upload.php", - post={"attached": (FORM_FILE, task.captchaFile)}, multipart=True) - - url = re.search(r"\[img\]([^\[]+)\[/img\]\[/url\]", page).group(1) - self.response(_("New Captcha Request: %s") % url) - self.response(_("Answer with 'c %s text on the captcha'") % task.id) - - def run(self): - # connect to IRC etc. - self.sock = socket.socket() - host = self.getConfig("host") - self.sock.connect((host, self.getConfig("port"))) - nick = self.getConfig("nick") - self.sock.send("NICK %s\r\n" % nick) - self.sock.send("USER %s %s bla :%s\r\n" % (nick, host, nick)) - for t in self.getConfig("owner").split(): - if t.strip().startswith("#"): - self.sock.send("JOIN %s\r\n" % t.strip()) - self.logInfo("pyLoad IRC: Connected to %s!" % host) - self.logInfo("pyLoad IRC: Switching to listening mode!") - try: - self.main_loop() - - except IRCError, ex: - self.sock.send("QUIT :byebye\r\n") - print_exc() - self.sock.close() - - def main_loop(self): - readbuffer = "" - while True: - sleep(1) - fdset = select([self.sock], [], [], 0) - if self.sock not in fdset[0]: - continue - - if self.abort: - raise IRCError("quit") - - readbuffer += self.sock.recv(1024) - temp = readbuffer.split("\n") - readbuffer = temp.pop() - - for line in temp: - line = line.rstrip() - first = line.split() - - if first[0] == "PING": - self.sock.send("PONG %s\r\n" % first[1]) - - if first[0] == "ERROR": - raise IRCError(line) - - msg = line.split(None, 3) - if len(msg) < 4: - continue - - msg = { - "origin": msg[0][1:], - "action": msg[1], - "target": msg[2], - "text": msg[3][1:] - } - - self.handle_events(msg) - - def handle_events(self, msg): - if not msg['origin'].split("!", 1)[0] in self.getConfig("owner").split(): - return - - if msg['target'].split("!", 1)[0] != self.getConfig("nick"): - return - - if msg['action'] != "PRIVMSG": - return - - # HANDLE CTCP ANTI FLOOD/BOT PROTECTION - if msg['text'] == "\x01VERSION\x01": - self.logDebug("Sending CTCP VERSION.") - self.sock.send("NOTICE %s :%s\r\n" % (msg['origin'], "pyLoad! IRC Interface")) - return - elif msg['text'] == "\x01TIME\x01": - self.logDebug("Sending CTCP TIME.") - self.sock.send("NOTICE %s :%d\r\n" % (msg['origin'], time.time())) - return - elif msg['text'] == "\x01LAG\x01": - self.logDebug("Received CTCP LAG.") # don't know how to answer - return - - trigger = "pass" - args = None - - try: - temp = msg['text'].split() - trigger = temp[0] - if len(temp) > 1: - args = temp[1:] - except: - pass - - handler = getattr(self, "event_%s" % trigger, self.event_pass) - try: - res = handler(args) - for line in res: - self.response(line, msg['origin']) - except Exception, e: - self.logError("pyLoad IRC: " + repr(e)) - - def response(self, msg, origin=""): - if origin == "": - for t in self.getConfig("owner").split(): - self.sock.send("PRIVMSG %s :%s\r\n" % (t.strip(), msg)) - else: - self.sock.send("PRIVMSG %s :%s\r\n" % (origin.split("!", 1)[0], msg)) - - #### Events - - def event_pass(self, args): - return [] - - def event_status(self, args): - downloads = self.api.statusDownloads() - if not downloads: - return ["INFO: There are no active downloads currently."] - - temp_progress = "" - lines = ["ID - Name - Status - Speed - ETA - Progress"] - for data in downloads: - - if data.status == 5: - temp_progress = data.format_wait - else: - temp_progress = "%d%% (%s)" % (data.percent, data.format_size) - - lines.append("#%d - %s - %s - %s - %s - %s" % - ( - data.fid, - data.name, - data.statusmsg, - "%s/s" % formatSize(data.speed), - "%s" % data.format_eta, - temp_progress - )) - return lines - - def event_queue(self, args): - ps = self.api.getQueueData() - - if not ps: - return ["INFO: There are no packages in queue."] - - lines = [] - for pack in ps: - lines.append('PACKAGE #%s: "%s" with %d links.' % (pack.pid, pack.name, len(pack.links))) - - return lines - - def event_collector(self, args): - ps = self.api.getCollectorData() - if not ps: - return ["INFO: No packages in collector!"] - - lines = [] - for pack in ps: - lines.append('PACKAGE #%s: "%s" with %d links.' % (pack.pid, pack.name, len(pack.links))) - - return lines - - def event_info(self, args): - if not args: - return ["ERROR: Use info like this: info "] - - info = None - try: - info = self.api.getFileData(int(args[0])) - - except FileDoesNotExists: - return ["ERROR: Link doesn't exists."] - - return ['LINK #%s: %s (%s) [%s][%s]' % (info.fid, info.name, info.format_size, info.statusmsg, info.plugin)] - - def event_packinfo(self, args): - if not args: - return ["ERROR: Use packinfo like this: packinfo "] - - lines = [] - pack = None - try: - pack = self.api.getPackageData(int(args[0])) - - except PackageDoesNotExists: - return ["ERROR: Package doesn't exists."] - - id = args[0] - - self.more = [] - - lines.append('PACKAGE #%s: "%s" with %d links' % (id, pack.name, len(pack.links))) - for pyfile in pack.links: - self.more.append('LINK #%s: %s (%s) [%s][%s]' % (pyfile.fid, pyfile.name, pyfile.format_size, - pyfile.statusmsg, pyfile.plugin)) - - if len(self.more) < 6: - lines.extend(self.more) - self.more = [] - else: - lines.extend(self.more[:6]) - self.more = self.more[6:] - lines.append("%d more links do display." % len(self.more)) - - return lines - - def event_more(self, args): - if not self.more: - return ["No more information to display."] - - lines = self.more[:6] - self.more = self.more[6:] - lines.append("%d more links do display." % len(self.more)) - - return lines - - def event_start(self, args): - self.api.unpauseServer() - return ["INFO: Starting downloads."] - - def event_stop(self, args): - self.api.pauseServer() - return ["INFO: No new downloads will be started."] - - def event_add(self, args): - if len(args) < 2: - return ['ERROR: Add links like this: "add links". ', - "This will add the link to to the package / the package with id !"] - - pack = args[0].strip() - links = [x.strip() for x in args[1:]] - - count_added = 0 - count_failed = 0 - try: - id = int(pack) - pack = self.api.getPackageData(id) - if not pack: - return ["ERROR: Package doesn't exists."] - - #TODO add links - - return ["INFO: Added %d links to Package %s [#%d]" % (len(links), pack['name'], id)] - - except: - # create new package - id = self.api.addPackage(pack, links, 1) - return ["INFO: Created new Package %s [#%d] with %d links." % (pack, id, len(links))] - - def event_del(self, args): - if len(args) < 2: - return ["ERROR: Use del command like this: del -p|-l [...] (-p indicates that the ids are from packages, -l indicates that the ids are from links)"] - - if args[0] == "-p": - ret = self.api.deletePackages(map(int, args[1:])) - return ["INFO: Deleted %d packages!" % len(args[1:])] - - elif args[0] == "-l": - ret = self.api.delLinks(map(int, args[1:])) - return ["INFO: Deleted %d links!" % len(args[1:])] - - else: - return ["ERROR: Use del command like this: del <-p|-l> [...] (-p indicates that the ids are from packages, -l indicates that the ids are from links)"] - - def event_push(self, args): - if not args: - return ["ERROR: Push package to queue like this: push "] - - id = int(args[0]) - try: - info = self.api.getPackageInfo(id) - except PackageDoesNotExists: - return ["ERROR: Package #%d does not exist." % id] - - self.api.pushToQueue(id) - return ["INFO: Pushed package #%d to queue." % id] - - def event_pull(self, args): - if not args: - return ["ERROR: Pull package from queue like this: pull ."] - - id = int(args[0]) - if not self.api.getPackageData(id): - return ["ERROR: Package #%d does not exist." % id] - - self.api.pullFromQueue(id) - return ["INFO: Pulled package #%d from queue to collector." % id] - - def event_c(self, args): - """ captcha answer """ - if not args: - return ["ERROR: Captcha ID missing."] - - task = self.core.captchaManager.getTaskByID(args[0]) - if not task: - return ["ERROR: Captcha Task with ID %s does not exists." % args[0]] - - task.setResult(" ".join(args[1:])) - return ["INFO: Result %s saved." % " ".join(args[1:])] - - def event_help(self, args): - lines = ["The following commands are available:", - "add [...] Adds link to package. (creates new package if it does not exist)", - "queue Shows all packages in the queue", - "collector Shows all packages in collector", - "del -p|-l [...] Deletes all packages|links with the ids specified", - "info Shows info of the link with id ", - "packinfo Shows info of the package with id ", - "more Shows more info when the result was truncated", - "start Starts all downloads", - "stop Stops the download (but not abort active downloads)", - "push Push package to queue", - "pull Pull package from queue", - "status Show general download status", - "help Shows this help message"] - return lines - - -class IRCError(Exception): - - def __init__(self, value): - self.value = value - - def __str__(self): - return repr(self.value) diff --git a/module/plugins/hooks/ImageTyperz.py b/module/plugins/hooks/ImageTyperz.py deleted file mode 100644 index d9d4e547e..000000000 --- a/module/plugins/hooks/ImageTyperz.py +++ /dev/null @@ -1,143 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -import re - -from base64 import b64encode -from pycurl import FORM_FILE, LOW_SPEED_TIME -from thread import start_new_thread - -from module.network.RequestFactory import getURL, getRequest -from module.plugins.Hook import Hook - - -class ImageTyperzException(Exception): - - def __init__(self, err): - self.err = err - - def getCode(self): - return self.err - - def __str__(self): - return "" % self.err - - def __repr__(self): - return "" % self.err - - -class ImageTyperz(Hook): - __name__ = "ImageTyperz" - __type__ = "hook" - __version__ = "0.04" - - __config__ = [("activated", "bool", "Activated", False), - ("username", "str", "Username", ""), - ("passkey", "password", "Password", ""), - ("force", "bool", "Force IT even if client is connected", False)] - - __description__ = """Send captchas to ImageTyperz.com""" - __author_name__ = ("RaNaN", "zoidberg") - __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") - - SUBMIT_URL = "http://captchatypers.com/Forms/UploadFileAndGetTextNEW.ashx" - RESPOND_URL = "http://captchatypers.com/Forms/SetBadImage.ashx" - GETCREDITS_URL = "http://captchatypers.com/Forms/RequestBalance.ashx" - - - def setup(self): - self.info = {} - - def getCredits(self): - response = getURL(self.GETCREDITS_URL, post={"action": "REQUESTBALANCE", "username": self.getConfig("username"), - "password": self.getConfig("passkey")}) - - if response.startswith('ERROR'): - raise ImageTyperzException(response) - - try: - balance = float(response) - except: - raise ImageTyperzException("invalid response") - - self.logInfo("Account balance: $%s left" % response) - return balance - - def submit(self, captcha, captchaType="file", match=None): - req = getRequest() - #raise timeout threshold - req.c.setopt(LOW_SPEED_TIME, 80) - - try: - #workaround multipart-post bug in HTTPRequest.py - if re.match("^[A-Za-z0-9]*$", self.getConfig("passkey")): - multipart = True - data = (FORM_FILE, captcha) - else: - multipart = False - with open(captcha, 'rb') as f: - data = f.read() - data = b64encode(data) - - response = req.load(self.SUBMIT_URL, post={"action": "UPLOADCAPTCHA", - "username": self.getConfig("username"), - "password": self.getConfig("passkey"), "file": data}, - multipart=multipart) - finally: - req.close() - - if response.startswith("ERROR"): - raise ImageTyperzException(response) - else: - data = response.split('|') - if len(data) == 2: - ticket, result = data - else: - raise ImageTyperzException("Unknown response %s" % response) - - return ticket, result - - def newCaptchaTask(self, task): - if "service" in task.data: - return False - - if not task.isTextual(): - return False - - if not self.getConfig("username") or not self.getConfig("passkey"): - return False - - if self.core.isClientConnected() and not self.getConfig("force"): - return False - - if self.getCredits() > 0: - task.handler.append(self) - task.data['service'] = self.__name__ - task.setWaiting(100) - start_new_thread(self.processCaptcha, (task,)) - - else: - self.logInfo("Your %s account has not enough credits" % self.__name__) - - def captchaInvalid(self, task): - if task.data['service'] == self.__name__ and "ticket" in task.data: - response = getURL(self.RESPOND_URL, post={"action": "SETBADIMAGE", "username": self.getConfig("username"), - "password": self.getConfig("passkey"), - "imageid": task.data['ticket']}) - - if response == "SUCCESS": - self.logInfo("Bad captcha solution received, requested refund") - else: - self.logError("Bad captcha solution received, refund request failed", response) - - def processCaptcha(self, task): - c = task.captchaFile - try: - ticket, result = self.submit(c) - except ImageTyperzException, e: - task.error = e.getCode() - return - - task.data['ticket'] = ticket - task.setResult(result) diff --git a/module/plugins/hooks/LinkdecrypterCom.py b/module/plugins/hooks/LinkdecrypterCom.py deleted file mode 100644 index 1aa8f7ca1..000000000 --- a/module/plugins/hooks/LinkdecrypterCom.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.network.RequestFactory import getURL -from module.plugins.Hook import Hook -from module.utils import remove_chars - - -class LinkdecrypterCom(Hook): - __name__ = "LinkdecrypterCom" - __type__ = "hook" - __version__ = "0.19" - - __config__ = [("activated", "bool", "Activated", False)] - - __description__ = """Linkdecrypter.com hook plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - - def coreReady(self): - try: - self.loadPatterns() - except Exception, e: - self.logError(e) - - def loadPatterns(self): - page = getURL("http://linkdecrypter.com/") - m = re.search(r'Supported\(\d+\): ([^+<]*)', page) - if m is None: - self.logError(_("Crypter list not found")) - return - - builtin = [name.lower() for name in self.core.pluginManager.crypterPlugins.keys()] - builtin.append("downloadserienjunkiesorg") - - crypter_pattern = re.compile("(\w[\w.-]+)") - online = [] - for crypter in m.group(1).split(', '): - m = re.match(crypter_pattern, crypter) - if m and remove_chars(m.group(1), "-.") not in builtin: - online.append(m.group(1).replace(".", "\\.")) - - if not online: - self.logError(_("Crypter list is empty")) - return - - regexp = r"https?://([^.]+\.)*?(%s)/.*" % "|".join(online) - - dict = self.core.pluginManager.crypterPlugins[self.__name__] - dict['pattern'] = regexp - dict['re'] = re.compile(regexp) - - self.logDebug("REGEXP: " + regexp) diff --git a/module/plugins/hooks/LinksnappyCom.py b/module/plugins/hooks/LinksnappyCom.py deleted file mode 100644 index 20da68632..000000000 --- a/module/plugins/hooks/LinksnappyCom.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.common.json_layer import json_loads -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class LinksnappyCom(MultiHoster): - __name__ = "LinksnappyCom" - __type__ = "hook" - __version__ = "0.01" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to standard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """Linksnappy.com hook plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - - def getHoster(self): - json_data = getURL('http://gen.linksnappy.com/lseAPI.php?act=FILEHOSTS') - json_data = json_loads(json_data) - - return json_data['return'].keys() diff --git a/module/plugins/hooks/MegaDebridEu.py b/module/plugins/hooks/MegaDebridEu.py deleted file mode 100644 index 605b04f21..000000000 --- a/module/plugins/hooks/MegaDebridEu.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.common.json_layer import json_loads -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class MegaDebridEu(MultiHoster): - __name__ = "MegaDebridEu" - __type__ = "hook" - __version__ = "0.02" - - __config__ = [("activated", "bool", "Activated", False), - ("unloadFailing", "bool", "Revert to standard download if download fails", False)] - - __description__ = """mega-debrid.eu hook plugin""" - __author_name__ = "D.Ducatel" - __author_mail__ = "dducatel@je-geek.fr" - - - def getHoster(self): - reponse = getURL('http://www.mega-debrid.eu/api.php?action=getHosters') - json_data = json_loads(reponse) - - if json_data['response_code'] == "ok": - host_list = [element[0] for element in json_data['hosters']] - else: - self.logError("Unable to retrieve hoster list") - host_list = list() - - return host_list diff --git a/module/plugins/hooks/MergeFiles.py b/module/plugins/hooks/MergeFiles.py deleted file mode 100644 index ad1de7e6a..000000000 --- a/module/plugins/hooks/MergeFiles.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import re -import traceback - -from module.plugins.Hook import Hook, threaded -from module.utils import safe_join, fs_encode - - -class MergeFiles(Hook): - __name__ = "MergeFiles" - __type__ = "hook" - __version__ = "0.12" - - __config__ = [("activated", "bool", "Activated", False)] - - __description__ = """Merges parts splitted with hjsplit""" - __author_name__ = "and9000" - __author_mail__ = "me@has-no-mail.com" - - BUFFER_SIZE = 4096 - - - def setup(self): - # nothing to do - pass - - @threaded - def packageFinished(self, pack): - files = {} - fid_dict = {} - for fid, data in pack.getChildren().iteritems(): - if re.search("\.[0-9]{3}$", data['name']): - if data['name'][:-4] not in files: - files[data['name'][:-4]] = [] - files[data['name'][:-4]].append(data['name']) - files[data['name'][:-4]].sort() - fid_dict[data['name']] = fid - - download_folder = self.config['general']['download_folder'] - - if self.config['general']['folder_per_package']: - download_folder = safe_join(download_folder, pack.folder) - - for name, file_list in files.iteritems(): - self.logInfo("Starting merging of %s" % name) - final_file = open(safe_join(download_folder, name), "wb") - - for splitted_file in file_list: - self.logDebug("Merging part %s" % splitted_file) - pyfile = self.core.files.getFile(fid_dict[splitted_file]) - pyfile.setStatus("processing") - try: - s_file = open(os.path.join(download_folder, splitted_file), "rb") - size_written = 0 - s_file_size = int(os.path.getsize(os.path.join(download_folder, splitted_file))) - while True: - f_buffer = s_file.read(self.BUFFER_SIZE) - if f_buffer: - final_file.write(f_buffer) - size_written += self.BUFFER_SIZE - pyfile.setProgress((size_written * 100) / s_file_size) - else: - break - s_file.close() - self.logDebug("Finished merging part %s" % splitted_file) - except Exception, e: - print traceback.print_exc() - finally: - pyfile.setProgress(100) - pyfile.setStatus("finished") - pyfile.release() - - final_file.close() - self.logInfo("Finished merging of %s" % name) diff --git a/module/plugins/hooks/MultiDebridCom.py b/module/plugins/hooks/MultiDebridCom.py deleted file mode 100644 index c5d1464f8..000000000 --- a/module/plugins/hooks/MultiDebridCom.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.common.json_layer import json_loads -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class MultiDebridCom(MultiHoster): - __name__ = "MultiDebridCom" - __type__ = "hook" - __version__ = "0.01" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to standard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """Multi-debrid.com hook plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - - def getHoster(self): - json_data = getURL('http://multi-debrid.com/api.php?hosts', decode=True) - self.logDebug('JSON data: ' + json_data) - json_data = json_loads(json_data) - - return json_data['hosts'] diff --git a/module/plugins/hooks/MultiHome.py b/module/plugins/hooks/MultiHome.py deleted file mode 100644 index e2167b65e..000000000 --- a/module/plugins/hooks/MultiHome.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- - -from time import time - -from module.plugins.Hook import Hook - - -class MultiHome(Hook): - __name__ = "MultiHome" - __type__ = "hook" - __version__ = "0.11" - - __config__ = [("activated", "bool", "Activated", False), - ("interfaces", "str", "Interfaces", "None")] - - __description__ = """Ip address changer""" - __author_name__ = "mkaay" - __author_mail__ = "mkaay@mkaay.de" - - - def setup(self): - self.register = {} - self.interfaces = [] - self.parseInterfaces(self.getConfig("interfaces").split(";")) - if not self.interfaces: - self.parseInterfaces([self.config['download']['interface']]) - self.setConfig("interfaces", self.toConfig()) - - def toConfig(self): - return ";".join([i.adress for i in self.interfaces]) - - def parseInterfaces(self, interfaces): - for interface in interfaces: - if not interface or str(interface).lower() == "none": - continue - self.interfaces.append(Interface(interface)) - - def coreReady(self): - requestFactory = self.core.requestFactory - oldGetRequest = requestFactory.getRequest - - def getRequest(pluginName, account=None): - iface = self.bestInterface(pluginName, account) - if iface: - iface.useFor(pluginName, account) - requestFactory.iface = lambda: iface.adress - self.logDebug("Multihome: using address: " + iface.adress) - return oldGetRequest(pluginName, account) - - requestFactory.getRequest = getRequest - - def bestInterface(self, pluginName, account): - best = None - for interface in self.interfaces: - if not best or interface.lastPluginAccess(pluginName, account) < best.lastPluginAccess(pluginName, account): - best = interface - return best - - -class Interface(object): - - def __init__(self, adress): - self.adress = adress - self.history = {} - - def lastPluginAccess(self, pluginName, account): - if (pluginName, account) in self.history: - return self.history[(pluginName, account)] - return 0 - - def useFor(self, pluginName, account): - self.history[(pluginName, account)] = time() - - def __repr__(self): - return "" % self.adress diff --git a/module/plugins/hooks/MultishareCz.py b/module/plugins/hooks/MultishareCz.py deleted file mode 100644 index 9249106d6..000000000 --- a/module/plugins/hooks/MultishareCz.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class MultishareCz(MultiHoster): - __name__ = "MultishareCz" - __type__ = "hook" - __version__ = "0.04" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", "uloz.to")] - - __description__ = """MultiShare.cz hook plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - HOSTER_PATTERN = r']*?alt="([^"]+)">\s*
    \s*' - OFFLINE_PATTERN = r'

    Soubor nebyl nalezen

    ' - - FILE_URL_REPLACEMENTS = [(__pattern__, r'http://www.dataport.cz/file/\1')] - - CAPTCHA_URL_PATTERN = r'
    \s*(\d+)
    ' - - - def handleFree(self): - captchas = {"1": "jkeG", "2": "hMJQ", "3": "vmEK", "4": "ePQM", "5": "blBd"} - - for _ in xrange(60): - action, inputs = self.parseHtmlForm('free_download_form') - self.logDebug(action, inputs) - if not action or not inputs: - self.parseError('free_download_form') - - if "captchaId" in inputs and inputs['captchaId'] in captchas: - inputs['captchaCode'] = captchas[inputs['captchaId']] - else: - self.parseError('captcha') - - self.html = self.download("http://www.dataport.cz%s" % action, post=inputs) - - check = self.checkDownload({"captcha": 'alert("\u0160patn\u011b opsan\u00fd k\u00f3d z obr\u00e1zu");', - "slot": 'alert("Je n\u00e1m l\u00edto, ale moment\u00e1ln\u011b nejsou'}) - if check == "captcha": - self.parseError('invalid captcha') - elif check == "slot": - self.logDebug("No free slots - wait 60s and retry") - self.wait(60, False) - self.html = self.load(self.pyfile.url, decode=True) - continue - else: - break - - -create_getInfo(DataportCz) diff --git a/module/plugins/hoster/DateiTo.py b/module/plugins/hoster/DateiTo.py deleted file mode 100644 index ff8c430ee..000000000 --- a/module/plugins/hoster/DateiTo.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.CaptchaService import ReCaptcha -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class DateiTo(SimpleHoster): - __name__ = "DateiTo" - __type__ = "hoster" - __version__ = "0.02" - - __pattern__ = r'http://(?:www\.)?datei\.to/datei/(?P\w+)\.html' - - __description__ = """Datei.to hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FILE_NAME_PATTERN = r'Dateiname:\s*
    ' - FILE_SIZE_PATTERN = r'' - USER_CAPTCHA_PATTERN = r'' - - - def handleFree(self): - params = {} - for _ in xrange(3): - m = re.search(self.LINK_PATTERN, self.html) - if m: - if 'captcha_hash' in params: - self.correctCaptcha() - download_url = m.group(1) - break - - m = re.search(self.CAPTCHA_PATTERN, self.html) - if m: - if 'captcha_hash' in params: - self.invalidCaptcha() - captcha_url1 = "http://www.sendspace.com/" + m.group(1) - m = re.search(self.USER_CAPTCHA_PATTERN, self.html) - captcha_url2 = "http://www.sendspace.com/" + m.group(1) - params = {'captcha_hash': m.group(2), - 'captcha_submit': 'Verify', - 'captcha_answer': self.decryptCaptcha(captcha_url1) + " " + self.decryptCaptcha(captcha_url2)} - else: - params = {'download': "Regular Download"} - - self.logDebug(params) - self.html = self.load(self.pyfile.url, post=params) - else: - self.fail("Download link not found") - - self.logDebug("Download URL: %s" % download_url) - self.download(download_url) - - -create_getInfo(SendspaceCom) diff --git a/module/plugins/hoster/Share4webCom.py b/module/plugins/hoster/Share4webCom.py deleted file mode 100644 index e5221baa9..000000000 --- a/module/plugins/hoster/Share4webCom.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.hoster.UnibytesCom import UnibytesCom -from module.plugins.internal.SimpleHoster import create_getInfo - - -class Share4webCom(UnibytesCom): - __name__ = "Share4webCom" - __type__ = "hoster" - __version__ = "0.1" - - __pattern__ = r'http://(?:www\.)?share4web\.com/get/\w+' - - __description__ = """Share4web.com hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - HOSTER_NAME = "share4web.com" - - -getInfo = create_getInfo(UnibytesCom) diff --git a/module/plugins/hoster/Share76Com.py b/module/plugins/hoster/Share76Com.py deleted file mode 100644 index 2c5dd877d..000000000 --- a/module/plugins/hoster/Share76Com.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class Share76Com(DeadHoster): - __name__ = "Share76Com" - __type__ = "hoster" - __version__ = "0.04" - - __pattern__ = r'http://(?:www\.)?share76.com/\w{12}' - - __description__ = """Share76.com hoster plugin""" - __author_name__ = "me" - __author_mail__ = None - - -getInfo = create_getInfo(Share76Com) diff --git a/module/plugins/hoster/ShareFilesCo.py b/module/plugins/hoster/ShareFilesCo.py deleted file mode 100644 index 54ae7777a..000000000 --- a/module/plugins/hoster/ShareFilesCo.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class ShareFilesCo(DeadHoster): - __name__ = "ShareFilesCo" - __type__ = "hoster" - __version__ = "0.02" - - __pattern__ = r'http://(?:www\.)?sharefiles\.co/\w{12}' - - __description__ = """Sharefiles.co hoster plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - -getInfo = create_getInfo(ShareFilesCo) diff --git a/module/plugins/hoster/ShareRapidCom.py b/module/plugins/hoster/ShareRapidCom.py deleted file mode 100644 index 414e92feb..000000000 --- a/module/plugins/hoster/ShareRapidCom.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from pycurl import HTTPHEADER - -from module.network.RequestFactory import getRequest -from module.plugins.internal.SimpleHoster import SimpleHoster, parseFileInfo - - -def getInfo(urls): - h = getRequest() - h.c.setopt(HTTPHEADER, - ["Accept: text/html", - "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0"]) - for url in urls: - html = h.load(url, decode=True) - file_info = parseFileInfo(ShareRapidCom, url, html) - yield file_info - - -class ShareRapidCom(SimpleHoster): - __name__ = "ShareRapidCom" - __type__ = "hoster" - __version__ = "0.54" - - __pattern__ = r'http://(?:www\.)?(share|mega)rapid\.cz/soubor/\d+/.+' - - __description__ = """MegaRapid.cz hoster plugin""" - __author_name__ = ("MikyWoW", "zoidberg", "stickell", "Walter Purcaro") - __author_mail__ = ("mikywow@seznam.cz", "zoidberg@mujmail.cz", "l.stickell@yahoo.it", "vuolter@gmail.com") - - FILE_NAME_PATTERN = r']*>]*>(?:]*>)?(?P[^<]+)' - FILE_SIZE_PATTERN = r'\s*' - OFFLINE_PATTERN = ur'Nastala chyba 404|Soubor byl smazán' - - SH_CHECK_TRAFFIC = True - - LINK_PATTERN = r'([^<]+)' - ERR_LOGIN_PATTERN = ur'
    Stahování je přístupné pouze přihlášeným uživatelům' - ERR_CREDIT_PATTERN = ur'
    Stahování zdarma je možné jen přes náš' - - - def setup(self): - self.chunkLimit = 1 - - def handlePremium(self): - try: - self.html = self.load(self.pyfile.url, decode=True) - except BadHeader, e: - self.account.relogin(self.user) - self.retry(max_tries=3, reason=str(e)) - - m = re.search(self.LINK_PATTERN, self.html) - if m: - link = m.group(1) - self.logDebug("Premium link: %s" % link) - self.download(link, disposition=True) - else: - if re.search(self.ERR_LOGIN_PATTERN, self.html): - self.relogin(self.user) - self.retry(max_tries=3, reason="User login failed") - elif re.search(self.ERR_CREDIT_PATTERN, self.html): - self.fail("Not enough credit left") - else: - self.fail("Download link not found") diff --git a/module/plugins/hoster/SharebeesCom.py b/module/plugins/hoster/SharebeesCom.py deleted file mode 100644 index d5b4a3bbc..000000000 --- a/module/plugins/hoster/SharebeesCom.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class SharebeesCom(DeadHoster): - __name__ = "SharebeesCom" - __type__ = "hoster" - __version__ = "0.02" - - __pattern__ = r'http://(?:www\.)?sharebees.com/\w{12}' - - __description__ = """ShareBees hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - -getInfo = create_getInfo(SharebeesCom) diff --git a/module/plugins/hoster/ShareonlineBiz.py b/module/plugins/hoster/ShareonlineBiz.py deleted file mode 100644 index feaa95603..000000000 --- a/module/plugins/hoster/ShareonlineBiz.py +++ /dev/null @@ -1,199 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from time import time - -from module.network.RequestFactory import getURL -from module.plugins.Hoster import Hoster -from module.plugins.Plugin import chunks -from module.plugins.internal.CaptchaService import ReCaptcha - - -def getInfo(urls): - api_url_base = "http://api.share-online.biz/linkcheck.php" - - urls = [url.replace("https://", "http://") for url in urls] - - for chunk in chunks(urls, 90): - api_param_file = {"links": "\n".join(x.replace("http://www.share-online.biz/dl/", "").rstrip("/") for x in - chunk)} # api only supports old style links - src = getURL(api_url_base, post=api_param_file, decode=True) - result = [] - for i, res in enumerate(src.split("\n")): - if not res: - continue - fields = res.split(";") - - if fields[1] == "OK": - status = 2 - elif fields[1] in ("DELETED", "NOT FOUND"): - status = 1 - else: - status = 3 - - result.append((fields[2], int(fields[3]), status, chunk[i])) - yield result - - -class ShareonlineBiz(Hoster): - __name__ = "ShareonlineBiz" - __type__ = "hoster" - __version__ = "0.40" - - __pattern__ = r'https?://(?:www\.)?(share-online\.biz|egoshare\.com)/(download.php\?id=|dl/)(?P\w+)' - - __description__ = """Shareonline.biz hoster plugin""" - __author_name__ = ("spoob", "mkaay", "zoidberg", "Walter Purcaro") - __author_mail__ = ("spoob@pyload.org", "mkaay@mkaay.de", "zoidberg@mujmail.cz", "vuolter@gmail.com") - - ERROR_INFO_PATTERN = r'

    Information:

    \s*
    \s*(.*?)' - - - def setup(self): - # range request not working? - # api supports resume, only one chunk - # website isn't supporting resuming in first place - self.file_id = re.match(self.__pattern__, self.pyfile.url).group("ID") - self.pyfile.url = "http://www.share-online.biz/dl/" + self.file_id - - self.resumeDownload = self.premium - self.multiDL = False - #self.chunkLimit = 1 - - self.check_data = None - - def process(self, pyfile): - if self.premium: - self.handlePremium() - #web-download fallback removed - didn't work anyway - else: - self.handleFree() - - # check = self.checkDownload({"failure": re.compile(self.ERROR_INFO_PATTERN)}) - # if check == "failure": - # try: - # self.retry(reason=self.lastCheck.group(1).decode("utf8")) - # except: - # self.retry(reason="Unknown error") - - if self.api_data: - self.check_data = {"size": int(self.api_data['size']), "md5": self.api_data['md5']} - - def loadAPIData(self): - api_url_base = "http://api.share-online.biz/linkcheck.php?md5=1" - api_param_file = {"links": self.file_id} # api only supports old style links - src = self.load(api_url_base, cookies=False, post=api_param_file, decode=True) - - fields = src.split(";") - self.api_data = {"fileid": fields[0], - "status": fields[1]} - if not self.api_data['status'] == "OK": - self.offline() - else: - self.api_data['filename'] = fields[2] - self.api_data['size'] = fields[3] # in bytes - self.api_data['md5'] = fields[4].strip().lower().replace("\n\n", "") # md5 - - def handleFree(self): - self.loadAPIData() - self.pyfile.name = self.api_data['filename'] - self.pyfile.size = int(self.api_data['size']) - - self.html = self.load(self.pyfile.url, cookies=True) # refer, stuff - self.setWait(3) - self.wait() - - self.html = self.load("%s/free/" % self.pyfile.url, post={"dl_free": "1", "choice": "free"}, decode=True) - self.checkErrors() - - m = re.search(r'var wait=(\d+);', self.html) - - recaptcha = ReCaptcha(self) - for _ in xrange(5): - challenge, response = recaptcha.challenge("6LdatrsSAAAAAHZrB70txiV5p-8Iv8BtVxlTtjKX") - self.setWait(int(m.group(1)) if m else 30) - response = self.load("%s/free/captcha/%d" % (self.pyfile.url, int(time() * 1000)), post={ - 'dl_free': '1', - 'recaptcha_challenge_field': challenge, - 'recaptcha_response_field': response}) - - if not response == '0': - self.correctCaptcha() - break - else: - self.invalidCaptcha() - else: - self.invalidCaptcha() - self.fail("No valid captcha solution received") - - download_url = response.decode("base64") - self.logDebug(download_url) - if not download_url.startswith("http://"): - self.parseError("download url") - - self.wait() - self.download(download_url) - # check download - check = self.checkDownload({ - "cookie": re.compile(r'
    Share-Online") - }) - if check == "cookie": - self.invalidCaptcha() - self.retry(5, 60, "Cookie failure") - elif check == "fail": - self.invalidCaptcha() - self.retry(5, 5 * 60, "Download failed") - else: - self.correctCaptcha() - - def handlePremium(self): #: should be working better loading (account) api internally - self.account.getAccountInfo(self.user, True) - src = self.load("http://api.share-online.biz/account.php", - {"username": self.user, "password": self.account.accounts[self.user]['password'], - "act": "download", "lid": self.file_id}) - - self.api_data = dlinfo = {} - for line in src.splitlines(): - key, value = line.split(": ") - dlinfo[key.lower()] = value - - self.logDebug(dlinfo) - if not dlinfo['status'] == "online": - self.offline() - else: - self.pyfile.name = dlinfo['name'] - self.pyfile.size = int(dlinfo['size']) - - dlLink = dlinfo['url'] - if dlLink == "server_under_maintenance": - self.tempOffline() - else: - self.multiDL = True - self.download(dlLink) - - def checkErrors(self): - m = re.search(r"/failure/(.*?)/1", self.req.lastEffectiveURL) - if m is None: - return - - err = m.group(1) - m = re.search(self.ERROR_INFO_PATTERN, self.html) - msg = m.group(1) if m else "" - self.logError(err, msg or "Unknown error occurred") - - if err == "invalid": - self.fail(msg or "File not available") - elif err in ("freelimit", "size", "proxy"): - self.fail(msg or "Premium account needed") - else: - if err in 'server': - self.setWait(600, False) - elif err in 'expired': - self.setWait(30, False) - else: - self.setWait(300, True) - - self.wait() - self.retry(max_tries=25, reason=msg) diff --git a/module/plugins/hoster/ShareplaceCom.py b/module/plugins/hoster/ShareplaceCom.py deleted file mode 100644 index 0d236fe30..000000000 --- a/module/plugins/hoster/ShareplaceCom.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from urllib import unquote - -from module.plugins.Hoster import Hoster - - -class ShareplaceCom(Hoster): - __name__ = "ShareplaceCom" - __type__ = "hoster" - __version__ = "0.11" - - __pattern__ = r'(http://)?(?:www\.)?shareplace\.(com|org)/\?[a-zA-Z0-9]+' - - __description__ = """Shareplace.com hoster plugin""" - __author_name__ = "ACCakut" - __author_mail__ = None - - - def process(self, pyfile): - self.pyfile = pyfile - self.prepare() - self.download(self.get_file_url()) - - def prepare(self): - if not self.file_exists(): - self.offline() - - self.pyfile.name = self.get_file_name() - - wait_time = self.get_waiting_time() - self.setWait(wait_time) - self.logDebug("%s: Waiting %d seconds." % (self.__name__, wait_time)) - self.wait() - - def get_waiting_time(self): - if not self.html: - self.download_html() - - #var zzipitime = 15; - m = re.search(r'var zzipitime = (\d+);', self.html) - if m: - sec = int(m.group(1)) - else: - sec = 0 - - return sec - - def download_html(self): - url = re.sub("shareplace.com\/\?", "shareplace.com//index1.php/?a=", self.pyfile.url) - self.html = self.load(url, decode=True) - - def get_file_url(self): - """ returns the absolute downloadable filepath - """ - url = re.search(r"var beer = '(.*?)';", self.html) - if url: - url = url.group(1) - url = unquote( - url.replace("http://http:/", "").replace("vvvvvvvvv", "").replace("lllllllll", "").replace( - "teletubbies", "")) - self.logDebug("URL: %s" % url) - return url - else: - self.fail("absolute filepath could not be found. offline? ") - - def get_file_name(self): - if not self.html: - self.download_html() - - return re.search("\s*(.*?)\s*", self.html).group(1) - - def file_exists(self): - """ returns True or False - """ - if not self.html: - self.download_html() - - if re.search(r"HTTP Status 404", self.html) is not None: - return False - else: - return True diff --git a/module/plugins/hoster/ShragleCom.py b/module/plugins/hoster/ShragleCom.py deleted file mode 100644 index ba3356d66..000000000 --- a/module/plugins/hoster/ShragleCom.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class ShragleCom(DeadHoster): - __name__ = "ShragleCom" - __type__ = "hoster" - __version__ = "0.22" - - __pattern__ = r'http://(?:www\.)?(cloudnator|shragle).com/files/(?P.*?)/' - - __description__ = """Cloudnator.com (Shragle.com) hoster plugin""" - __author_name__ = ("RaNaN", "zoidberg") - __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") - - -getInfo = create_getInfo(ShragleCom) diff --git a/module/plugins/hoster/SimplyPremiumCom.py b/module/plugins/hoster/SimplyPremiumCom.py deleted file mode 100644 index 5db9f5daa..000000000 --- a/module/plugins/hoster/SimplyPremiumCom.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from datetime import datetime, timedelta - -from module.plugins.Hoster import Hoster -from module.plugins.hoster.UnrestrictLi import secondsToMidnight - - -class SimplyPremiumCom(Hoster): - __name__ = "SimplyPremiumCom" - __type__ = "hoster" - __version__ = "0.03" - - __pattern__ = r'https?://.*(simply-premium)\.com' - - __description__ = """Simply-Premium.com hoster plugin""" - __author_name__ = "EvolutionClip" - __author_mail__ = "evolutionclip@live.de" - - - def setup(self): - self.chunkLimit = 16 - self.resumeDownload = False - - def process(self, pyfile): - if re.match(self.__pattern__, pyfile.url): - new_url = pyfile.url - elif not self.account: - self.logError(_("Please enter your %s account or deactivate this plugin") % "Simply-Premium.com") - self.fail("No Simply-Premium.com account provided") - else: - self.logDebug("Old URL: %s" % pyfile.url) - for i in xrange(5): - page = self.load('http://www.simply-premium.com/premium.php?info&link=' + pyfile.url) - self.logDebug("JSON data: " + page) - if page != '': - break - else: - self.logInfo("Unable to get API data, waiting 1 minute and retry") - self.retry(5, 60, "Unable to get API data") - - if '0' in page or ( - "You are not allowed to download from this host" in page and self.premium): - self.account.relogin(self.user) - self.retry() - elif "NOTFOUND" in page: - self.offline() - elif "downloadlimit" in page: - self.logWarning("Reached maximum connctions") - self.retry(5, 60, "Reached maximum connctions") - elif "trafficlimit" in page: - self.logWarning("Reached daily limit for this host") - self.retry(1, secondsToMidnight(gmt=2), "Daily limit for this host reached") - elif "hostererror" in page: - self.logWarning("Hoster temporarily unavailable, waiting 1 minute and retry") - self.retry(5, 60, "Hoster is temporarily unavailable") - #page = json_loads(page) - #new_url = page.keys()[0] - #self.api_data = page[new_url] - - try: - self.pyfile.name = re.search(r'([^<]+)', page).group(1) - except AttributeError: - self.pyfile.name = "" - - try: - self.pyfile.size = re.search(r'(\d+)', page).group(1) - except AttributeError: - self.pyfile.size = 0 - - try: - new_url = re.search(r'([^<]+)', page).group(1) - except AttributeError: - new_url = 'http://www.simply-premium.com/premium.php?link=' + pyfile.url - - if new_url != pyfile.url: - self.logDebug("New URL: " + new_url) - - self.download(new_url, disposition=True) diff --git a/module/plugins/hoster/SimplydebridCom.py b/module/plugins/hoster/SimplydebridCom.py deleted file mode 100644 index 78f6c0a34..000000000 --- a/module/plugins/hoster/SimplydebridCom.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.Hoster import Hoster - - -class SimplydebridCom(Hoster): - __name__ = "SimplydebridCom" - __type__ = "hoster" - __version__ = "0.1" - - __pattern__ = r'http://(?:www\.)?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/sd.php/*' - - __description__ = """Simply-debrid.com hoster plugin""" - __author_name__ = "Kagenoshin" - __author_mail__ = "kagenoshin@gmx.ch" - - - def setup(self): - self.resumeDownload = self.multiDL = True - self.chunkLimit = 1 - - def process(self, pyfile): - if not self.account: - self.logError(_("Please enter your %s account or deactivate this plugin") % "simply-debrid.com") - self.fail("No simply-debrid.com account provided") - - self.logDebug("Old URL: %s" % pyfile.url) - - #fix the links for simply-debrid.com! - new_url = pyfile.url - new_url = new_url.replace("clz.to", "cloudzer.net/file") - new_url = new_url.replace("http://share-online", "http://www.share-online") - new_url = new_url.replace("ul.to", "uploaded.net/file") - new_url = new_url.replace("uploaded.com", "uploaded.net") - new_url = new_url.replace("filerio.com", "filerio.in") - new_url = new_url.replace("lumfile.com", "lumfile.se") - if('fileparadox' in new_url): - new_url = new_url.replace("http://", "https://") - - if re.match(self.__pattern__, new_url): - new_url = new_url - - self.logDebug("New URL: %s" % new_url) - - if not re.match(self.__pattern__, new_url): - page = self.load('http://simply-debrid.com/api.php', get={'dl': new_url}) # +'&u='+self.user+'&p='+self.account.getAccountData(self.user)['password']) - if 'tiger Link' in page or 'Invalid Link' in page or ('API' in page and 'ERROR' in page): - self.fail('Unable to unrestrict link') - new_url = page - - self.setWait(5) - self.wait() - self.logDebug("Unrestricted URL: " + new_url) - - self.download(new_url, disposition=True) - - check = self.checkDownload({"bad1": "No address associated with hostname", "bad2": "\w+)' - - __description__ = """Sockshare.com hoster plugin""" - __author_name__ = ("jeix", "stickell", "Walter Purcaro") - __author_mail__ = ("jeix@hasnomail.de", "l.stickell@yahoo.it", "vuolter@gmail.com") - - FILE_INFO_PATTERN = r'site-content">\s*

    (?P.+)\( (?P[^)]+) \)

    ' - OFFLINE_PATTERN = r'>This file doesn\'t exist, or has been removed.<' - TEMP_OFFLINE_PATTERN = r'(>This content server has been temporarily disabled for upgrades|Try again soon\\. You can still download it below\\.<)' - - FILE_URL_REPLACEMENTS = [(__pattern__, r'http://www.sockshare.com/file/\g')] - - - def setup(self): - self.multiDL = self.resumeDownload = True - self.chunkLimit = -1 - - def handleFree(self): - name = self.pyfile.name - link = self._getLink() - self.logDebug("Direct link: " + link) - self.download(link, disposition=True) - self.processName(name) - - def _getLink(self): - hash_data = re.search(r'', self.html) - if not hash_data: - self.parseError("Unable to detect hash") - - post_data = {"hash": hash_data.group(1), "confirm": "Continue+as+Free+User"} - self.html = self.load(self.pyfile.url, post=post_data) - if ">You have exceeded the daily stream limit for your country\\. You can wait until tomorrow" in self.html: - self.logWarning("You have exceeded your daily stream limit for today") - self.wait(secondsToMidnight(gmt=2), True) - elif re.search(self.TEMP_OFFLINE_PATTERN, self.html): - self.retry(wait_time=2 * 60 * 60, reason="Server temporarily offline") # 2 hours wait - - patterns = (r'(/get_file\.php\?id=[A-Z0-9]+&key=[a-zA-Z0-9=]+&original=1)', - r'(/get_file\.php\?download=[A-Z0-9]+&key=[a-z0-9]+)', - r'(/get_file\.php\?download=[A-Z0-9]+&key=[a-z0-9]+&original=1)', - r'Tired of ads and waiting\? Go Pro![\t\n\rn ]+
    [\t\n\rn ]+.*?)/(?P.*)' - - __description__ = """SoundCloud.com hoster plugin""" - __author_name__ = "Peekayy" - __author_mail__ = "peekayy.dev@gmail.com" - - - def process(self, pyfile): - # default UserAgent of HTTPRequest fails for this hoster so we use this one - self.req.http.c.setopt(pycurl.USERAGENT, 'Mozilla/5.0') - page = self.load(pyfile.url) - m = re.search(r'
    .*?)"', page) - if m: - clientId = m.group("CID") - - if len(clientId) <= 0: - clientId = "b45b1aa10f1ac2941910a7f0d10f8e28" - - m = re.search(r'\s(?P.*?)\s</em>', page) - if m: - pyfile.name = m.group("TITLE") + ".mp3" - else: - pyfile.name = re.match(self.__pattern__, pyfile.url).group("SID") + ".mp3" - - # url to retrieve the actual song url - page = self.load("https://api.sndcdn.com/i1/tracks/%s/streams" % songId, get={"client_id": clientId}) - # getting streams - # for now we choose the first stream found in all cases - # it could be improved if relevant for this hoster - streams = [ - (result.group("QUALITY"), result.group("URL")) - for result in re.finditer(r'"(?P<QUALITY>.*?)":"(?P<URL>.*?)"', page) - ] - self.logDebug("Found Streams", streams) - self.logDebug("Downloading", streams[0][0], streams[0][1]) - self.download(streams[0][1]) diff --git a/module/plugins/hoster/SpeedLoadOrg.py b/module/plugins/hoster/SpeedLoadOrg.py deleted file mode 100644 index 8cf1163b2..000000000 --- a/module/plugins/hoster/SpeedLoadOrg.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class SpeedLoadOrg(DeadHoster): - __name__ = "SpeedLoadOrg" - __type__ = "hoster" - __version__ = "1.02" - - __pattern__ = r'http://(?:www\.)?speedload\.org/(?P<ID>\w+)' - - __description__ = """Speedload.org hoster plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - -getInfo = create_getInfo(SpeedLoadOrg) diff --git a/module/plugins/hoster/SpeedfileCz.py b/module/plugins/hoster/SpeedfileCz.py deleted file mode 100644 index 6a42d1dbe..000000000 --- a/module/plugins/hoster/SpeedfileCz.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class SpeedfileCz(DeadHoster): - __name__ = "SpeedFileCz" - __type__ = "hoster" - __version__ = "0.32" - - __pattern__ = r'http://(?:www\.)?speedfile.cz/.*' - - __description__ = """Speedfile.cz hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - -getInfo = create_getInfo(SpeedfileCz) diff --git a/module/plugins/hoster/SpeedyshareCom.py b/module/plugins/hoster/SpeedyshareCom.py deleted file mode 100644 index 22f4ee511..000000000 --- a/module/plugins/hoster/SpeedyshareCom.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- - -# Testlink: -# http://speedy.sh/ep2qY/Zapp-Brannigan.jpg - -import re - -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class SpeedyshareCom(SimpleHoster): - __name__ = "SpeedyshareCom" - __type__ = "hoster" - __pattern__ = r"https?://(www\.)?(speedyshare.com|speedy.sh)/.*" - __version__ = "0.01" - __description__ = """speedyshare.com hoster plugin""" - __author_name__ = ("zapp-brannigan") - __author_mail__ = ("fuerst.reinje@web.de") - - FILE_NAME_PATTERN = r'class=downloadfilename>(?P<N>.*)</span></td>' - FILE_SIZE_PATTERN = r'class=sizetagtext>(?P<S>.*) (?P<U>[kKmM]?[iI]?[bB]?)</div>' - LINK_PATTERN = r'<a href=\'(.*)\'><img src=/gf/slowdownload.png alt=\'Slow Download\' border=0' - FILE_OFFLINE_PATTERN = r'class=downloadfilenamenotfound>.*</span>' - BASE_URL = 'www.speedyshare.com' - - def setup(self): - self.multiDL = False - self.chunkLimit = 1 - - def process(self, pyfile): - self.html = self.load(pyfile.url, decode=True) - try: - dl_link = re.search(self.LINK_PATTERN, self.html).group(1) - self.logDebug("Link: " + dl_link) - except: - self.parseError("Unable to find download link") - self.download(self.BASE_URL + dl_link, disposition=True) - check = self.checkDownload({"is_html": re.compile("html")}) - if check == "is_html": - self.fail("The downloaded file is html, maybe the plugin is out of date") - - -getInfo = create_getInfo(SpeedyshareCom) diff --git a/module/plugins/hoster/StreamCz.py b/module/plugins/hoster/StreamCz.py deleted file mode 100644 index 526e61eea..000000000 --- a/module/plugins/hoster/StreamCz.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.network.RequestFactory import getURL -from module.plugins.Hoster import Hoster - - -def getInfo(urls): - result = [] - - for url in urls: - - html = getURL(url) - if re.search(StreamCz.OFFLINE_PATTERN, html): - # File offline - result.append((url, 0, 1, url)) - else: - result.append((url, 0, 2, url)) - yield result - - -class StreamCz(Hoster): - __name__ = "StreamCz" - __type__ = "hoster" - __version__ = "0.2" - - __pattern__ = r'https?://(?:www\.)?stream\.cz/[^/]+/\d+.*' - - __description__ = """Stream.cz hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FILE_NAME_PATTERN = r'<link rel="video_src" href="http://www.stream.cz/\w+/(\d+)-([^"]+)" />' - OFFLINE_PATTERN = r'<h1 class="commonTitle">Str.nku nebylo mo.n. nal.zt \(404\)</h1>' - - CDN_PATTERN = r'<param name="flashvars" value="[^"]*&id=(?P<ID>\d+)(?:&cdnLQ=(?P<cdnLQ>\d*))?(?:&cdnHQ=(?P<cdnHQ>\d*))?(?:&cdnHD=(?P<cdnHD>\d*))?&' - - - def setup(self): - self.multiDL = True - self.resumeDownload = True - - def process(self, pyfile): - - self.html = self.load(pyfile.url, decode=True) - - if re.search(self.OFFLINE_PATTERN, self.html): - self.offline() - - m = re.search(self.CDN_PATTERN, self.html) - if m is None: - self.fail("Parse error (CDN)") - cdn = m.groupdict() - self.logDebug(cdn) - for cdnkey in ("cdnHD", "cdnHQ", "cdnLQ"): - if cdnkey in cdn and cdn[cdnkey] > '': - cdnid = cdn[cdnkey] - break - else: - self.fail("Stream URL not found") - - m = re.search(self.FILE_NAME_PATTERN, self.html) - if m is None: - self.fail("Parse error (NAME)") - pyfile.name = "%s-%s.%s.mp4" % (m.group(2), m.group(1), cdnkey[-2:]) - - download_url = "http://cdn-dispatcher.stream.cz/?id=" + cdnid - self.logInfo("STREAM (%s): %s" % (cdnkey[-2:], download_url)) - self.download(download_url) diff --git a/module/plugins/hoster/StreamcloudEu.py b/module/plugins/hoster/StreamcloudEu.py deleted file mode 100644 index 11333640e..000000000 --- a/module/plugins/hoster/StreamcloudEu.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from time import sleep - -from module.network.HTTPRequest import HTTPRequest -from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo - - -class StreamcloudEu(XFileSharingPro): - __name__ = "StreamcloudEu" - __type__ = "hoster" - __version__ = "0.04" - - __pattern__ = r'http://(?:www\.)?streamcloud\.eu/\S+' - - __description__ = """Streamcloud.eu hoster plugin""" - __author_name__ = "seoester" - __author_mail__ = "seoester@googlemail.com" - - HOSTER_NAME = "streamcloud.eu" - - LINK_PATTERN = r'file: "(http://(stor|cdn)\d+\.streamcloud.eu:?\d*/.*/video\.(mp4|flv))",' - - - def setup(self): - super(StreamcloudEu, self).setup() - self.multiDL = True - - def getDownloadLink(self): - m = re.search(self.LINK_PATTERN, self.html, re.S) - if m: - return m.group(1) - - for i in xrange(5): - self.logDebug("Getting download link: #%d" % i) - data = self.getPostParameters() - httpRequest = HTTPRequest(options=self.req.options) - httpRequest.cj = self.req.cj - sleep(10) - self.html = httpRequest.load(self.pyfile.url, post=data, referer=False, cookies=True, decode=True) - self.header = httpRequest.header - - m = re.search("Location\s*:\s*(.*)", self.header, re.I) - if m: - break - - m = re.search(self.LINK_PATTERN, self.html, re.S) - if m: - break - - else: - if self.errmsg and 'captcha' in self.errmsg: - self.fail("No valid captcha code entered") - else: - self.fail("Download link not found") - - return m.group(1) - - def getPostParameters(self): - for i in xrange(3): - if not self.errmsg: - self.checkErrors() - - if hasattr(self, "FORM_PATTERN"): - action, inputs = self.parseHtmlForm(self.FORM_PATTERN) - else: - action, inputs = self.parseHtmlForm(input_names={"op": re.compile("^download")}) - - if not inputs: - action, inputs = self.parseHtmlForm('F1') - if not inputs: - if self.errmsg: - self.retry() - else: - self.parseError("Form not found") - - self.logDebug(self.HOSTER_NAME, inputs) - - if 'op' in inputs and inputs['op'] in ("download1", "download2", "download3"): - if "password" in inputs: - if self.passwords: - inputs['password'] = self.passwords.pop(0) - else: - self.fail("No or invalid passport") - - if not self.premium: - m = re.search(self.WAIT_PATTERN, self.html) - if m: - wait_time = int(m.group(1)) + 1 - self.setWait(wait_time, False) - else: - wait_time = 0 - - self.captcha = self.handleCaptcha(inputs) - - if wait_time: - self.wait() - - self.errmsg = None - self.logDebug("getPostParameters {0}".format(i)) - return inputs - - else: - inputs['referer'] = self.pyfile.url - - if self.premium: - inputs['method_premium'] = "Premium Download" - if 'method_free' in inputs: - del inputs['method_free'] - else: - inputs['method_free'] = "Free Download" - if 'method_premium' in inputs: - del inputs['method_premium'] - - self.html = self.load(self.pyfile.url, post=inputs, ref=False) - self.errmsg = None - - else: - self.parseError('FORM: %s' % (inputs['op'] if 'op' in inputs else 'UNKNOWN')) - - -getInfo = create_getInfo(StreamcloudEu) diff --git a/module/plugins/hoster/TurbobitNet.py b/module/plugins/hoster/TurbobitNet.py deleted file mode 100644 index a9cc46614..000000000 --- a/module/plugins/hoster/TurbobitNet.py +++ /dev/null @@ -1,167 +0,0 @@ -# -*- coding: utf-8 -*- - -import random -import re -import time - -from Crypto.Cipher import ARC4 -from binascii import hexlify, unhexlify -from pycurl import HTTPHEADER -from urllib import quote - -from module.network.RequestFactory import getURL -from module.plugins.internal.CaptchaService import ReCaptcha -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, timestamp - - -class TurbobitNet(SimpleHoster): - __name__ = "TurbobitNet" - __type__ = "hoster" - __version__ = "0.11" - - __pattern__ = r'http://(?:www\.)?(turbobit.net|unextfiles.com)/(?!download/folder/)(?:download/free/)?(?P<ID>\w+).*' - - __description__ = """Turbobit.net plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FILE_INFO_PATTERN = r"<span class='file-icon1[^>]*>(?P<N>[^<]+)</span>\s*\((?P<S>[^\)]+)\)\s*</h1>" #: long filenames are shortened - FILE_NAME_PATTERN = r'<meta name="keywords" content="\s+(?P<N>[^,]+)' #: full name but missing on page2 - OFFLINE_PATTERN = r'<h2>File Not Found</h2>|html\(\'File (?:was )?not found' - - FILE_URL_REPLACEMENTS = [(r"http://(?:www\.)?(turbobit.net|unextfiles.com)/(?:download/free/)?(?P<ID>\w+).*", - "http://turbobit.net/\g<ID>.html")] - SH_COOKIES = [(".turbobit.net", "user_lang", "en")] - - LINK_PATTERN = r'(?P<url>/download/redirect/[^"\']+)' - LIMIT_WAIT_PATTERN = r'<div id="time-limit-text">\s*.*?<span id=\'timeout\'>(\d+)</span>' - CAPTCHA_KEY_PATTERN = r'src="http://api\.recaptcha\.net/challenge\?k=([^"]+)"' - CAPTCHA_SRC_PATTERN = r'<img alt="Captcha" src="(.*?)"' - - - def handleFree(self): - self.url = "http://turbobit.net/download/free/%s" % self.file_info['ID'] - self.html = self.load(self.url) - - rtUpdate = self.getRtUpdate() - - self.solveCaptcha() - self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With: XMLHttpRequest"]) - self.url = self.getDownloadUrl(rtUpdate) - - self.wait() - self.html = self.load(self.url) - self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With:"]) - self.downloadFile() - - def solveCaptcha(self): - for _ in xrange(5): - m = re.search(self.LIMIT_WAIT_PATTERN, self.html) - if m: - wait_time = int(m.group(1)) - self.wait(wait_time, wait_time > 60) - self.retry() - - action, inputs = self.parseHtmlForm("action='#'") - if not inputs: - self.parseError("captcha form") - self.logDebug(inputs) - - if inputs['captcha_type'] == 'recaptcha': - recaptcha = ReCaptcha(self) - m = re.search(self.CAPTCHA_KEY_PATTERN, self.html) - captcha_key = m.group(1) if m else '6LcTGLoSAAAAAHCWY9TTIrQfjUlxu6kZlTYP50_c' - inputs['recaptcha_challenge_field'], inputs['recaptcha_response_field'] = recaptcha.challenge( - captcha_key) - else: - m = re.search(self.CAPTCHA_SRC_PATTERN, self.html) - if m is None: - self.parseError('captcha') - captcha_url = m.group(1) - inputs['captcha_response'] = self.decryptCaptcha(captcha_url) - - self.logDebug(inputs) - self.html = self.load(self.url, post=inputs) - - if not "<div class='download-timer-header'>" in self.html: - self.invalidCaptcha() - else: - self.correctCaptcha() - break - else: - self.fail("Invalid captcha") - - def getRtUpdate(self): - rtUpdate = self.getStorage("rtUpdate") - if not rtUpdate: - if self.getStorage("version") != self.__version__ or int( - self.getStorage("timestamp", 0)) + 86400000 < timestamp(): - # that's right, we are even using jdownloader updates - rtUpdate = getURL("http://update0.jdownloader.org/pluginstuff/tbupdate.js") - rtUpdate = self.decrypt(rtUpdate.splitlines()[1]) - # but we still need to fix the syntax to work with other engines than rhino - rtUpdate = re.sub(r'for each\(var (\w+) in(\[[^\]]+\])\)\{', - r'zza=\2;for(var zzi=0;zzi<zza.length;zzi++){\1=zza[zzi];', rtUpdate) - rtUpdate = re.sub(r"for\((\w+)=", r"for(var \1=", rtUpdate) - - self.logDebug("rtUpdate") - self.setStorage("rtUpdate", rtUpdate) - self.setStorage("timestamp", timestamp()) - self.setStorage("version", self.__version__) - else: - self.logError("Unable to download, wait for update...") - self.tempOffline() - - return rtUpdate - - def getDownloadUrl(self, rtUpdate): - self.req.http.lastURL = self.url - - m = re.search("(/\w+/timeout\.js\?\w+=)([^\"\'<>]+)", self.html) - url = "http://turbobit.net%s%s" % (m.groups() if m else ( - '/files/timeout.js?ver=', ''.join(random.choice('0123456789ABCDEF') for _ in xrange(32)))) - fun = self.load(url) - - self.setWait(65, False) - - for b in [1, 3]: - self.jscode = "var id = \'%s\';var b = %d;var inn = \'%s\';%sout" % ( - self.file_info['ID'], b, quote(fun), rtUpdate) - - try: - out = self.js.eval(self.jscode) - self.logDebug("URL", self.js.engine, out) - if out.startswith('/download/'): - return "http://turbobit.net%s" % out.strip() - except Exception, e: - self.logError(e) - else: - if self.retries >= 2: - # retry with updated js - self.delStorage("rtUpdate") - self.retry() - - def decrypt(self, data): - cipher = ARC4.new(hexlify('E\x15\xa1\x9e\xa3M\xa0\xc6\xa0\x84\xb6H\x83\xa8o\xa0')) - return unhexlify(cipher.encrypt(unhexlify(data))) - - def getLocalTimeString(self): - lt = time.localtime() - tz = time.altzone if lt.tm_isdst else time.timezone - return "%s GMT%+03d%02d" % (time.strftime("%a %b %d %Y %H:%M:%S", lt), -tz // 3600, tz % 3600) - - def handlePremium(self): - self.logDebug("Premium download as user %s" % self.user) - self.html = self.load(self.pyfile.url) # Useless in 0.5 - self.downloadFile() - - def downloadFile(self): - m = re.search(self.LINK_PATTERN, self.html) - if m is None: - self.parseError("download link") - self.url = "http://turbobit.net" + m.group('url') - self.logDebug(self.url) - self.download(self.url) - - -getInfo = create_getInfo(TurbobitNet) diff --git a/module/plugins/hoster/TurbouploadCom.py b/module/plugins/hoster/TurbouploadCom.py deleted file mode 100644 index bcfa2d7d4..000000000 --- a/module/plugins/hoster/TurbouploadCom.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class TurbouploadCom(DeadHoster): - __name__ = "TurbouploadCom" - __type__ = "hoster" - __version__ = "0.03" - - __pattern__ = r'http://(?:www\.)?turboupload.com/(\w+).*' - - __description__ = """Turboupload.com hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - -getInfo = create_getInfo(TurbouploadCom) diff --git a/module/plugins/hoster/TusfilesNet.py b/module/plugins/hoster/TusfilesNet.py deleted file mode 100644 index 7fb2a375e..000000000 --- a/module/plugins/hoster/TusfilesNet.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo - - -class TusfilesNet(XFileSharingPro): - __name__ = "TusfilesNet" - __type__ = "hoster" - __version__ = "0.03" - - __pattern__ = r'https?://(?:www\.)?tusfiles\.net/(?P<ID>\w+)' - - __description__ = """Tusfiles.net hoster plugin""" - __author_name__ = "Walter Purcaro" - __author_mail__ = "vuolter@gmail.com" - - HOSTER_NAME = "tusfiles.net" - - FILE_INFO_PATTERN = r'\](?P<N>.+) - (?P<S>[\d.]+) (?P<U>\w+)\[' - OFFLINE_PATTERN = r'>File Not Found|<Title>TusFiles - Fast Sharing Files!' - - SH_COOKIES = [(".tusfiles.net", "lang", "english")] - - - def setup(self): - self.multiDL = False - self.chunkLimit = -1 - self.resumeDownload = True - - -getInfo = create_getInfo(TusfilesNet) diff --git a/module/plugins/hoster/TwoSharedCom.py b/module/plugins/hoster/TwoSharedCom.py deleted file mode 100644 index dbd33dd83..000000000 --- a/module/plugins/hoster/TwoSharedCom.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class TwoSharedCom(SimpleHoster): - __name__ = "TwoSharedCom" - __type__ = "hoster" - __version__ = "0.11" - - __pattern__ = r'http://(?:www\.)?2shared.com/(account/)?(download|get|file|document|photo|video|audio)/.*' - - __description__ = """2Shared.com hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FILE_NAME_PATTERN = r'<h1>(?P<N>.*)</h1>' - FILE_SIZE_PATTERN = r'<span class="dtitle">File size:</span>\s*(?P<S>[0-9,.]+) (?P<U>[kKMG])i?B' - OFFLINE_PATTERN = r'The file link that you requested is not valid\.|This file was deleted\.' - - LINK_PATTERN = r"window.location ='([^']+)';" - - - def setup(self): - self.resumeDownload = self.multiDL = True - - def handleFree(self): - m = re.search(self.LINK_PATTERN, self.html) - if m is None: - self.parseError('Download link') - link = m.group(1) - self.logDebug("Download URL %s" % link) - - self.download(link) - - -getInfo = create_getInfo(TwoSharedCom) diff --git a/module/plugins/hoster/UlozTo.py b/module/plugins/hoster/UlozTo.py deleted file mode 100644 index dbdaf3f8e..000000000 --- a/module/plugins/hoster/UlozTo.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import time - -from module.common.json_layer import json_loads -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -def convertDecimalPrefix(m): - # decimal prefixes used in filesize and traffic - return ("%%.%df" % {'k': 3, 'M': 6, 'G': 9}[m.group(2)] % float(m.group(1))).replace('.', '') - - -class UlozTo(SimpleHoster): - __name__ = "UlozTo" - __type__ = "hoster" - __version__ = "0.98" - - __pattern__ = r'http://(?:www\.)?(uloz\.to|ulozto\.(cz|sk|net)|bagruj.cz|zachowajto.pl)/(?:live/)?(?P<id>\w+/[^/?]*)' - - __description__ = """Uloz.to hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FILE_INFO_PATTERN = r'<p>File <strong>(?P<N>[^<]+)</strong> is password protected</p>' - FILE_NAME_PATTERN = r'<title>(?P<N>[^<]+) \| Uloz.to' - FILE_SIZE_PATTERN = r'.*?(?P[0-9.]+\s[kMG]?B)' - OFFLINE_PATTERN = r'404 - Page not found|

    File (has been deleted|was banned)

    ' - - FILE_SIZE_REPLACEMENTS = [('([0-9.]+)\s([kMG])B', convertDecimalPrefix)] - FILE_URL_REPLACEMENTS = [(r"(?<=http://)([^/]+)", "www.ulozto.net")] - - ADULT_PATTERN = r'
    ' - PASSWD_PATTERN = r'
    ' - VIPLINK_PATTERN = r'' - FREE_URL_PATTERN = r'
    ' - - - def setup(self): - self.multiDL = self.premium - self.resumeDownload = True - - def process(self, pyfile): - pyfile.url = re.sub(r"(?<=http://)([^/]+)", "www.ulozto.net", pyfile.url) - self.html = self.load(pyfile.url, decode=True, cookies=True) - - if re.search(self.ADULT_PATTERN, self.html): - self.logInfo("Adult content confirmation needed. Proceeding..") - - m = re.search(self.TOKEN_PATTERN, self.html) - if m is None: - self.parseError('TOKEN') - token = m.group(1) - - self.html = self.load(pyfile.url, get={"do": "askAgeForm-submit"}, - post={"agree": "Confirm", "_token_": token}, cookies=True) - - passwords = self.getPassword().splitlines() - while self.PASSWD_PATTERN in self.html: - if passwords: - password = passwords.pop(0) - self.logInfo("Password protected link, trying " + password) - self.html = self.load(pyfile.url, get={"do": "passwordProtectedForm-submit"}, - post={"password": password, "password_send": 'Send'}, cookies=True) - else: - self.fail("No or incorrect password") - - if re.search(self.VIPLINK_PATTERN, self.html): - self.html = self.load(pyfile.url, get={"disclaimer": "1"}) - - self.file_info = self.getFileInfo() - - if self.premium and self.checkTrafficLeft(): - self.handlePremium() - else: - self.handleFree() - - self.doCheckDownload() - - def handleFree(self): - action, inputs = self.parseHtmlForm('id="frm-downloadDialog-freeDownloadForm"') - if not action or not inputs: - self.parseError("free download form") - - self.logDebug('inputs.keys() = ' + str(inputs.keys())) - # get and decrypt captcha - if all(key in inputs for key in ("captcha_value", "captcha_id", "captcha_key")): - # Old version - last seen 9.12.2013 - self.logDebug('Using "old" version') - - captcha_value = self.decryptCaptcha("http://img.uloz.to/captcha/%s.png" % inputs['captcha_id']) - self.logDebug('CAPTCHA ID: ' + inputs['captcha_id'] + ", CAPTCHA VALUE: " + captcha_value) - - inputs.update({'captcha_id': inputs['captcha_id'], 'captcha_key': inputs['captcha_key'], 'captcha_value': captcha_value}) - - elif all(key in inputs for key in ("captcha_value", "timestamp", "salt", "hash")): - # New version - better to get new parameters (like captcha reload) because of image url - since 6.12.2013 - self.logDebug('Using "new" version') - - xapca = self.load("http://www.ulozto.net/reloadXapca.php", get={"rnd": str(int(time.time()))}) - self.logDebug('xapca = ' + str(xapca)) - - data = json_loads(xapca) - captcha_value = self.decryptCaptcha(str(data['image'])) - self.logDebug("CAPTCHA HASH: " + data['hash'] + ", CAPTCHA SALT: " + str(data['salt']) + ", CAPTCHA VALUE: " + captcha_value) - - inputs.update({'timestamp': data['timestamp'], 'salt': data['salt'], 'hash': data['hash'], 'captcha_value': captcha_value}) - else: - self.parseError("CAPTCHA form changed") - - self.multiDL = True - self.download("http://www.ulozto.net" + action, post=inputs, cookies=True, disposition=True) - - def handlePremium(self): - self.download(self.pyfile.url + "?do=directDownload", disposition=True) - #parsed_url = self.findDownloadURL(premium=True) - #self.download(parsed_url, post={"download": "Download"}) - - def findDownloadURL(self, premium=False): - msg = "%s link" % ("Premium" if premium else "Free") - m = re.search(self.PREMIUM_URL_PATTERN if premium else self.FREE_URL_PATTERN, self.html) - if m is None: - self.parseError(msg) - parsed_url = "http://www.ulozto.net" + m.group(1) - self.logDebug("%s: %s" % (msg, parsed_url)) - return parsed_url - - def doCheckDownload(self): - check = self.checkDownload({ - "wrong_captcha": re.compile(r'
    [^>]*?alt="OK"' - - - def getHoster(self): - page = getURL("http://www.multishare.cz/monitoring/") - return re.findall(self.HOSTER_PATTERN, page) diff --git a/module/plugins/hooks/OverLoadMe.py b/module/plugins/hooks/OverLoadMe.py deleted file mode 100644 index 5be0b8482..000000000 --- a/module/plugins/hooks/OverLoadMe.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class OverLoadMe(MultiHoster): - __name__ = "OverLoadMe" - __type__ = "hook" - __version__ = "0.01" - - __config__ = [("activated", "bool", "Activated", False), - ("https", "bool", "Enable HTTPS", True), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to standard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 12)] - - __description__ = """Over-Load.me hook plugin""" - __author_name__ = "marley" - __author_mail__ = "marley@over-load.me" - - - def getHoster(self): - https = "https" if self.getConfig("https") else "http" - page = getURL(https + "://api.over-load.me/hoster.php", - get={"auth": "0001-cb1f24dadb3aa487bda5afd3b76298935329be7700cd7-5329be77-00cf-1ca0135f"} - ).replace("\"", "").strip() - self.logDebug("Hosterlist: %s" % page) - - return [x.strip() for x in page.split(",") if x.strip()] diff --git a/module/plugins/hooks/Premium4Me.py b/module/plugins/hooks/Premium4Me.py deleted file mode 100644 index 9c6701b06..000000000 --- a/module/plugins/hooks/Premium4Me.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class Premium4Me(MultiHoster): - __name__ = "Premium4Me" - __type__ = "hook" - __version__ = "0.03" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for downloads from supported hosters:", "all"), - ("hosterList", "str", "Hoster list (comma separated)", "")] - - __description__ = """Premium.to hook plugin""" - __author_name__ = ("RaNaN", "zoidberg", "stickell") - __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz", "l.stickell@yahoo.it") - - - def getHoster(self): - page = getURL("http://premium.to/api/hosters.php?authcode=%s" % self.account.authcode) - return [x.strip() for x in page.replace("\"", "").split(";")] - - def coreReady(self): - self.account = self.core.accountManager.getAccountPlugin("Premium4Me") - - user = self.account.selectAccount()[0] - - if not user: - self.logError(_("Please add your premium.to account first and restart pyLoad")) - return - - return MultiHoster.coreReady(self) diff --git a/module/plugins/hooks/PremiumizeMe.py b/module/plugins/hooks/PremiumizeMe.py deleted file mode 100644 index e7291ece9..000000000 --- a/module/plugins/hooks/PremiumizeMe.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.common.json_layer import json_loads -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class PremiumizeMe(MultiHoster): - __name__ = "PremiumizeMe" - __type__ = "hook" - __version__ = "0.12" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to stanard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """Premiumize.me hook plugin""" - __author_name__ = "Florian Franzen" - __author_mail__ = "FlorianFranzen@gmail.com" - - - def getHoster(self): - # If no accounts are available there will be no hosters available - if not self.account or not self.account.canUse(): - return [] - - # Get account data - (user, data) = self.account.selectAccount() - - # Get supported hosters list from premiumize.me using the - # json API v1 (see https://secure.premiumize.me/?show=api) - answer = getURL("https://api.premiumize.me/pm-api/v1.php?method=hosterlist¶ms[login]=%s¶ms[pass]=%s" % ( - user, data['password'])) - data = json_loads(answer) - - # If account is not valid thera are no hosters available - if data['status'] != 200: - return [] - - # Extract hosters from json file - return data['result']['hosterlist'] - - def coreReady(self): - # Get account plugin and check if there is a valid account available - self.account = self.core.accountManager.getAccountPlugin("PremiumizeMe") - if not self.account.canUse(): - self.account = None - self.logError(_("Please add a valid premiumize.me account first and restart pyLoad.")) - return - - # Run the overwriten core ready which actually enables the multihoster hook - return MultiHoster.coreReady(self) diff --git a/module/plugins/hooks/RPNetBiz.py b/module/plugins/hooks/RPNetBiz.py deleted file mode 100644 index 9b9b7cda9..000000000 --- a/module/plugins/hooks/RPNetBiz.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.common.json_layer import json_loads -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class RPNetBiz(MultiHoster): - __name__ = "RPNetBiz" - __type__ = "hook" - __version__ = "0.1" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to stanard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """RPNet.biz hook plugin""" - __author_name__ = "Dman" - __author_mail__ = "dmanugm@gmail.com" - - - def getHoster(self): - # No hosts supported if no account - if not self.account or not self.account.canUse(): - return [] - - # Get account data - (user, data) = self.account.selectAccount() - - response = getURL("https://premium.rpnet.biz/client_api.php", - get={"username": user, "password": data['password'], "action": "showHosterList"}) - hoster_list = json_loads(response) - - # If account is not valid thera are no hosters available - if 'error' in hoster_list: - return [] - - # Extract hosters from json file - return hoster_list['hosters'] - - def coreReady(self): - # Get account plugin and check if there is a valid account available - self.account = self.core.accountManager.getAccountPlugin("RPNetBiz") - if not self.account.canUse(): - self.account = None - self.logError(_("Please enter your %s account or deactivate this plugin") % "rpnet") - return - - # Run the overwriten core ready which actually enables the multihoster hook - return MultiHoster.coreReady(self) diff --git a/module/plugins/hooks/RealdebridCom.py b/module/plugins/hooks/RealdebridCom.py deleted file mode 100644 index 87902ac7f..000000000 --- a/module/plugins/hooks/RealdebridCom.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class RealdebridCom(MultiHoster): - __name__ = "RealdebridCom" - __type__ = "hook" - __version__ = "0.43" - - __config__ = [("activated", "bool", "Activated", False), - ("https", "bool", "Enable HTTPS", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to stanard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """Real-Debrid.com hook plugin""" - __author_name__ = "Devirex Hazzard" - __author_mail__ = "naibaf_11@yahoo.de" - - - def getHoster(self): - https = "https" if self.getConfig("https") else "http" - page = getURL(https + "://real-debrid.com/api/hosters.php").replace("\"", "").strip() - - return [x.strip() for x in page.split(",") if x.strip()] diff --git a/module/plugins/hooks/RehostTo.py b/module/plugins/hooks/RehostTo.py deleted file mode 100644 index d504bb83b..000000000 --- a/module/plugins/hooks/RehostTo.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class RehostTo(MultiHoster): - __name__ = "RehostTo" - __type__ = "hook" - __version__ = "0.43" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to stanard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24)] - - __description__ = """Rehost.to hook plugin""" - __author_name__ = "RaNaN" - __author_mail__ = "RaNaN@pyload.org" - - - def getHoster(self): - page = getURL("http://rehost.to/api.php?cmd=get_supported_och_dl&long_ses=%s" % self.long_ses) - return [x.strip() for x in page.replace("\"", "").split(",")] - - def coreReady(self): - self.account = self.core.accountManager.getAccountPlugin("RehostTo") - - user = self.account.selectAccount()[0] - - if not user: - self.logError("Rehost.to: " + _("Please add your rehost.to account first and restart pyLoad")) - return - - data = self.account.getAccountInfo(user) - self.ses = data['ses'] - self.long_ses = data['long_ses'] - - return MultiHoster.coreReady(self) diff --git a/module/plugins/hooks/RestartFailed.py b/module/plugins/hooks/RestartFailed.py deleted file mode 100644 index 3aef6f8cd..000000000 --- a/module/plugins/hooks/RestartFailed.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.Hook import Hook - - -class RestartFailed(Hook): - __name__ = "RestartFailed" - __type__ = "hook" - __version__ = "1.55" - - __config__ = [("activated", "bool", "Activated", False), - ("interval", "int", "Check interval in minutes", 90)] - - __description__ = """Periodically restart all failed downloads in queue""" - __author_name__ = "Walter Purcaro" - __author_mail__ = "vuolter@gmail.com" - - MIN_INTERVAL = 15 * 60 #: 15m minimum check interval (value is in seconds) - - event_list = ["pluginConfigChanged"] - - - def pluginConfigChanged(self, plugin, name, value): - if name == "interval": - interval = value * 60 - if self.MIN_INTERVAL <= interval != self.interval: - self.core.scheduler.removeJob(self.cb) - self.interval = interval - self.initPeriodical() - else: - self.logDebug("Invalid interval value, kept current") - - def periodical(self): - self.logInfo("Restart failed downloads") - self.api.restartFailed() - - def setup(self): - self.api = self.core.api - self.interval = self.MIN_INTERVAL - - def coreReady(self): - self.pluginConfigChanged(self.__name__, "interval", self.getConfig("interval")) diff --git a/module/plugins/hooks/SimplyPremiumCom.py b/module/plugins/hooks/SimplyPremiumCom.py deleted file mode 100644 index a946d391e..000000000 --- a/module/plugins/hooks/SimplyPremiumCom.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.common.json_layer import json_loads -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class SimplyPremiumCom(MultiHoster): - __name__ = "SimplyPremiumCom" - __type__ = "hook" - __version__ = "0.02" - - __config__ = [("activated", "bool", "Activated", "False"), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to standard download if download fails", "False"), - ("interval", "int", "Reload interval in hours (0 to disable)", "24")] - - __description__ = """Simply-Premium.com hook plugin""" - __author_name__ = "EvolutionClip" - __author_mail__ = "evolutionclip@live.de" - - - def getHoster(self): - json_data = getURL('http://www.simply-premium.com/api/hosts.php?format=json&online=1') - json_data = json_loads(json_data) - - host_list = [element['regex'] for element in json_data['result']] - - return host_list diff --git a/module/plugins/hooks/SimplydebridCom.py b/module/plugins/hooks/SimplydebridCom.py deleted file mode 100644 index ab13f312e..000000000 --- a/module/plugins/hooks/SimplydebridCom.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class SimplydebridCom(MultiHoster): - __name__ = "SimplydebridCom" - __type__ = "hook" - __version__ = "0.01" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", "")] - - __description__ = """Simply-Debrid.com hook plugin""" - __author_name__ = "Kagenoshin" - __author_mail__ = "kagenoshin@gmx.ch" - - - def getHoster(self): - page = getURL("http://simply-debrid.com/api.php?list=1") - return [x.strip() for x in page.rstrip(';').replace("\"", "").split(";")] diff --git a/module/plugins/hooks/UnSkipOnFail.py b/module/plugins/hooks/UnSkipOnFail.py deleted file mode 100644 index f25c5e2b4..000000000 --- a/module/plugins/hooks/UnSkipOnFail.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- - -from os.path import basename - -from module.PyFile import PyFile -from module.plugins.Hook import Hook -from module.utils import fs_encode - - -class UnSkipOnFail(Hook): - __name__ = "UnSkipOnFail" - __type__ = "hook" - __version__ = "0.01" - - __config__ = [("activated", "bool", "Activated", True)] - - __description__ = """When a download fails, restart skipped duplicates""" - __author_name__ = "hagg" - __author_mail__ = None - - - def downloadFailed(self, pyfile): - pyfile_name = basename(pyfile.name) - pid = pyfile.package().id - msg = 'look for skipped duplicates for %s (pid:%s)...' - self.logInfo(msg % (pyfile_name, pid)) - dups = self.findDuplicates(pyfile) - for link in dups: - # check if link is "skipped"(=4) - if link.status == 4: - lpid = link.packageID - self.logInfo('restart "%s" (pid:%s)...' % (pyfile_name, lpid)) - self.setLinkStatus(link, "queued") - - def findDuplicates(self, pyfile): - """ Search all packages for duplicate links to "pyfile". - Duplicates are links that would overwrite "pyfile". - To test on duplicity the package-folder and link-name - of twolinks are compared (basename(link.name)). - So this method returns a list of all links with equal - package-folders and filenames as "pyfile", but except - the data for "pyfile" iotselöf. - It does MOT check the link's status. - """ - dups = [] - pyfile_name = fs_encode(basename(pyfile.name)) - # get packages (w/o files, as most file data is useless here) - queue = self.core.api.getQueue() - for package in queue: - # check if package-folder equals pyfile's package folder - if fs_encode(package.folder) == fs_encode(pyfile.package().folder): - # now get packaged data w/ files/links - pdata = self.core.api.getPackageData(package.pid) - if pdata.links: - for link in pdata.links: - link_name = fs_encode(basename(link.name)) - # check if link name collides with pdata's name - if link_name == pyfile_name: - # at last check if it is not pyfile itself - if link.fid != pyfile.id: - dups.append(link) - return dups - - def setLinkStatus(self, link, new_status): - """ Change status of "link" to "new_status". - "link" has to be a valid FileData object, - "new_status" has to be a valid status name - (i.e. "queued" for this Plugin) - It creates a temporary PyFile object using - "link" data, changes its status, and tells - the core.files-manager to save its data. - """ - pyfile = PyFile(self.core.files, - link.fid, - link.url, - link.name, - link.size, - link.status, - link.error, - link.plugin, - link.packageID, - link.order) - pyfile.setStatus(new_status) - self.core.files.save() - pyfile.release() diff --git a/module/plugins/hooks/UnrestrictLi.py b/module/plugins/hooks/UnrestrictLi.py deleted file mode 100644 index ee5d79269..000000000 --- a/module/plugins/hooks/UnrestrictLi.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.common.json_layer import json_loads -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class UnrestrictLi(MultiHoster): - __name__ = "UnrestrictLi" - __type__ = "hook" - __version__ = "0.02" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", ""), - ("unloadFailing", "bool", "Revert to standard download if download fails", False), - ("interval", "int", "Reload interval in hours (0 to disable)", 24), - ("history", "bool", "Delete History", False)] - - __description__ = """Unrestrict.li hook plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - - def getHoster(self): - json_data = getURL('http://unrestrict.li/api/jdownloader/hosts.php?format=json') - json_data = json_loads(json_data) - - host_list = [element['host'] for element in json_data['result']] - - return host_list diff --git a/module/plugins/hooks/UpdateManager.py b/module/plugins/hooks/UpdateManager.py deleted file mode 100644 index 320bc24e3..000000000 --- a/module/plugins/hooks/UpdateManager.py +++ /dev/null @@ -1,281 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import sys - -from operator import itemgetter -from os import path, remove, stat - -from module.network.RequestFactory import getURL -from module.plugins.Hook import Expose, Hook, threaded -from module.utils import safe_join - - -class UpdateManager(Hook): - __name__ = "UpdateManager" - __type__ = "hook" - __version__ = "0.35" - - __config__ = [("activated", "bool", "Activated", True), - ("mode", "pyLoad + plugins;plugins only", "Check updates for", "pyLoad + plugins"), - ("interval", "int", "Check interval in hours", 8), - ("reloadplugins", "bool", "Monitor plugins for code changes (debug mode only)", True), - ("nodebugupdate", "bool", "Don't check for updates in debug mode", True)] - - __description__ = """ Check for updates """ - __author_name__ = "Walter Purcaro" - __author_mail__ = "vuolter@gmail.com" - - - event_list = ["pluginConfigChanged"] - - SERVER_URL = "http://updatemanager.pyload.org" - MIN_INTERVAL = 3 * 60 * 60 #: 3h minimum check interval (value is in seconds) - - - def pluginConfigChanged(self, plugin, name, value): - if name == "interval": - interval = value * 60 * 60 - if self.MIN_INTERVAL <= interval != self.interval: - self.core.scheduler.removeJob(self.cb) - self.interval = interval - self.initPeriodical() - else: - self.logDebug("Invalid interval value, kept current") - elif name == "reloadplugins": - if self.cb2: - self.core.scheduler.removeJob(self.cb2) - if value is True and self.core.debug: - self.periodical2() - - def coreReady(self): - self.pluginConfigChanged(self.__name__, "interval", self.getConfig("interval")) - x = lambda: self.pluginConfigChanged(self.__name__, "reloadplugins", self.getConfig("reloadplugins")) - self.core.scheduler.addJob(10, x, threaded=False) - - def unload(self): - self.pluginConfigChanged(self.__name__, "reloadplugins", False) - - def setup(self): - self.cb2 = None - self.interval = self.MIN_INTERVAL - self.updating = False - self.info = {'pyload': False, 'version': None, 'plugins': False} - self.mtimes = {} #: store modification time for each plugin - - def periodical2(self): - if not self.updating: - self.autoreloadPlugins() - self.cb2 = self.core.scheduler.addJob(4, self.periodical2, threaded=False) - - @Expose - def autoreloadPlugins(self): - """ reload and reindex all modified plugins """ - modules = filter( - lambda m: m and (m.__name__.startswith("module.plugins.") or - m.__name__.startswith("userplugins.")) and - m.__name__.count(".") >= 2, sys.modules.itervalues() - ) - - reloads = [] - - for m in modules: - root, type, name = m.__name__.rsplit(".", 2) - id = (type, name) - if type in self.core.pluginManager.plugins: - f = m.__file__.replace(".pyc", ".py") - if not path.isfile(f): - continue - - mtime = stat(f).st_mtime - - if id not in self.mtimes: - self.mtimes[id] = mtime - elif self.mtimes[id] < mtime: - reloads.append(id) - self.mtimes[id] = mtime - - return True if self.core.pluginManager.reloadPlugins(reloads) else False - - def periodical(self): - if not self.info['pyload'] and not (self.getConfig("nodebugupdate") and self.core.debug): - self.updateThread() - - def server_request(self): - try: - return getURL(self.SERVER_URL, get={'v': self.core.api.getServerVersion()}).splitlines() - except: - self.logWarning(_("Unable to contact server to get updates")) - - @threaded - def updateThread(self): - self.updating = True - status = self.update(onlyplugin=self.getConfig("mode") == "plugins only") - if status == 2: - self.core.api.restart() - else: - self.updating = False - - @Expose - def updatePlugins(self): - """ simple wrapper for calling plugin update quickly """ - return self.update(onlyplugin=True) - - @Expose - def update(self, onlyplugin=False): - """ check for updates """ - data = self.server_request() - if not data: - exitcode = 0 - elif data[0] == "None": - self.logInfo(_("No new pyLoad version available")) - updates = data[1:] - exitcode = self._updatePlugins(updates) - elif onlyplugin: - exitcode = 0 - else: - newversion = data[0] - self.logInfo(_("*** New pyLoad Version %s available ***") % newversion) - self.logInfo(_("*** Get it here: https://github.com/pyload/pyload/releases ***")) - exitcode = 3 - self.info['pyload'] = True - self.info['version'] = newversion - return exitcode #: 0 = No plugins updated; 1 = Plugins updated; 2 = Plugins updated, but restart required; 3 = No plugins updated, new pyLoad version available - - def _updatePlugins(self, updates): - """ check for plugin updates """ - - if self.info['plugins']: - return False #: plugins were already updated - - updated = [] - - vre = re.compile(r'__version__.*=.*("|\')([0-9.]+)') - url = updates[0] - schema = updates[1].split('|') - if "BLACKLIST" in updates: - blacklist = updates[updates.index('BLACKLIST') + 1:] - updates = updates[2:updates.index('BLACKLIST')] - else: - blacklist = None - updates = updates[2:] - - upgradable = sorted(map(lambda x: dict(zip(schema, x.split('|'))), updates), key=itemgetter("type", "name")) - for plugin in upgradable: - filename = plugin['name'] - prefix = plugin['type'] - version = plugin['version'] - - if filename.endswith(".pyc"): - name = filename[:filename.find("_")] - else: - name = filename.replace(".py", "") - - #@TODO: obsolete after 0.4.10 - if prefix.endswith("s"): - type = prefix[:-1] - else: - type = prefix - - plugins = getattr(self.core.pluginManager, "%sPlugins" % type) - - oldver = float(plugins[name]['v']) if name in plugins else None - newver = float(version) - - if not oldver: - msg = "New [%(type)s] %(name)s (v%(newver)s)" - elif newver > oldver: - msg = "New version of [%(type)s] %(name)s (v%(oldver)s -> v%(newver)s)" - else: - continue - - self.logInfo(_(msg) % { - 'type': type, - 'name': name, - 'oldver': oldver, - 'newver': newver, - }) - - try: - content = getURL(url % plugin) - m = vre.search(content) - if m and m.group(2) == version: - f = open(safe_join("userplugins", prefix, filename), "wb") - f.write(content) - f.close() - updated.append((prefix, name)) - else: - raise Exception, _("Version mismatch") - except Exception, e: - self.logError(_("Error updating plugin %s") % filename, str(e)) - - if blacklist: - blacklisted = sorted(map(lambda x: (x.split('|')[0], x.split('|')[1].rsplit('.', 1)[0]), blacklist)) - - # Always protect UpdateManager from self-removing - try: - blacklisted.remove(("hook", "UpdateManager")) - except: - pass - - removed = self.removePlugins(blacklisted) - for t, n in removed: - self.logInfo(_("Removed blacklisted plugin [%(type)s] %(name)s") % { - 'type': t, - 'name': n, - }) - - if updated: - reloaded = self.core.pluginManager.reloadPlugins(updated) - if reloaded: - self.logInfo(_("Plugins updated and reloaded")) - exitcode = 1 - else: - self.logInfo(_("*** Plugins have been updated, but need a pyLoad restart to be reloaded ***")) - self.info['plugins'] = True - exitcode = 2 - else: - self.logInfo(_("No plugin updates available")) - exitcode = 0 - - return exitcode #: 0 = No plugins updated; 1 = Plugins updated; 2 = Plugins updated, but restart required - - @Expose - def removePlugins(self, type_plugins): - """ delete plugins from disk """ - - if not type_plugins: - return - - self.logDebug("Request deletion of plugins: %s" % type_plugins) - - removed = [] - - for type, name in type_plugins: - err = False - file = name + ".py" - - for root in ("userplugins", path.join(pypath, "module", "plugins")): - - filename = safe_join(root, type, file) - try: - remove(filename) - except Exception, e: - self.logDebug("Error deleting \"%s\"" % path.basename(filename), str(e)) - err = True - - filename += "c" - if path.isfile(filename): - try: - if type == "hook": - self.manager.deactivateHook(name) - remove(filename) - except Exception, e: - self.logDebug("Error deleting \"%s\"" % path.basename(filename), str(e)) - err = True - - if not err: - id = (type, name) - removed.append(id) - - return removed #: return a list of the plugins successfully removed diff --git a/module/plugins/hooks/WindowsPhoneToastNotify.py b/module/plugins/hooks/WindowsPhoneToastNotify.py deleted file mode 100644 index 01570b966..000000000 --- a/module/plugins/hooks/WindowsPhoneToastNotify.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- - -import httplib -import time - -from module.plugins.Hook import Hook - - -class WindowsPhoneToastNotify(Hook): - __name__ = "WindowsPhoneToastNotify" - __type__ = "hook" - __version__ = "0.02" - - __config__ = [("activated", "bool", "Activated", False), - ("force", "bool", "Force even if client is connected", False), - ("pushId", "str", "pushId", ""), - ("pushUrl", "str", "pushUrl", ""), - ("pushTimeout", "int", "Timeout between notifications in seconds", 0)] - - __description__ = """Send push notifications to Windows Phone""" - __author_name__ = "Andy Voigt" - __author_mail__ = "phone-support@hotmail.de" - - - def setup(self): - self.info = {} - - def getXmlData(self): - myxml = (" " - " Pyload Mobile Captcha waiting! " - " ") - return myxml - - def doRequest(self): - URL = self.getConfig("pushUrl") - request = self.getXmlData() - webservice = httplib.HTTP(URL) - webservice.putrequest("POST", self.getConfig("pushId")) - webservice.putheader("Host", URL) - webservice.putheader("Content-type", "text/xml") - webservice.putheader("X-NotificationClass", "2") - webservice.putheader("X-WindowsPhone-Target", "toast") - webservice.putheader("Content-length", "%d" % len(request)) - webservice.endheaders() - webservice.send(request) - webservice.close() - self.setStorage("LAST_NOTIFY", time.time()) - - def newCaptchaTask(self, task): - if not self.getConfig("pushId") or not self.getConfig("pushUrl"): - return False - - if self.core.isClientConnected() and not self.getConfig("force"): - return False - - if (time.time() - float(self.getStorage("LAST_NOTIFY", 0))) < self.getConf("pushTimeout"): - return False - - self.doRequest() diff --git a/module/plugins/hooks/XFileSharingPro.py b/module/plugins/hooks/XFileSharingPro.py deleted file mode 100644 index eb0376921..000000000 --- a/module/plugins/hooks/XFileSharingPro.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.Hook import Hook - - -class XFileSharingPro(Hook): - __name__ = "XFileSharingPro" - __type__ = "hook" - __version__ = "0.11" - - __config__ = [("activated", "bool", "Activated", True), - ("loadDefault", "bool", "Include default (built-in) hoster list", True), - ("includeList", "str", "Include hosters (comma separated)", ""), - ("excludeList", "str", "Exclude hosters (comma separated)", "")] - - __description__ = """XFileSharingPro hook plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - - def coreReady(self): - self.loadPattern() - - def loadPattern(self): - hosterList = self.getConfigSet('includeList') - excludeList = self.getConfigSet('excludeList') - - if self.getConfig('loadDefault'): - hosterList |= set(( - #WORKING HOSTERS: - "aieshare.com", "asixfiles.com", "banashare.com", "cyberlocker.ch", "eyesfile.co", "eyesfile.com", - "fileband.com", "filedwon.com", "filedownloads.org", "hipfile.com", "kingsupload.com", "mlfat4arab.com", - "netuploaded.com", "odsiebie.pl", "q4share.com", "ravishare.com", "uptobox.com", "verzend.be", - "xvidstage.com", "thefile.me", "sharesix.com", "hostingbulk.com", - #NOT TESTED: - "bebasupload.com", "boosterking.com", "divxme.com", "filevelocity.com", "glumbouploads.com", - "grupload.com", "heftyfile.com", "host4desi.com", "laoupload.com", "linkzhost.com", "movreel.com", - "rockdizfile.com", "limfile.com", "share76.com", "sharebeast.com", "sharehut.com", "sharerun.com", - "shareswift.com", "sharingonline.com", "6ybh-upload.com", "skipfile.com", "spaadyshare.com", - "space4file.com", "uploadbaz.com", "uploadc.com", "uploaddot.com", "uploadfloor.com", "uploadic.com", - "uploadville.com", "vidbull.com", "zalaa.com", "zomgupload.com", "kupload.org", "movbay.org", - "multishare.org", "omegave.org", "toucansharing.org", "uflinq.org", "banicrazy.info", "flowhot.info", - "upbrasil.info", "shareyourfilez.biz", "bzlink.us", "cloudcache.cc", "fileserver.cc", "farshare.to", - "filemaze.ws", "filehost.ws", "filestock.ru", "moidisk.ru", "4up.im", "100shared.com", "sharesix.com", - "thefile.me", "filenuke.com", "sharerepo.com", "mightyupload.com", - #WRONG FILE NAME: - "sendmyway.com", "upchi.co.il", - #NOT WORKING: - "amonshare.com", "imageporter.com", "file4safe.com", - #DOWN OR BROKEN: - "ddlanime.com", "fileforth.com", "loombo.com", "goldfile.eu", "putshare.com" - )) - - hosterList -= (excludeList) - hosterList -= set(('', u'')) - - if not hosterList: - self.unload() - return - - regexp = r"http://(?:[^/]*\.)?(%s)/\w{12}" % ("|".join(sorted(hosterList)).replace('.', '\.')) - #self.logDebug(regexp) - - dict = self.core.pluginManager.hosterPlugins['XFileSharingPro'] - dict['pattern'] = regexp - dict['re'] = re.compile(regexp) - self.logDebug("Pattern loaded - handling %d hosters" % len(hosterList)) - - def getConfigSet(self, option): - s = self.getConfig(option).lower().replace('|', ',').replace(';', ',') - return set([x.strip() for x in s.split(',')]) - - def unload(self): - dict = self.core.pluginManager.hosterPlugins['XFileSharingPro'] - dict['pattern'] = r'^unmatchable$' - dict['re'] = re.compile(r'^unmatchable$') diff --git a/module/plugins/hooks/XMPPInterface.py b/module/plugins/hooks/XMPPInterface.py deleted file mode 100644 index c4a94a8bc..000000000 --- a/module/plugins/hooks/XMPPInterface.py +++ /dev/null @@ -1,233 +0,0 @@ -# -*- coding: utf-8 -*- - -from pyxmpp import streamtls -from pyxmpp.all import JID, Message -from pyxmpp.interface import implements -from pyxmpp.interfaces import * -from pyxmpp.jabber.client import JabberClient - -from module.plugins.hooks.IRCInterface import IRCInterface - - -class XMPPInterface(IRCInterface, JabberClient): - __name__ = "XMPPInterface" - __type__ = "hook" - __version__ = "0.11" - - __config__ = [("activated", "bool", "Activated", False), - ("jid", "str", "Jabber ID", "user@exmaple-jabber-server.org"), - ("pw", "str", "Password", ""), - ("tls", "bool", "Use TLS", False), - ("owners", "str", "List of JIDs accepting commands from", "me@icq-gateway.org;some@msn-gateway.org"), - ("info_file", "bool", "Inform about every file finished", False), - ("info_pack", "bool", "Inform about every package finished", True), - ("captcha", "bool", "Send captcha requests", True)] - - __description__ = """Connect to jabber and let owner perform different tasks""" - __author_name__ = "RaNaN" - __author_mail__ = "RaNaN@pyload.org" - - - implements(IMessageHandlersProvider) - - def __init__(self, core, manager): - IRCInterface.__init__(self, core, manager) - - self.jid = JID(self.getConfig("jid")) - password = self.getConfig("pw") - - # if bare JID is provided add a resource -- it is required - if not self.jid.resource: - self.jid = JID(self.jid.node, self.jid.domain, "pyLoad") - - if self.getConfig("tls"): - tls_settings = streamtls.TLSSettings(require=True, verify_peer=False) - auth = ("sasl:PLAIN", "sasl:DIGEST-MD5") - else: - tls_settings = None - auth = ("sasl:DIGEST-MD5", "digest") - - # setup client with provided connection information - # and identity data - JabberClient.__init__(self, self.jid, password, - disco_name="pyLoad XMPP Client", disco_type="bot", - tls_settings=tls_settings, auth_methods=auth) - - self.interface_providers = [ - VersionHandler(self), - self, - ] - - def coreReady(self): - self.new_package = {} - - self.start() - - def packageFinished(self, pypack): - try: - if self.getConfig("info_pack"): - self.announce(_("Package finished: %s") % pypack.name) - except: - pass - - def downloadFinished(self, pyfile): - try: - if self.getConfig("info_file"): - self.announce( - _("Download finished: %(name)s @ %(plugin)s") % {"name": pyfile.name, "plugin": pyfile.pluginname}) - except: - pass - - def run(self): - # connect to IRC etc. - self.connect() - try: - self.loop() - except Exception, ex: - self.logError("pyLoad XMPP: %s" % str(ex)) - - def stream_state_changed(self, state, arg): - """This one is called when the state of stream connecting the component - to a server changes. This will usually be used to let the user - know what is going on.""" - self.logDebug("pyLoad XMPP: *** State changed: %s %r ***" % (state, arg)) - - def disconnected(self): - self.logDebug("pyLoad XMPP: Client was disconnected") - - def stream_closed(self, stream): - self.logDebug("pyLoad XMPP: Stream was closed | %s" % stream) - - def stream_error(self, err): - self.logDebug("pyLoad XMPP: Stream Error: %s" % err) - - def get_message_handlers(self): - """Return list of (message_type, message_handler) tuples. - - The handlers returned will be called when matching message is received - in a client session.""" - return [("normal", self.message)] - - def message(self, stanza): - """Message handler for the component.""" - subject = stanza.get_subject() - body = stanza.get_body() - t = stanza.get_type() - self.logDebug(u'pyLoad XMPP: Message from %s received.' % (unicode(stanza.get_from(),))) - self.logDebug(u'pyLoad XMPP: Body: %s Subject: %s Type: %s' % (body, subject, t)) - - if t == "headline": - # 'headline' messages should never be replied to - return True - if subject: - subject = u"Re: " + subject - - to_jid = stanza.get_from() - from_jid = stanza.get_to() - - #j = JID() - to_name = to_jid.as_utf8() - from_name = from_jid.as_utf8() - - names = self.getConfig("owners").split(";") - - if to_name in names or to_jid.node + "@" + to_jid.domain in names: - messages = [] - - trigger = "pass" - args = None - - try: - temp = body.split() - trigger = temp[0] - if len(temp) > 1: - args = temp[1:] - except: - pass - - handler = getattr(self, "event_%s" % trigger, self.event_pass) - try: - res = handler(args) - for line in res: - m = Message( - to_jid=to_jid, - from_jid=from_jid, - stanza_type=stanza.get_type(), - subject=subject, - body=line) - - messages.append(m) - except Exception, e: - self.logError("pyLoad XMPP: " + repr(e)) - - return messages - - else: - return True - - def response(self, msg, origin=""): - return self.announce(msg) - - def announce(self, message): - """ send message to all owners""" - for user in self.getConfig("owners").split(";"): - self.logDebug("pyLoad XMPP: Send message to %s" % user) - - to_jid = JID(user) - - m = Message(from_jid=self.jid, - to_jid=to_jid, - stanza_type="chat", - body=message) - - stream = self.get_stream() - if not stream: - self.connect() - stream = self.get_stream() - - stream.send(m) - - def beforeReconnecting(self, ip): - self.disconnect() - - def afterReconnecting(self, ip): - self.connect() - - -class VersionHandler(object): - """Provides handler for a version query. - - This class will answer version query and announce 'jabber:iq:version' namespace - in the client's disco#info results.""" - - implements(IIqHandlersProvider, IFeaturesProvider) - - def __init__(self, client): - """Just remember who created this.""" - self.client = client - - def get_features(self): - """Return namespace which should the client include in its reply to a - disco#info query.""" - return ["jabber:iq:version"] - - def get_iq_get_handlers(self): - """Return list of tuples (element_name, namespace, handler) describing - handlers of stanzas""" - return [("query", "jabber:iq:version", self.get_version)] - - def get_iq_set_handlers(self): - """Return empty list, as this class provides no stanza handler.""" - return [] - - def get_version(self, iq): - """Handler for jabber:iq:version queries. - - jabber:iq:version queries are not supported directly by PyXMPP, so the - XML node is accessed directly through the libxml2 API. This should be - used very carefully!""" - iq = iq.make_result_response() - q = iq.new_query("jabber:iq:version") - q.newTextChild(q.ns(), "name", "Echo component") - q.newTextChild(q.ns(), "version", "1.0") - return iq diff --git a/module/plugins/hooks/ZeveraCom.py b/module/plugins/hooks/ZeveraCom.py deleted file mode 100644 index 0d5e23118..000000000 --- a/module/plugins/hooks/ZeveraCom.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.network.RequestFactory import getURL -from module.plugins.internal.MultiHoster import MultiHoster - - -class ZeveraCom(MultiHoster): - __name__ = "ZeveraCom" - __type__ = "hook" - __version__ = "0.02" - - __config__ = [("activated", "bool", "Activated", False), - ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), - ("hosterList", "str", "Hoster list (comma separated)", "")] - - __description__ = """Real-Debrid.com hook plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - - def getHoster(self): - page = getURL("http://www.zevera.com/jDownloader.ashx?cmd=gethosters") - return [x.strip() for x in page.replace("\"", "").split(",")] diff --git a/module/plugins/hooks/__init__.py b/module/plugins/hooks/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/module/plugins/hoster/AlldebridCom.py b/module/plugins/hoster/AlldebridCom.py deleted file mode 100644 index 7201f1929..000000000 --- a/module/plugins/hoster/AlldebridCom.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from random import randrange -from urllib import unquote - -from module.common.json_layer import json_loads -from module.plugins.Hoster import Hoster -from module.utils import parseFileSize - - -class AlldebridCom(Hoster): - __name__ = "AlldebridCom" - __type__ = "hoster" - __version__ = "0.34" - - __pattern__ = r'https?://(?:[^/]*\.)?alldebrid\..*' - - __description__ = """Alldebrid.com hoster plugin""" - __author_name__ = "Andy Voigt" - __author_mail__ = "spamsales@online.de" - - - def getFilename(self, url): - try: - name = unquote(url.rsplit("/", 1)[1]) - except IndexError: - name = "Unknown_Filename..." - if name.endswith("..."): # incomplete filename, append random stuff - name += "%s.tmp" % randrange(100, 999) - return name - - def setup(self): - self.chunkLimit = 16 - self.resumeDownload = True - - def process(self, pyfile): - if re.match(self.__pattern__, pyfile.url): - new_url = pyfile.url - elif not self.account: - self.logError(_("Please enter your %s account or deactivate this plugin") % "AllDebrid") - self.fail("No AllDebrid account provided") - else: - self.logDebug("Old URL: %s" % pyfile.url) - password = self.getPassword().splitlines() - password = "" if not password else password[0] - - url = "http://www.alldebrid.com/service.php?link=%s&json=true&pw=%s" % (pyfile.url, password) - page = self.load(url) - data = json_loads(page) - - self.logDebug("Json data: %s" % str(data)) - - if data['error']: - if data['error'] == "This link isn't available on the hoster website.": - self.offline() - else: - self.logWarning(data['error']) - self.tempOffline() - else: - if pyfile.name and not pyfile.name.endswith('.tmp'): - pyfile.name = data['filename'] - pyfile.size = parseFileSize(data['filesize']) - new_url = data['link'] - - if self.getConfig("https"): - new_url = new_url.replace("http://", "https://") - else: - new_url = new_url.replace("https://", "http://") - - if new_url != pyfile.url: - self.logDebug("New URL: %s" % new_url) - - if pyfile.name.startswith("http") or pyfile.name.startswith("Unknown"): - #only use when name wasnt already set - pyfile.name = self.getFilename(new_url) - - self.download(new_url, disposition=True) - - check = self.checkDownload({"error": "An error occured while processing your request", - "empty": re.compile(r"^$")}) - - if check == "error": - self.retry(wait_time=60, reason="An error occured while generating link.") - elif check == "empty": - self.retry(wait_time=60, reason="Downloaded File was empty.") diff --git a/module/plugins/hoster/BasePlugin.py b/module/plugins/hoster/BasePlugin.py deleted file mode 100644 index 54d789054..000000000 --- a/module/plugins/hoster/BasePlugin.py +++ /dev/null @@ -1,116 +0,0 @@ -# -*- coding: utf-8 -*- - -from re import match, search -from urllib import unquote -from urlparse import urlparse - -from module.network.HTTPRequest import BadHeader -from module.plugins.Hoster import Hoster -from module.utils import html_unescape, remove_chars - - -class BasePlugin(Hoster): - __name__ = "BasePlugin" - __type__ = "hoster" - __version__ = "0.20" - - __pattern__ = r'^unmatchable$' - - __description__ = """Base Plugin when any other didnt fit""" - __author_name__ = "RaNaN" - __author_mail__ = "RaNaN@pyload.org" - - - def setup(self): - self.chunkLimit = -1 - self.resumeDownload = True - - def process(self, pyfile): - """main function""" - - #debug part, for api exerciser - if pyfile.url.startswith("DEBUG_API"): - self.multiDL = False - return - - # self.__name__ = "NetloadIn" - # pyfile.name = "test" - # self.html = self.load("http://localhost:9000/short") - # self.download("http://localhost:9000/short") - # self.api = self.load("http://localhost:9000/short") - # self.decryptCaptcha("http://localhost:9000/captcha") - # - # if pyfile.url == "79": - # self.core.api.addPackage("test", [str(i) for i in xrange(80)], 1) - # - # return - if pyfile.url.startswith("http"): - - try: - self.downloadFile(pyfile) - except BadHeader, e: - if e.code in (401, 403): - self.logDebug("Auth required") - - account = self.core.accountManager.getAccountPlugin('Http') - servers = [x['login'] for x in account.getAllAccounts()] - server = urlparse(pyfile.url).netloc - - if server in servers: - self.logDebug("Logging on to %s" % server) - self.req.addAuth(account.accounts[server]['password']) - else: - for pwd in pyfile.package().password.splitlines(): - if ":" in pwd: - self.req.addAuth(pwd.strip()) - break - else: - self.fail(_("Authorization required (username:password)")) - - self.downloadFile(pyfile) - else: - raise - - else: - self.fail("No Plugin matched and not a downloadable url.") - - def downloadFile(self, pyfile): - url = pyfile.url - - for _ in xrange(5): - header = self.load(url, just_header=True) - - # self.load does not raise a BadHeader on 404 responses, do it here - if 'code' in header and header['code'] == 404: - raise BadHeader(404) - - if 'location' in header: - self.logDebug("Location: " + header['location']) - base = match(r'https?://[^/]+', url).group(0) - if header['location'].startswith("http"): - url = header['location'] - elif header['location'].startswith("/"): - url = base + unquote(header['location']) - else: - url = '%s/%s' % (base, unquote(header['location'])) - else: - break - - name = html_unescape(unquote(urlparse(url).path.split("/")[-1])) - - if 'content-disposition' in header: - self.logDebug("Content-Disposition: " + header['content-disposition']) - m = search("filename(?P=|\*=(?P.+)'')(?P.*)", header['content-disposition']) - if m: - disp = m.groupdict() - self.logDebug(disp) - if not disp['enc']: - disp['enc'] = 'utf-8' - name = remove_chars(disp['name'], "\"';").strip() - name = unicode(unquote(name), disp['enc']) - - if not name: - name = url - pyfile.name = name - self.logDebug("Filename: %s" % pyfile.name) - self.download(url, disposition=True) diff --git a/module/plugins/hoster/BayfilesCom.py b/module/plugins/hoster/BayfilesCom.py deleted file mode 100644 index dc7e8cbf0..000000000 --- a/module/plugins/hoster/BayfilesCom.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from time import time - -from module.common.json_layer import json_loads -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class BayfilesCom(SimpleHoster): - __name__ = "BayfilesCom" - __type__ = "hoster" - __version__ = "0.07" - - __pattern__ = r'https?://(?:www\.)?bayfiles\.(com|net)/file/(?P[a-zA-Z0-9]+/[a-zA-Z0-9]+/[^/]+)' - - __description__ = """Bayfiles.com hoster plugin""" - __author_name__ = ("zoidberg", "Walter Purcaro") - __author_mail__ = ("zoidberg@mujmail.cz", "vuolter@gmail.com") - - FILE_INFO_PATTERN = r'

    [^<]*(?P[0-9., ]+)(?P[kKMG])i?B

    ' - OFFLINE_PATTERN = r'(

    The requested file could not be found.

    |404 Not Found)' - - WAIT_PATTERN = r'>Your IP [0-9.]* has recently downloaded a file\. Upgrade to premium or wait (\d+) minutes\.<' - VARS_PATTERN = r'var vfid = (\d+);\s*var delay = (\d+);' - FREE_LINK_PATTERN = r"javascript:window.location.href = '([^']+)';" - PREMIUM_LINK_PATTERN = r'(?:BayFiles"), - "notfound": re.compile(r"404 Not Found") - }) - if check == "waitforfreeslots": - self.retry(30, 5 * 60, "Wait for free slot") - elif check == "notfound": - self.retry(30, 5 * 60, "404 Not found") - - -getInfo = create_getInfo(BayfilesCom) diff --git a/module/plugins/hoster/BezvadataCz.py b/module/plugins/hoster/BezvadataCz.py deleted file mode 100644 index 7156db473..000000000 --- a/module/plugins/hoster/BezvadataCz.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class BezvadataCz(SimpleHoster): - __name__ = "BezvadataCz" - __type__ = "hoster" - __version__ = "0.24" - - __pattern__ = r'http://(?:www\.)?bezvadata.cz/stahnout/.*' - - __description__ = """BezvaData.cz hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FILE_NAME_PATTERN = r'

    Soubor: (?P[^<]+)

    ' - FILE_SIZE_PATTERN = r'
  • Velikost: (?P[^<]+)
  • ' - OFFLINE_PATTERN = r'BezvaData \| Soubor nenalezen' - - - def setup(self): - self.multiDL = self.resumeDownload = True - - def handleFree(self): - #download button - m = re.search(r'
    ', self.html) - if m is None: - self.parseError("page2 URL") - url = "http://bezvadata.cz%s" % m.group(1) - self.logDebug("DL URL %s" % url) - - #countdown - m = re.search(r'id="countdown">(\d\d):(\d\d)<', self.html) - wait_time = (int(m.group(1)) * 60 + int(m.group(2)) + 1) if m else 120 - self.wait(wait_time, False) - - self.download(url) - - def checkErrors(self): - if 'images/button-download-disable.png' in self.html: - self.longWait(5 * 60, 24) # parallel dl limit - elif '
    Filename:(?P.*?)
    ' - FILE_SIZE_PATTERN = r'Size:(?P.*?)
    ' - - -getInfo = create_getInfo(BillionuploadsCom) diff --git a/module/plugins/hoster/BitshareCom.py b/module/plugins/hoster/BitshareCom.py deleted file mode 100644 index 3c84ce5da..000000000 --- a/module/plugins/hoster/BitshareCom.py +++ /dev/null @@ -1,151 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -import re - -from module.plugins.internal.CaptchaService import ReCaptcha -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class BitshareCom(SimpleHoster): - __name__ = "BitshareCom" - __type__ = "hoster" - __version__ = "0.50" - - __pattern__ = r'http://(?:www\.)?bitshare\.com/(files/(?P[a-zA-Z0-9]+)(/(?P.*?)\.html)?|\?f=(?P[a-zA-Z0-9]+))' - - __description__ = """Bitshare.com hoster plugin""" - __author_name__ = ("Paul King", "fragonib") - __author_mail__ = ("", "fragonib[AT]yahoo[DOT]es") - - FILE_INFO_PATTERN = r'Downloading (?P.+) - (?P[\d.]+) (?P\w+)' - OFFLINE_PATTERN = r'(>We are sorry, but the requested file was not found in our database|>Error - File not available<|The file was deleted either by the uploader, inactivity or due to copyright claim)' - - FILE_AJAXID_PATTERN = r'var ajaxdl = "(.*?)";' - CAPTCHA_KEY_PATTERN = r'http://api\.recaptcha\.net/challenge\?k=(.*?) ' - TRAFFIC_USED_UP = r'Your Traffic is used up for today. Upgrade to premium to continue!' - - - def setup(self): - self.req.cj.setCookie(".bitshare.com", "language_selection", "EN") - self.multiDL = self.premium - self.chunkLimit = 1 - - def process(self, pyfile): - if self.premium: - self.account.relogin(self.user) - - self.pyfile = pyfile - - # File id - m = re.match(self.__pattern__, pyfile.url) - self.file_id = max(m.group('id1'), m.group('id2')) - self.logDebug("File id is [%s]" % self.file_id) - - # Load main page - self.html = self.load(pyfile.url, ref=False, decode=True) - - # Check offline - if re.search(self.OFFLINE_PATTERN, self.html): - self.offline() - - # Check Traffic used up - if re.search(self.TRAFFIC_USED_UP, self.html): - self.logInfo("Your Traffic is used up for today") - self.wait(30 * 60, True) - self.retry() - - # File name - m = re.match(self.__pattern__, pyfile.url) - name1 = m.group('name') if m else None - m = re.search(self.FILE_INFO_PATTERN, self.html) - name2 = m.group('N') if m else None - pyfile.name = max(name1, name2) - - # Ajax file id - self.ajaxid = re.search(self.FILE_AJAXID_PATTERN, self.html).group(1) - self.logDebug("File ajax id is [%s]" % self.ajaxid) - - # This may either download our file or forward us to an error page - url = self.getDownloadUrl() - self.logDebug("Downloading file with url [%s]" % url) - self.download(url) - - check = self.checkDownload({"404": ">404 Not Found<", "Error": ">Error occured<"}) - if check == "404": - self.retry(3, 60, 'Error 404') - elif check == "error": - self.retry(5, 5 * 60, "Bitshare host : Error occured") - - def getDownloadUrl(self): - # Return location if direct download is active - if self.premium: - header = self.load(self.pyfile.url, cookies=True, just_header=True) - if 'location' in header: - return header['location'] - - # Get download info - self.logDebug("Getting download info") - response = self.load("http://bitshare.com/files-ajax/" + self.file_id + "/request.html", - post={"request": "generateID", "ajaxid": self.ajaxid}) - self.handleErrors(response, ':') - parts = response.split(":") - filetype = parts[0] - wait = int(parts[1]) - captcha = int(parts[2]) - self.logDebug("Download info [type: '%s', waiting: %d, captcha: %d]" % (filetype, wait, captcha)) - - # Waiting - if wait > 0: - self.logDebug("Waiting %d seconds." % wait) - if wait < 120: - self.wait(wait, False) - else: - self.wait(wait - 55, True) - self.retry() - - # Resolve captcha - if captcha == 1: - self.logDebug("File is captcha protected") - id = re.search(self.CAPTCHA_KEY_PATTERN, self.html).group(1) - # Try up to 3 times - for i in xrange(3): - self.logDebug("Resolving ReCaptcha with key [%s], round %d" % (id, i + 1)) - recaptcha = ReCaptcha(self) - challenge, code = recaptcha.challenge(id) - response = self.load("http://bitshare.com/files-ajax/" + self.file_id + "/request.html", - post={"request": "validateCaptcha", "ajaxid": self.ajaxid, - "recaptcha_challenge_field": challenge, "recaptcha_response_field": code}) - if self.handleCaptchaErrors(response): - break - - # Get download URL - self.logDebug("Getting download url") - response = self.load("http://bitshare.com/files-ajax/" + self.file_id + "/request.html", - post={"request": "getDownloadURL", "ajaxid": self.ajaxid}) - self.handleErrors(response, '#') - url = response.split("#")[-1] - - return url - - def handleErrors(self, response, separator): - self.logDebug("Checking response [%s]" % response) - if "ERROR:Session timed out" in response: - self.retry() - elif "ERROR" in response: - msg = response.split(separator)[-1] - self.fail(msg) - - def handleCaptchaErrors(self, response): - self.logDebug("Result of captcha resolving [%s]" % response) - if "SUCCESS" in response: - self.correctCaptcha() - return True - elif "ERROR:SESSION ERROR" in response: - self.retry() - self.logDebug("Wrong captcha") - self.invalidCaptcha() - - -getInfo = create_getInfo(BitshareCom) diff --git a/module/plugins/hoster/BoltsharingCom.py b/module/plugins/hoster/BoltsharingCom.py deleted file mode 100644 index d038c50ca..000000000 --- a/module/plugins/hoster/BoltsharingCom.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class BoltsharingCom(DeadHoster): - __name__ = "BoltsharingCom" - __type__ = "hoster" - __version__ = "0.02" - - __pattern__ = r'http://(?:www\.)?boltsharing.com/\w{12}' - - __description__ = """Boltsharing.com hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - -getInfo = create_getInfo(BoltsharingCom) diff --git a/module/plugins/hoster/CatShareNet.py b/module/plugins/hoster/CatShareNet.py deleted file mode 100644 index 4bbdfce89..000000000 --- a/module/plugins/hoster/CatShareNet.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.CaptchaService import ReCaptcha -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class CatShareNet(SimpleHoster): - __name__ = "CatShareNet" - __type__ = "hoster" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?catshare.net/\w{16}.*' - - __description__ = """CatShare.net hoster plugin""" - __author_name__ = "z00nx" - __author_mail__ = "z00nx0@gmail.com" - - FILE_INFO_PATTERN = r'

    ]+>(?P.*)

    \s+

    ]+>(?P.*)

    ' - OFFLINE_PATTERN = r'Podany plik zosta' - - SECONDS_PATTERN = r'var\s+count\s+=\s+(\d+);' - - RECAPTCHA_KEY = "6Lfln9kSAAAAANZ9JtHSOgxUPB9qfDFeLUI_QMEy" - - - def handleFree(self): - m = re.search(self.SECONDS_PATTERN, self.html) - seconds = int(m.group(1)) - self.logDebug("Seconds found", seconds) - self.wait(seconds + 1) - recaptcha = ReCaptcha(self) - challenge, code = recaptcha.challenge(self.RECAPTCHA_KEY) - post_data = {"recaptcha_challenge_field": challenge, "recaptcha_response_field": code} - self.download(self.pyfile.url, post=post_data) - check = self.checkDownload({"html": re.compile("\A\s*(?P.*?).*?\s*\((?P.*?)\)' - LINK_PATTERN = r'href="(http://cramit.in/file_download/.*?)"' - - - def setup(self): - self.resumeDownload = self.multiDL = self.premium - - -getInfo = create_getInfo(CramitIn) diff --git a/module/plugins/hoster/CrockoCom.py b/module/plugins/hoster/CrockoCom.py deleted file mode 100644 index 80d9b3d61..000000000 --- a/module/plugins/hoster/CrockoCom.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.CaptchaService import ReCaptcha -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class CrockoCom(SimpleHoster): - __name__ = "CrockoCom" - __type__ = "hoster" - __version__ = "0.16" - - __pattern__ = r'http://(?:www\.)?(crocko|easy-share).com/\w+' - - __description__ = """Crocko hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FILE_NAME_PATTERN = r'Download:\s*(?P.*)' - FILE_SIZE_PATTERN = r'(?P[^<]+)' - OFFLINE_PATTERN = r"

    Sorry,
    the page you're looking for
    isn't here.

    |File not found" - - CAPTCHA_URL_PATTERN = re.compile(r"u='(/file_contents/captcha/\w+)';\s*w='(\d+)';") - CAPTCHA_KEY_PATTERN = re.compile(r'Recaptcha.create\("([^"]+)"') - - FORM_PATTERN = r'(.*?)' - FORM_INPUT_PATTERN = r']* name="?([^" ]+)"? value="?([^" ]+)"?[^>]*>' - - FILE_NAME_REPLACEMENTS = [(r'<[^>]*>', '')] - - - def handleFree(self): - if "You need Premium membership to download this file." in self.html: - self.fail("You need Premium membership to download this file.") - - for _ in xrange(5): - m = re.search(self.CAPTCHA_URL_PATTERN, self.html) - if m: - url, wait_time = 'http://crocko.com' + m.group(1), m.group(2) - self.wait(wait_time) - self.html = self.load(url) - else: - break - - m = re.search(self.CAPTCHA_KEY_PATTERN, self.html) - if m is None: - self.parseError('Captcha KEY') - captcha_key = m.group(1) - - m = re.search(self.FORM_PATTERN, self.html, re.DOTALL) - if m is None: - self.parseError('ACTION') - action, form = m.groups() - inputs = dict(re.findall(self.FORM_INPUT_PATTERN, form)) - - recaptcha = ReCaptcha(self) - - for _ in xrange(5): - inputs['recaptcha_challenge_field'], inputs['recaptcha_response_field'] = recaptcha.challenge(captcha_key) - self.download(action, post=inputs) - - check = self.checkDownload({ - "captcha_err": self.CAPTCHA_KEY_PATTERN - }) - - if check == "captcha_err": - self.invalidCaptcha() - else: - break - else: - self.fail('No valid captcha solution received') - - -getInfo = create_getInfo(CrockoCom) diff --git a/module/plugins/hoster/CyberlockerCh.py b/module/plugins/hoster/CyberlockerCh.py deleted file mode 100644 index bfab72b7c..000000000 --- a/module/plugins/hoster/CyberlockerCh.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class CyberlockerCh(DeadHoster): - __name__ = "CyberlockerCh" - __type__ = "hoster" - __version__ = "0.02" - - __pattern__ = r'http://(?:www\.)?cyberlocker\.ch/\w+' - - __description__ = """Cyberlocker.ch hoster plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - -getInfo = create_getInfo(CyberlockerCh) diff --git a/module/plugins/hoster/CzshareCom.py b/module/plugins/hoster/CzshareCom.py deleted file mode 100644 index 4f581651b..000000000 --- a/module/plugins/hoster/CzshareCom.py +++ /dev/null @@ -1,148 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Test links: -# http://czshare.com/5278880/random.bin - -import re - -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo -from module.utils import parseFileSize - - -class CzshareCom(SimpleHoster): - __name__ = "CzshareCom" - __type__ = "hoster" - __version__ = "0.94" - - __pattern__ = r'http://(?:www\.)?(czshare|sdilej)\.(com|cz)/(\d+/|download.php\?).*' - - __description__ = """CZshare.com hoster plugin, now Sdilej.cz""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FILE_NAME_PATTERN = r'
    \s*

    \s*Cel. n.zev: ]*>(?P[^<]+)' - FILE_SIZE_PATTERN = r'

    (?:\s*

    [^\n]*

    )*\s*Velikost:\s*(?P[0-9., ]+)(?P[kKMG])i?B\s*
    ' - OFFLINE_PATTERN = r'
    \s*

    ' - - FILE_SIZE_REPLACEMENTS = [(' ', '')] - FILE_URL_REPLACEMENTS = [(r'http://[^/]*/download.php\?.*?id=(\w+).*', r'http://sdilej.cz/\1/x/')] - - SH_CHECK_TRAFFIC = True - - FREE_URL_PATTERN = r'[^>]*alt="([^"]+)" />' - FREE_FORM_PATTERN = r'
    \s*(.*?)
    ' - PREMIUM_FORM_PATTERN = r'
    (.*?)
    ' - FORM_INPUT_PATTERN = r']* name="([^"]+)" value="([^"]+)"[^>]*/>' - MULTIDL_PATTERN = r"

    Z[^<]*PROFI.

    " - USER_CREDIT_PATTERN = r'
    \s*kredit: ([0-9., ]+)([kKMG]i?B)\s*
    ' - - - def checkTrafficLeft(self): - # check if user logged in - m = re.search(self.USER_CREDIT_PATTERN, self.html) - if m is None: - self.account.relogin(self.user) - self.html = self.load(self.pyfile.url, cookies=True, decode=True) - m = re.search(self.USER_CREDIT_PATTERN, self.html) - if m is None: - return False - - # check user credit - try: - credit = parseFileSize(m.group(1).replace(' ', ''), m.group(2)) - self.logInfo("Premium download for %i KiB of Credit" % (self.pyfile.size / 1024)) - self.logInfo("User %s has %i KiB left" % (self.user, credit / 1024)) - if credit < self.pyfile.size: - self.logInfo("Not enough credit to download file %s" % self.pyfile.name) - return False - except Exception, e: - # let's continue and see what happens... - self.logError('Parse error (CREDIT): %s' % e) - - return True - - def handlePremium(self): - # parse download link - try: - form = re.search(self.PREMIUM_FORM_PATTERN, self.html, re.DOTALL).group(1) - inputs = dict(re.findall(self.FORM_INPUT_PATTERN, form)) - except Exception, e: - self.logError("Parse error (FORM): %s" % e) - self.resetAccount() - - # download the file, destination is determined by pyLoad - self.download("http://sdilej.cz/profi_down.php", post=inputs, disposition=True) - self.checkDownloadedFile() - - def handleFree(self): - # get free url - m = re.search(self.FREE_URL_PATTERN, self.html) - if m is None: - self.parseError('Free URL') - parsed_url = "http://sdilej.cz" + m.group(1) - self.logDebug("PARSED_URL:" + parsed_url) - - # get download ticket and parse html - self.html = self.load(parsed_url, cookies=True, decode=True) - if re.search(self.MULTIDL_PATTERN, self.html): - self.longWait(5 * 60, 12) - - try: - form = re.search(self.FREE_FORM_PATTERN, self.html, re.DOTALL).group(1) - inputs = dict(re.findall(self.FORM_INPUT_PATTERN, form)) - self.pyfile.size = int(inputs['size']) - except Exception, e: - self.logError(e) - self.parseError('Form') - - # get and decrypt captcha - captcha_url = 'http://sdilej.cz/captcha.php' - for _ in xrange(5): - inputs['captchastring2'] = self.decryptCaptcha(captcha_url) - self.html = self.load(parsed_url, cookies=True, post=inputs, decode=True) - if u"
  • Zadaný ověřovací kód nesouhlasí!
  • " in self.html: - self.invalidCaptcha() - elif re.search(self.MULTIDL_PATTERN, self.html): - self.longWait(5 * 60, 12) - else: - self.correctCaptcha() - break - else: - self.fail("No valid captcha code entered") - - m = re.search("countdown_number = (\d+);", self.html) - self.setWait(int(m.group(1)) if m else 50) - - # download the file, destination is determined by pyLoad - self.logDebug("WAIT URL", self.req.lastEffectiveURL) - m = re.search("free_wait.php\?server=(.*?)&(.*)", self.req.lastEffectiveURL) - if m is None: - self.parseError('Download URL') - - url = "http://%s/download.php?%s" % (m.group(1), m.group(2)) - - self.wait() - self.download(url) - self.checkDownloadedFile() - - def checkDownloadedFile(self): - # check download - check = self.checkDownload({ - "tempoffline": re.compile(r"^Soubor je do.*asn.* nedostupn.*$"), - "credit": re.compile(r"^Nem.*te dostate.*n.* kredit.$"), - "multi_dl": re.compile(self.MULTIDL_PATTERN), - "captcha_err": "
  • Zadaný ověřovací kód nesouhlasí!
  • " - }) - - if check == "tempoffline": - self.fail("File not available - try later") - if check == "credit": - self.resetAccount() - elif check == "multi_dl": - self.longWait(5 * 60, 12) - elif check == "captcha_err": - self.invalidCaptcha() - self.retry() - - -getInfo = create_getInfo(CzshareCom) diff --git a/module/plugins/hoster/DailymotionCom.py b/module/plugins/hoster/DailymotionCom.py deleted file mode 100644 index 79b7acb45..000000000 --- a/module/plugins/hoster/DailymotionCom.py +++ /dev/null @@ -1,111 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.PyFile import statusMap -from module.common.json_layer import json_loads -from module.network.RequestFactory import getURL -from module.plugins.Hoster import Hoster - - -def getInfo(urls): - result = [] #: [ .. (name, size, status, url) .. ] - regex = re.compile(DailymotionCom.__pattern__) - apiurl = "https://api.dailymotion.com/video/" - request = {"fields": "access_error,status,title"} - for url in urls: - id = regex.search(url).group("ID") - page = getURL(apiurl + id, get=request) - info = json_loads(page) - - if "title" in info: - name = info['title'] + ".mp4" - else: - name = url - - if "error" in info or info['access_error']: - status = "offline" - else: - status = info['status'] - if status in ("ready", "published"): - status = "online" - elif status in ("waiting", "processing"): - status = "temp. offline" - else: - status = "offline" - - result.append((name, 0, statusMap[status], url)) - return result - - -class DailymotionCom(Hoster): - __name__ = "DailymotionCom" - __type__ = "hoster" - __version__ = "0.2" - - __pattern__ = r'https?://(?:www\.)?dailymotion\.com/.*?video/(?P[\w^_]+)' - __config__ = [("quality", "Lowest;LD 144p;LD 240p;SD 384p;HQ 480p;HD 720p;HD 1080p;Highest", "Quality", "Highest")] - - __description__ = """Dailymotion.com hoster plugin""" - __author_name__ = "Walter Purcaro" - __author_mail__ = "vuolter@gmail.com" - - - def setup(self): - self.resumeDownload = self.multiDL = True - - def getStreams(self): - streams = [] - for result in re.finditer(r"\"(?Phttp:\\/\\/www.dailymotion.com\\/cdn\\/H264-(?P.*?)\\.*?)\"", - self.html): - url = result.group("URL") - qf = result.group("QF") - link = url.replace("\\", "") - quality = tuple(int(x) for x in qf.split("x")) - streams.append((quality, link)) - return sorted(streams, key=lambda x: x[0][::-1]) - - def getQuality(self): - q = self.getConfig("quality") - if q == "Lowest": - quality = 0 - elif q == "Highest": - quality = -1 - else: - quality = int(q.rsplit(" ")[1][:-1]) - return quality - - def getLink(self, streams, quality): - if quality > 0: - for x, s in reversed([item for item in enumerate(streams)]): - qf = s[0][1] - if qf <= quality: - idx = x - break - else: - idx = 0 - else: - idx = quality - - s = streams[idx] - self.logInfo("Download video quality %sx%s" % s[0]) - return s[1] - - def checkInfo(self, pyfile): - pyfile.name, pyfile.size, pyfile.status, pyfile.url = getInfo([pyfile.url])[0] - if pyfile.status == 1: - self.offline() - elif pyfile.status == 6: - self.tempOffline() - - def process(self, pyfile): - self.checkInfo(pyfile) - - id = re.match(self.__pattern__, pyfile.url).group("ID") - self.html = self.load("http://www.dailymotion.com/embed/video/" + id, decode=True) - - streams = self.getStreams() - quality = self.getQuality() - link = self.getLink(streams, quality) - - self.download(link) diff --git a/module/plugins/hoster/DataHu.py b/module/plugins/hoster/DataHu.py deleted file mode 100644 index 3dc01eef3..000000000 --- a/module/plugins/hoster/DataHu.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Test links: -# http://data.hu/get/6381232/random.bin - -import re - -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class DataHu(SimpleHoster): - __name__ = "DataHu" - __type__ = "hoster" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?data.hu/get/\w+' - - __description__ = """Data.hu hoster plugin""" - __author_name__ = ("crash", "stickell") - __author_mail__ = "l.stickell@yahoo.it" - - FILE_INFO_PATTERN = ur'(?P<N>.*) \((?P<S>[^)]+)\) let\xf6lt\xe9se' - OFFLINE_PATTERN = ur'Az adott f\xe1jl nem l\xe9tezik' - LINK_PATTERN = r'

    Velikost(?P[^<]+)(?P.*?)\s*(?P.*?)Datei wurde nicht gefunden<|>Bitte wähle deine Datei aus... <' - PARALELL_PATTERN = r'>Du lädst bereits eine Datei herunter<' - - WAIT_PATTERN = r'countdown\({seconds: (\d+)' - DATA_PATTERN = r'url: "(.*?)", data: "(.*?)",' - RECAPTCHA_KEY_PATTERN = r'Recaptcha.create\("(.*?)"' - - - def handleFree(self): - url = 'http://datei.to/ajax/download.php' - data = {'P': 'I', 'ID': self.file_info['ID']} - - recaptcha = ReCaptcha(self) - - for _ in xrange(10): - self.logDebug("URL", url, "POST", data) - self.html = self.load(url, post=data) - self.checkErrors() - - if url.endswith('download.php') and 'P' in data: - if data['P'] == 'I': - self.doWait() - - elif data['P'] == 'IV': - break - - m = re.search(self.DATA_PATTERN, self.html) - if m is None: - self.parseError('data') - url = 'http://datei.to/' + m.group(1) - data = dict(x.split('=') for x in m.group(2).split('&')) - - if url.endswith('recaptcha.php'): - m = re.search(self.RECAPTCHA_KEY_PATTERN, self.html) - recaptcha_key = m.group(1) if m else "6LdBbL8SAAAAAI0vKUo58XRwDd5Tu_Ze1DA7qTao" - - data['recaptcha_challenge_field'], data['recaptcha_response_field'] = recaptcha.challenge(recaptcha_key) - - else: - self.fail('Too bad...') - - download_url = self.html - self.logDebug('Download URL', download_url) - self.download(download_url) - - def checkErrors(self): - m = re.search(self.PARALELL_PATTERN, self.html) - if m: - m = re.search(self.WAIT_PATTERN, self.html) - wait_time = int(m.group(1)) if m else 30 - self.wait(wait_time + 1, False) - self.retry() - - def doWait(self): - m = re.search(self.WAIT_PATTERN, self.html) - wait_time = int(m.group(1)) if m else 30 - - self.load('http://datei.to/ajax/download.php', post={'P': 'Ads'}) - self.wait(wait_time + 1, False) - - -getInfo = create_getInfo(DateiTo) diff --git a/module/plugins/hoster/DdlstorageCom.py b/module/plugins/hoster/DdlstorageCom.py deleted file mode 100644 index 4d77289d7..000000000 --- a/module/plugins/hoster/DdlstorageCom.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo - - -class DdlstorageCom(DeadHoster): - __name__ = "DdlstorageCom" - __type__ = "hoster" - __version__ = "1.02" - - __pattern__ = r'https?://(?:www\.)?ddlstorage\.com/\w+' - - __description__ = """DDLStorage.com hoster plugin""" - __author_name__ = ("zoidberg", "stickell") - __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it") - - -getInfo = create_getInfo(DdlstorageCom) diff --git a/module/plugins/hoster/DebridItaliaCom.py b/module/plugins/hoster/DebridItaliaCom.py deleted file mode 100644 index 5880b2738..000000000 --- a/module/plugins/hoster/DebridItaliaCom.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.Hoster import Hoster - - -class DebridItaliaCom(Hoster): - __name__ = "DebridItaliaCom" - __type__ = "hoster" - __version__ = "0.05" - - __pattern__ = r'https?://(?:[^/]*\.)?debriditalia\.com' - - __description__ = """Debriditalia.com hoster plugin""" - __author_name__ = "stickell" - __author_mail__ = "l.stickell@yahoo.it" - - - def setup(self): - self.chunkLimit = -1 - self.resumeDownload = True - - def process(self, pyfile): - if re.match(self.__pattern__, pyfile.url): - new_url = pyfile.url - elif not self.account: - self.logError(_("Please enter your %s account or deactivate this plugin") % "DebridItalia") - self.fail("No DebridItalia account provided") - else: - self.logDebug("Old URL: %s" % pyfile.url) - url = "http://debriditalia.com/linkgen2.php?xjxfun=convertiLink&xjxargs[]=S" % pyfile.url - page = self.load(url) - self.logDebug("XML data: %s" % page) - - if 'File not available' in page: - self.fail('File not available') - else: - new_url = re.search(r'(?P[^<]+)', page).group('direct') - - if new_url != pyfile.url: - self.logDebug("New URL: %s" % new_url) - - self.download(new_url, disposition=True) - - check = self.checkDownload({"empty": re.compile(r"^$")}) - - if check == "empty": - self.retry(5, 2 * 60, "Empty file downloaded") diff --git a/module/plugins/hoster/DepositfilesCom.py b/module/plugins/hoster/DepositfilesCom.py deleted file mode 100644 index e2b2d46fd..000000000 --- a/module/plugins/hoster/DepositfilesCom.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from urllib import unquote - -from module.plugins.internal.CaptchaService import ReCaptcha -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class DepositfilesCom(SimpleHoster): - __name__ = "DepositfilesCom" - __type__ = "hoster" - __version__ = "0.48" - - __pattern__ = r'https?://(?:www\.)?(depositfiles\.com|dfiles\.(eu|ru))(/\w{1,3})?/files/(?P\w+)' - - __description__ = """Depositfiles.com hoster plugin""" - __author_name__ = ("spoob", "zoidberg", "Walter Purcaro") - __author_mail__ = ("spoob@pyload.org", "zoidberg@mujmail.cz", "vuolter@gmail.com") - - FILE_NAME_PATTERN = r'' - - - def process(self, pyfile): - self.html = self.load(pyfile.url, decode=True) - self.getFileInfo() - - # parse js variables - self.jsvars = dict((x, y.strip("'")) for x, y in re.findall(r"var (\w+) = ([0-9.]+|'[^']*')", self.html)) - self.logDebug(self.jsvars) - pyfile.name = self.jsvars['ID3'] - - # determine download type - free or premium - if self.premium: - if 'UU_prihlasen' in self.jsvars: - if self.jsvars['UU_prihlasen'] == '0': - self.logWarning('User not logged in') - self.relogin(self.user) - self.retry() - elif float(self.jsvars['UU_kredit']) < float(self.jsvars['kredit_odecet']): - self.logWarning('Not enough credit left') - self.premium = False - - if self.premium: - self.handlePremium() - else: - self.handleFree() - - check = self.checkDownload({"err": re.compile(r"\AChyba!")}, max_size=100) - if check == "err": - self.fail("File not m or plugin defect") - - def handleFree(self): - # get download url - download_url = '%s/download.php' % self.jsvars['server'] - data = dict((x, self.jsvars[x]) for x in self.jsvars if x in ("ID1", "ID2", "ID3", "ID4")) - self.logDebug("FREE URL1:" + download_url, data) - - self.req.http.c.setopt(FOLLOWLOCATION, 0) - self.load(download_url, post=data) - self.header = self.req.http.header - self.req.http.c.setopt(FOLLOWLOCATION, 1) - - m = re.search("Location\s*:\s*(.*)", self.header, re.I) - if m is None: - self.fail('File not found') - download_url = m.group(1) - self.logDebug("FREE URL2:" + download_url) - - # check errors - m = re.search(r'/chyba/(\d+)', download_url) - if m: - if m.group(1) == '1': - self.retry(60, 2 * 60, "This IP is already downloading") - elif m.group(1) == '2': - self.retry(60, 60, "No free slots available") - else: - self.fail('Error %d' % m.group(1)) - - # download file - self.download(download_url) - - def handlePremium(self): - download_url = '%s/download_premium.php' % self.jsvars['server'] - data = dict((x, self.jsvars[x]) for x in self.jsvars if x in ("ID1", "ID2", "ID4", "ID5")) - self.logDebug("PREMIUM URL:" + download_url, data) - self.download(download_url, get=data) - - -getInfo = create_getInfo(QuickshareCz) diff --git a/module/plugins/hoster/RPNetBiz.py b/module/plugins/hoster/RPNetBiz.py deleted file mode 100644 index 47f255074..000000000 --- a/module/plugins/hoster/RPNetBiz.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.Hoster import Hoster -from module.common.json_layer import json_loads - - -class RPNetBiz(Hoster): - __name__ = "RPNetBiz" - __type__ = "hoster" - __version__ = "0.1" - - __description__ = """RPNet.biz hoster plugin""" - - __pattern__ = r'https?://.*rpnet\.biz' - __author_name__ = "Dman" - __author_mail__ = "dmanugm@gmail.com" - - - def setup(self): - self.chunkLimit = -1 - self.resumeDownload = True - - def process(self, pyfile): - if re.match(self.__pattern__, pyfile.url): - link_status = {'generated': pyfile.url} - elif not self.account: - # Check account - self.logError(_("Please enter your %s account or deactivate this plugin") % "rpnet") - self.fail("No rpnet account provided") - else: - (user, data) = self.account.selectAccount() - - self.logDebug("Original URL: %s" % pyfile.url) - # Get the download link - response = self.load("https://premium.rpnet.biz/client_api.php", - get={"username": user, "password": data['password'], - "action": "generate", "links": pyfile.url}) - - self.logDebug("JSON data: %s" % response) - link_status = json_loads(response)['links'][0] # get the first link... since we only queried one - - # Check if we only have an id as a HDD link - if 'id' in link_status: - self.logDebug("Need to wait at least 30 seconds before requery") - self.setWait(30) # wait for 30 seconds - self.wait() - # Lets query the server again asking for the status on the link, - # we need to keep doing this until we reach 100 - max_tries = 30 - my_try = 0 - while (my_try <= max_tries): - self.logDebug("Try: %d ; Max Tries: %d" % (my_try, max_tries)) - response = self.load("https://premium.rpnet.biz/client_api.php", - get={"username": user, "password": data['password'], - "action": "downloadInformation", "id": link_status['id']}) - self.logDebug("JSON data hdd query: %s" % response) - download_status = json_loads(response)['download'] - - if download_status['status'] == '100': - link_status['generated'] = download_status['rpnet_link'] - self.logDebug("Successfully downloaded to rpnet HDD: %s" % link_status['generated']) - break - else: - self.logDebug("At %s%% for the file download" % download_status['status']) - - self.setWait(30) - self.wait() - my_try += 1 - - if my_try > max_tries: # We went over the limit! - self.fail("Waited for about 15 minutes for download to finish but failed") - - if 'generated' in link_status: - self.download(link_status['generated'], disposition=True) - elif 'error' in link_status: - self.fail(link_status['error']) - else: - self.fail("Something went wrong, not supposed to enter here") diff --git a/module/plugins/hoster/RapidgatorNet.py b/module/plugins/hoster/RapidgatorNet.py deleted file mode 100644 index ce4d9ab36..000000000 --- a/module/plugins/hoster/RapidgatorNet.py +++ /dev/null @@ -1,191 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from pycurl import HTTPHEADER - -from module.common.json_layer import json_loads -from module.network.HTTPRequest import BadHeader -from module.plugins.hoster.UnrestrictLi import secondsToMidnight -from module.plugins.internal.CaptchaService import AdsCaptcha, ReCaptcha, SolveMedia -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class RapidgatorNet(SimpleHoster): - __name__ = "RapidgatorNet" - __type__ = "hoster" - __version__ = "0.22" - - __pattern__ = r'http://(?:www\.)?(rapidgator\.net|rg\.to)/file/\w+' - - __description__ = """Rapidgator.net hoster plugin""" - __author_name__ = ("zoidberg", "chrox", "stickell", "Walter Purcaro") - __author_mail__ = ("zoidberg@mujmail.cz", "", "l.stickell@yahoo.it", "vuolter@gmail.com") - - API_URL = "http://rapidgator.net/api/file" - - FILE_NAME_PATTERN = r'Download file (?P<N>.*)' - FILE_SIZE_PATTERN = r'File size:\s*(?P[\d\.]+) (?P\w+)' - OFFLINE_PATTERN = r'>(File not found|Error 404)' - - JSVARS_PATTERN = r"\s+var\s*(startTimerUrl|getDownloadUrl|captchaUrl|fid|secs)\s*=\s*'?(.*?)'?;" - PREMIUM_ONLY_ERROR_PATTERN = r'You can download files up to|This file can be downloaded by premium only<' - DOWNLOAD_LIMIT_ERROR_PATTERN = r'You have reached your (daily|hourly) downloads limit' - WAIT_PATTERN = r'(?:Delay between downloads must be not less than|Try again in)\s*(\d+)\s*(hour|min)' - LINK_PATTERN = r"return '(http://\w+.rapidgator.net/.*)';" - - RECAPTCHA_KEY_PATTERN = r'"http://api\.recaptcha\.net/challenge\?k=(.*?)"' - ADSCAPTCHA_SRC_PATTERN = r'(http://api\.adscaptcha\.com/Get\.aspx[^"\']*)' - SOLVEMEDIA_PATTERN = r'http://api\.solvemedia\.com/papi/challenge\.script\?k=(.*?)"' - - - def setup(self): - self.resumeDownload = self.multiDL = self.premium - self.sid = None - self.chunkLimit = 1 - self.req.setOption("timeout", 120) - - def process(self, pyfile): - if self.account: - self.sid = self.account.getAccountData(self.user).get('SID', None) - - if self.sid: - self.handlePremium() - else: - self.handleFree() - - def api_response(self, cmd): - try: - json = self.load('%s/%s' % (self.API_URL, cmd), - get={'sid': self.sid, - 'url': self.pyfile.url}, decode=True) - self.logDebug('API:%s' % cmd, json, "SID: %s" % self.sid) - json = json_loads(json) - status = json['response_status'] - msg = json['response_details'] - except BadHeader, e: - self.logError('API:%s' % cmd, e, "SID: %s" % self.sid) - status = e.code - msg = e - - if status == 200: - return json['response'] - elif status == 423: - self.account.empty(self.user) - self.retry() - else: - self.account.relogin(self.user) - self.retry(wait_time=60) - - def handlePremium(self): - #self.logDebug("ACCOUNT_DATA", self.account.getAccountData(self.user)) - self.api_data = self.api_response('info') - self.api_data['md5'] = self.api_data['hash'] - self.pyfile.name = self.api_data['filename'] - self.pyfile.size = self.api_data['size'] - url = self.api_response('download')['url'] - self.download(url) - - def handleFree(self): - self.html = self.load(self.pyfile.url, decode=True) - - self.checkFree() - - jsvars = dict(re.findall(self.JSVARS_PATTERN, self.html)) - self.logDebug(jsvars) - - self.req.http.lastURL = self.pyfile.url - self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With: XMLHttpRequest"]) - - url = "http://rapidgator.net%s?fid=%s" % ( - jsvars.get('startTimerUrl', '/download/AjaxStartTimer'), jsvars['fid']) - jsvars.update(self.getJsonResponse(url)) - - self.wait(int(jsvars.get('secs', 45)) + 1, False) - - url = "http://rapidgator.net%s?sid=%s" % ( - jsvars.get('getDownloadUrl', '/download/AjaxGetDownload'), jsvars['sid']) - jsvars.update(self.getJsonResponse(url)) - - self.req.http.lastURL = self.pyfile.url - self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With:"]) - - url = "http://rapidgator.net%s" % jsvars.get('captchaUrl', '/download/captcha') - self.html = self.load(url) - - for _ in xrange(5): - m = re.search(self.LINK_PATTERN, self.html) - if m: - link = m.group(1) - self.logDebug(link) - self.download(link, disposition=True) - break - else: - captcha, captcha_key = self.getCaptcha() - captcha_challenge, captcha_response = captcha.challenge(captcha_key) - - self.html = self.load(url, post={ - "DownloadCaptchaForm[captcha]": "", - "adcopy_challenge": captcha_challenge, - "adcopy_response": captcha_response - }) - - if "The verification code is incorrect" in self.html: - self.invalidCaptcha() - else: - self.correctCaptcha() - else: - self.parseError("Download link") - - def getCaptcha(self): - m = re.search(self.ADSCAPTCHA_SRC_PATTERN, self.html) - if m: - captcha_key = m.group(1) - captcha = AdsCaptcha(self) - else: - m = re.search(self.RECAPTCHA_KEY_PATTERN, self.html) - if m: - captcha_key = m.group(1) - captcha = ReCaptcha(self) - else: - m = re.search(self.SOLVEMEDIA_PATTERN, self.html) - if m: - captcha_key = m.group(1) - captcha = SolveMedia(self) - else: - self.parseError("Captcha") - - return captcha, captcha_key - - def checkFree(self): - m = re.search(self.PREMIUM_ONLY_ERROR_PATTERN, self.html) - if m: - self.fail("Premium account needed for download") - else: - m = re.search(self.WAIT_PATTERN, self.html) - - if m: - wait_time = int(m.group(1)) * {"hour": 60, "min": 1}[m.group(2)] - else: - m = re.search(self.DOWNLOAD_LIMIT_ERROR_PATTERN, self.html) - if m is None: - return - elif m.group(1) == "daily": - self.logWarning("You have reached your daily downloads limit for today") - wait_time = secondsToMidnight(gmt=2) - else: - wait_time = 1 * 60 * 60 - - self.logDebug("Waiting %d minutes" % wait_time / 60) - self.wait(wait_time, True) - self.retry() - - def getJsonResponse(self, url): - response = self.load(url, decode=True) - if not response.startswith('{'): - self.retry() - self.logDebug(url, response) - return json_loads(response) - - -getInfo = create_getInfo(RapidgatorNet) diff --git a/module/plugins/hoster/RapidshareCom.py b/module/plugins/hoster/RapidshareCom.py deleted file mode 100644 index 19d6cf772..000000000 --- a/module/plugins/hoster/RapidshareCom.py +++ /dev/null @@ -1,223 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.network.RequestFactory import getURL -from module.plugins.Hoster import Hoster - - -def getInfo(urls): - ids = "" - names = "" - - p = re.compile(RapidshareCom.__pattern__) - - for url in urls: - r = p.search(url) - if r.group("name"): - ids += "," + r.group("id") - names += "," + r.group("name") - elif r.group("name_new"): - ids += "," + r.group("id_new") - names += "," + r.group("name_new") - - url = "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=checkfiles&files=%s&filenames=%s" % (ids[1:], names[1:]) - - api = getURL(url) - result = [] - i = 0 - for res in api.split(): - tmp = res.split(",") - if tmp[4] in ("0", "4", "5"): - status = 1 - elif tmp[4] == "1": - status = 2 - else: - status = 3 - - result.append((tmp[1], tmp[2], status, urls[i])) - i += 1 - - yield result - - -class RapidshareCom(Hoster): - __name__ = "RapidshareCom" - __type__ = "hoster" - __version__ = "1.39" - - __pattern__ = r'https?://(?:www\.)?rapidshare.com/(?:files/(?P\d*?)/(?P[^?]+)|#!download\|(?:\w+)\|(?P\d+)\|(?P[^|]+))' - __config__ = [("server", - "Cogent;Deutsche Telekom;Level(3);Level(3) #2;GlobalCrossing;Level(3) #3;Teleglobe;GlobalCrossing #2;TeliaSonera #2;Teleglobe #2;TeliaSonera #3;TeliaSonera", - "Preferred Server", "None")] - - __description__ = """Rapidshare.com hoster plugin""" - __author_name__ = ("spoob", "RaNaN", "mkaay") - __author_mail__ = ("spoob@pyload.org", "ranan@pyload.org", "mkaay@mkaay.de") - - - def setup(self): - self.no_download = True - self.api_data = None - self.offset = 0 - self.dl_dict = {} - - self.id = None - self.name = None - - self.chunkLimit = -1 if self.premium else 1 - self.multiDL = self.resumeDownload = self.premium - - def process(self, pyfile): - self.url = pyfile.url - self.prepare() - - def prepare(self): - m = re.match(self.__pattern__, self.url) - - if m.group("name"): - self.id = m.group("id") - self.name = m.group("name") - else: - self.id = m.group("id_new") - self.name = m.group("name_new") - - self.download_api_data() - if self.api_data['status'] == "1": - self.pyfile.name = self.get_file_name() - - if self.premium: - self.handlePremium() - else: - self.handleFree() - - elif self.api_data['status'] == "2": - self.logInfo(_("Rapidshare: Traffic Share (direct download)")) - self.pyfile.name = self.get_file_name() - - self.download(self.pyfile.url, get={"directstart": 1}) - - elif self.api_data['status'] in ("0", "4", "5"): - self.offline() - elif self.api_data['status'] == "3": - self.tempOffline() - else: - self.fail("Unknown response code.") - - def handleFree(self): - while self.no_download: - self.dl_dict = self.freeWait() - - #tmp = "#!download|%(server)s|%(id)s|%(name)s|%(size)s" - download = "http://%(host)s/cgi-bin/rsapi.cgi?sub=download&editparentlocation=0&bin=1&fileid=%(id)s&filename=%(name)s&dlauth=%(auth)s" % self.dl_dict - - self.logDebug("RS API Request: %s" % download) - self.download(download, ref=False) - - check = self.checkDownload({"ip": "You need RapidPro to download more files from your IP address", - "auth": "Download auth invalid"}) - if check == "ip": - self.setWait(60) - self.logInfo(_("Already downloading from this ip address, waiting 60 seconds")) - self.wait() - self.handleFree() - elif check == "auth": - self.logInfo(_("Invalid Auth Code, download will be restarted")) - self.offset += 5 - self.handleFree() - - def handlePremium(self): - info = self.account.getAccountInfo(self.user, True) - self.logDebug("%s: Use Premium Account" % self.__name__) - url = self.api_data['mirror'] - self.download(url, get={"directstart": 1}) - - def download_api_data(self, force=False): - """ - http://images.rapidshare.com/apidoc.txt - """ - if self.api_data and not force: - return - api_url_base = "http://api.rapidshare.com/cgi-bin/rsapi.cgi" - api_param_file = {"sub": "checkfiles", "incmd5": "1", "files": self.id, "filenames": self.name} - src = self.load(api_url_base, cookies=False, get=api_param_file).strip() - self.logDebug("RS INFO API: %s" % src) - if src.startswith("ERROR"): - return - fields = src.split(",") - - # status codes: - # 0=File not found - # 1=File OK (Anonymous downloading) - # 3=Server down - # 4=File marked as illegal - # 5=Anonymous file locked, because it has more than 10 downloads already - # 50+n=File OK (TrafficShare direct download type "n" without any logging.) - # 100+n=File OK (TrafficShare direct download type "n" with logging. - # Read our privacy policy to see what is logged.) - - self.api_data = {"fileid": fields[0], "filename": fields[1], "size": int(fields[2]), "serverid": fields[3], - "status": fields[4], "shorthost": fields[5], "checksum": fields[6].strip().lower()} - - if int(self.api_data['status']) > 100: - self.api_data['status'] = str(int(self.api_data['status']) - 100) - elif int(self.api_data['status']) > 50: - self.api_data['status'] = str(int(self.api_data['status']) - 50) - - self.api_data['mirror'] = "http://rs%(serverid)s%(shorthost)s.rapidshare.com/files/%(fileid)s/%(filename)s" % self.api_data - - def freeWait(self): - """downloads html with the important information - """ - self.no_download = True - - id = self.id - name = self.name - - prepare = "https://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=download&fileid=%(id)s&filename=%(name)s&try=1&cbf=RSAPIDispatcher&cbid=1" % { - "name": name, "id": id} - - self.logDebug("RS API Request: %s" % prepare) - result = self.load(prepare, ref=False) - self.logDebug("RS API Result: %s" % result) - - between_wait = re.search("You need to wait (\d+) seconds", result) - - if "You need RapidPro to download more files from your IP address" in result: - self.setWait(60) - self.logInfo(_("Already downloading from this ip address, waiting 60 seconds")) - self.wait() - elif ("Too many users downloading from this server right now" in result or - "All free download slots are full" in result): - self.setWait(120) - self.logInfo(_("RapidShareCom: No free slots")) - self.wait() - elif "This file is too big to download it for free" in result: - self.fail(_("You need a premium account for this file")) - elif "Filename invalid." in result: - self.fail(_("Filename reported invalid")) - elif between_wait: - self.setWait(int(between_wait.group(1))) - self.wantReconnect = True - self.wait() - else: - self.no_download = False - - tmp, info = result.split(":") - data = info.split(",") - - dl_dict = {"id": id, - "name": name, - "host": data[0], - "auth": data[1], - "server": self.api_data['serverid'], - "size": self.api_data['size']} - self.setWait(int(data[2]) + 2 + self.offset) - self.wait() - - return dl_dict - - def get_file_name(self): - if self.api_data['filename']: - return self.api_data['filename'] - return self.url.split("/")[-1] diff --git a/module/plugins/hoster/RarefileNet.py b/module/plugins/hoster/RarefileNet.py deleted file mode 100644 index 51df5c882..000000000 --- a/module/plugins/hoster/RarefileNet.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo -from module.utils import html_unescape - - -class RarefileNet(XFileSharingPro): - __name__ = "RarefileNet" - __type__ = "hoster" - __version__ = "0.03" - - __pattern__ = r'http://(?:www\.)?rarefile.net/\w{12}' - - __description__ = """Rarefile.net hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - HOSTER_NAME = "rarefile.net" - - FILE_NAME_PATTERN = r'(?P.*?)Size : (?P.+?) ' - LINK_PATTERN = r'(?P=link)' - - - def setup(self): - self.resumeDownload = self.multiDL = self.premium - - def handleCaptcha(self, inputs): - captcha_div = re.search(r'Enter code.*?(.*?)', self.html, re.S).group(1) - self.logDebug(captcha_div) - numerals = re.findall('(\d)', html_unescape(captcha_div)) - inputs['code'] = "".join([a[1] for a in sorted(numerals, key=lambda num: int(num[0]))]) - self.logDebug("CAPTCHA", inputs['code'], numerals) - return 3 - - -getInfo = create_getInfo(RarefileNet) diff --git a/module/plugins/hoster/RealdebridCom.py b/module/plugins/hoster/RealdebridCom.py deleted file mode 100644 index de7540628..000000000 --- a/module/plugins/hoster/RealdebridCom.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from random import randrange -from urllib import quote, unquote -from time import time - -from module.common.json_layer import json_loads -from module.plugins.Hoster import Hoster -from module.utils import parseFileSize - - -class RealdebridCom(Hoster): - __name__ = "RealdebridCom" - __type__ = "hoster" - __version__ = "0.53" - - __pattern__ = r'https?://(?:[^/]*\.)?real-debrid\..*' - - __description__ = """Real-Debrid.com hoster plugin""" - __author_name__ = "Devirex Hazzard" - __author_mail__ = "naibaf_11@yahoo.de" - - - def getFilename(self, url): - try: - name = unquote(url.rsplit("/", 1)[1]) - except IndexError: - name = "Unknown_Filename..." - if not name or name.endswith(".."): # incomplete filename, append random stuff - name += "%s.tmp" % randrange(100, 999) - return name - - def setup(self): - self.chunkLimit = 3 - self.resumeDownload = True - - def process(self, pyfile): - if re.match(self.__pattern__, pyfile.url): - new_url = pyfile.url - elif not self.account: - self.logError(_("Please enter your %s account or deactivate this plugin") % "Real-debrid") - self.fail("No Real-debrid account provided") - else: - self.logDebug("Old URL: %s" % pyfile.url) - password = self.getPassword().splitlines() - if not password: - password = "" - else: - password = password[0] - - url = "https://real-debrid.com/ajax/unrestrict.php?lang=en&link=%s&password=%s&time=%s" % ( - quote(pyfile.url, ""), password, int(time() * 1000)) - page = self.load(url) - data = json_loads(page) - - self.logDebug("Returned Data: %s" % data) - - if data['error'] != 0: - if data['message'] == "Your file is unavailable on the hoster.": - self.offline() - else: - self.logWarning(data['message']) - self.tempOffline() - else: - if pyfile.name is not None and pyfile.name.endswith('.tmp') and data['file_name']: - pyfile.name = data['file_name'] - pyfile.size = parseFileSize(data['file_size']) - new_url = data['generated_links'][0][-1] - - if self.getConfig("https"): - new_url = new_url.replace("http://", "https://") - else: - new_url = new_url.replace("https://", "http://") - - if new_url != pyfile.url: - self.logDebug("New URL: %s" % new_url) - - if pyfile.name.startswith("http") or pyfile.name.startswith("Unknown") or pyfile.name.endswith('..'): - #only use when name wasnt already set - pyfile.name = self.getFilename(new_url) - - self.download(new_url, disposition=True) - - check = self.checkDownload( - {"error": "An error occured while processing your request"}) - - if check == "error": - #usual this download can safely be retried - self.retry(wait_time=60, reason="An error occured while generating link.") diff --git a/module/plugins/hoster/RedtubeCom.py b/module/plugins/hoster/RedtubeCom.py deleted file mode 100644 index bdb948d6d..000000000 --- a/module/plugins/hoster/RedtubeCom.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.Hoster import Hoster -from module.unescape import unescape - - -class RedtubeCom(Hoster): - __name__ = "RedtubeCom" - __type__ = "hoster" - __version__ = "0.2" - - __pattern__ = r'http://(?:www\.)?redtube\.com/\d+' - - __description__ = """Redtube.com hoster plugin""" - __author_name__ = "jeix" - __author_mail__ = "jeix@hasnomail.de" - - - def process(self, pyfile): - self.download_html() - if not self.file_exists(): - self.offline() - - pyfile.name = self.get_file_name() - self.download(self.get_file_url()) - - def download_html(self): - url = self.pyfile.url - self.html = self.load(url) - - def get_file_url(self): - """ returns the absolute downloadable filepath - """ - if not self.html: - self.download_html() - - file_url = unescape(re.search(r'hashlink=(http.*?)"', self.html).group(1)) - - return file_url - - def get_file_name(self): - if not self.html: - self.download_html() - - return re.search('(.*?)- RedTube - Free Porn Videos', self.html).group(1).strip() + ".flv" - - def file_exists(self): - """ returns True or False - """ - if not self.html: - self.download_html() - - if re.search(r'This video has been removed.', self.html) is not None: - return False - else: - return True diff --git a/module/plugins/hoster/RehostTo.py b/module/plugins/hoster/RehostTo.py deleted file mode 100644 index 98fb10d94..000000000 --- a/module/plugins/hoster/RehostTo.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- - -from urllib import quote, unquote - -from module.plugins.Hoster import Hoster - - -class RehostTo(Hoster): - __name__ = "RehostTo" - __type__ = "hoster" - __version__ = "0.13" - - __pattern__ = r'https?://.*rehost.to\..*' - - __description__ = """Rehost.com hoster plugin""" - __author_name__ = "RaNaN" - __author_mail__ = "RaNaN@pyload.org" - - - def getFilename(self, url): - return unquote(url.rsplit("/", 1)[1]) - - def setup(self): - self.chunkLimit = 1 - self.resumeDownload = True - - def process(self, pyfile): - if not self.account: - self.logError(_("Please enter your %s account or deactivate this plugin") % "rehost.to") - self.fail("No rehost.to account provided") - - data = self.account.getAccountInfo(self.user) - long_ses = data['long_ses'] - - self.logDebug("Rehost.to: Old URL: %s" % pyfile.url) - new_url = "http://rehost.to/process_download.php?user=cookie&pass=%s&dl=%s" % (long_ses, quote(pyfile.url, "")) - - #raise timeout to 2min - self.req.setOption("timeout", 120) - - self.download(new_url, disposition=True) diff --git a/module/plugins/hoster/RemixshareCom.py b/module/plugins/hoster/RemixshareCom.py deleted file mode 100644 index ea396495e..000000000 --- a/module/plugins/hoster/RemixshareCom.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Test links: -# http://remixshare.com/download/p946u -# -# Note: -# The remixshare.com website is very very slow, so -# if your download not starts because of pycurl timeouts: -# Adjust timeouts in /usr/share/pyload/module/network/HTTPRequest.py - -import re - -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class RemixshareCom(SimpleHoster): - __name__ = "RemixshareCom" - __type__ = "hoster" - __version__ = "0.01" - - __pattern__ = r'https?://remixshare\.com/(download|dl)/\w+' - - __description__ = """Remixshare.com hoster plugin""" - __author_name__ = ("zapp-brannigan", "Walter Purcaro") - __author_mail__ = ("fuerst.reinje@web.de", "vuolter@gmail.com") - - FILE_INFO_PATTERN = r'title=\'.+?\'>(?P.+?) \((?P\d+) (?P\w+)\)<' - OFFLINE_PATTERN = r'

    Ooops!<' - - LINK_PATTERN = r'(http://remixshare\.com/downloadfinal/.+?)"' - TOKEN_PATTERN = r'var acc = (\d+)' - WAIT_PATTERN = r'var XYZ = r"(\d+)"' - - - def setup(self): - self.multiDL = True - self.chunkLimit = 1 - - def handleFree(self): - b = re.search(self.LINK_PATTERN, self.html) - if not b: - self.parseError("Cannot parse download url") - c = re.search(self.TOKEN_PATTERN, self.html) - if not c: - self.parseError("Cannot parse file token") - dl_url = b.group(1) + c.group(1) - - #Check if we have to wait - seconds = re.search(self.WAIT_PATTERN, self.html) - if seconds: - self.logDebug("Wait " + seconds.group(1)) - self.wait(seconds.group(1)) - - # Finally start downloading... - self.logDebug("Download URL = r" + dl_url) - self.download(dl_url, disposition=True) - - -getInfo = create_getInfo(RemixshareCom) diff --git a/module/plugins/hoster/RgHostNet.py b/module/plugins/hoster/RgHostNet.py deleted file mode 100644 index dccc6e557..000000000 --- a/module/plugins/hoster/RgHostNet.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class RgHostNet(SimpleHoster): - __name__ = "RgHostNet" - __type__ = "hoster" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?rghost\.net/\d+(?:r=\d+)?' - - __description__ = """RgHost.net hoster plugin""" - __author_name__ = "z00nx" - __author_mail__ = "z00nx0@gmail.com" - - FILE_INFO_PATTERN = r'

    \s+(]+>)?(?P[^<]+)()?\s+]+>\s+\((?P[^)]+)\)\s+\s+

    ' - OFFLINE_PATTERN = r'File is deleted|this page is not found' - LINK_PATTERN = r''']+>Download''' - - - def handleFree(self): - m = re.search(self.LINK_PATTERN, self.html) - if m is None: - self.parseError("Unable to detect the direct link") - download_link = m.group(1) - self.download(download_link, disposition=True) - - -getInfo = create_getInfo(RgHostNet) diff --git a/module/plugins/hoster/RyushareCom.py b/module/plugins/hoster/RyushareCom.py deleted file mode 100644 index a24090cde..000000000 --- a/module/plugins/hoster/RyushareCom.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Test links: -# http://ryushare.com/cl0jy8ric2js/random.bin - -import re - -from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo -from module.plugins.internal.CaptchaService import SolveMedia - - -class RyushareCom(XFileSharingPro): - __name__ = "RyushareCom" - __type__ = "hoster" - __version__ = "0.16" - - __pattern__ = r'http://(?:www\.)?ryushare\.com/\w+' - - __description__ = """Ryushare.com hoster plugin""" - __author_name__ = ("zoidberg", "stickell", "quareevo") - __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it", "quareevo@arcor.de") - - HOSTER_NAME = "ryushare.com" - - FILE_SIZE_PATTERN = r'You have requested [^<]+ \((?P[\d\.]+) (?P\w+)' - - WAIT_PATTERN = r'You have to wait ((?P\d+) hour[s]?, )?((?P\d+) minute[s], )?(?P\d+) second[s]' - LINK_PATTERN = r'Click here to download<' - SOLVEMEDIA_PATTERN = r'http:\/\/api\.solvemedia\.com\/papi\/challenge\.script\?k=(.*?)"' - - - def getDownloadLink(self): - retry = False - self.html = self.load(self.pyfile.url) - action, inputs = self.parseHtmlForm(input_names={"op": re.compile("^download")}) - if "method_premium" in inputs: - del inputs['method_premium'] - - self.html = self.load(self.pyfile.url, post=inputs) - action, inputs = self.parseHtmlForm('F1') - - self.setWait(65) - # Wait 1 hour - if "You have reached the download-limit" in self.html: - self.setWait(1 * 60 * 60, True) - retry = True - - m = re.search(self.WAIT_PATTERN, self.html) - if m: - wait = m.groupdict(0) - waittime = int(wait['hour']) * 60 * 60 + int(wait['min']) * 60 + int(wait['sec']) - self.setWait(waittime, True) - retry = True - - self.wait() - if retry: - self.retry() - - for _ in xrange(5): - m = re.search(self.SOLVEMEDIA_PATTERN, self.html) - if m is None: - self.parseError("Error parsing captcha") - - captchaKey = m.group(1) - captcha = SolveMedia(self) - challenge, response = captcha.challenge(captchaKey) - - inputs['adcopy_challenge'] = challenge - inputs['adcopy_response'] = response - - self.html = self.load(self.pyfile.url, post=inputs) - if "WRONG CAPTCHA" in self.html: - self.invalidCaptcha() - self.logInfo("Invalid Captcha") - else: - self.correctCaptcha() - break - else: - self.fail("You have entered 5 invalid captcha codes") - - if "Click here to download" in self.html: - return re.search(r'Click here to download', self.html).group(1) - - -getInfo = create_getInfo(RyushareCom) diff --git a/module/plugins/hoster/SecureUploadEu.py b/module/plugins/hoster/SecureUploadEu.py deleted file mode 100644 index 3691be7da..000000000 --- a/module/plugins/hoster/SecureUploadEu.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo - - -class SecureUploadEu(XFileSharingPro): - __name__ = "SecureUploadEu" - __type__ = "hoster" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?secureupload\.eu/(\w){12}(/\w+)' - - __description__ = """SecureUpload.eu hoster plugin""" - __author_name__ = "z00nx" - __author_mail__ = "z00nx0@gmail.com" - - HOSTER_NAME = "secureupload.eu" - - FILE_INFO_PATTERN = r'

    Downloading (?P[^<]+) \((?P[^<]+)\)

    ' - OFFLINE_PATTERN = r'The file was removed|File Not Found' - - -getInfo = create_getInfo(SecureUploadEu) diff --git a/module/plugins/hoster/SendmywayCom.py b/module/plugins/hoster/SendmywayCom.py deleted file mode 100644 index f5e9e9ca6..000000000 --- a/module/plugins/hoster/SendmywayCom.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo - - -class SendmywayCom(XFileSharingPro): - __name__ = "SendmywayCom" - __type__ = "hoster" - __version__ = "0.01" - - __pattern__ = r'http://(?:www\.)?sendmyway.com/\w{12}' - - __description__ = """SendMyWay hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - HOSTER_NAME = "sendmyway.com" - - FILE_NAME_PATTERN = r'

    <.*?>\s*(?P.+)' - FILE_SIZE_PATTERN = r'\((?P\d+) bytes\)' - - -getInfo = create_getInfo(SendmywayCom) diff --git a/module/plugins/hoster/SendspaceCom.py b/module/plugins/hoster/SendspaceCom.py deleted file mode 100644 index 1dac231eb..000000000 --- a/module/plugins/hoster/SendspaceCom.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo - - -class SendspaceCom(SimpleHoster): - __name__ = "SendspaceCom" - __type__ = "hoster" - __version__ = "0.13" - - __pattern__ = r'http://(?:www\.)?sendspace.com/file/.*' - - __description__ = """Sendspace.com hoster plugin""" - __author_name__ = "zoidberg" - __author_mail__ = "zoidberg@mujmail.cz" - - FILE_NAME_PATTERN = r'

    \s*<(?:b|strong)>(?P[^<]+)\s*File Size:\s*(?P[0-9.]+)(?P[kKMG])i?B\s*' - OFFLINE_PATTERN = r'
    Sorry, the file you requested is not available.
    ' - - LINK_PATTERN = r'

    Velikost:\s*(?P[0-9.]+) (?P[kKMG])i?B
    - - - - - - - - {% for name, data in users.iteritems() %} - - - - - - - {% endfor %} - - -
    - {{ _("Name") }} - - {{ _("Change Password") }} - - {{ _("Admin") }} - - {{ _("Permissions") }} -
    {{ name }}{{ _("change") }} - -
    - - - -{% endblock %} -{% block hidden %} -

    -
    -

    {{ _("Change Password") }}

    - -

    {{ _("Enter your current and desired Password.") }}

    - - - - - - - - - - - - - - - -
    - -
    - -
    -{% endblock %} diff --git a/module/webui/themes/dark/tml/base.html b/module/webui/themes/dark/tml/base.html deleted file mode 100644 index e7179acfa..000000000 --- a/module/webui/themes/dark/tml/base.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - - - - - - - -{% block title %}pyLoad {{_("Webinterface")}}{% endblock %} - -{% block head %} -{% endblock %} - - - - -
    - - -
    - {% block headpanel %} - - {% if user.is_authenticated %} - - -{% if update %} - -{{_("pyLoad Update available!")}} - -{% endif %} - - -{% if plugins %} - -{{_("Plugins updated, please restart!")}} - -{% endif %} - - -Captcha: -{{_("Captcha waiting")}} - - - User:{{user.name}} - -{% else %} - {{_("Please Login!")}} -{% endif %} - - {% endblock %} -
    - - -{% if user.is_authenticated %} -
    - -
    {% endif %} - -
    -
    - -{% if perms.STATUS %} - -{% endif %} - -{% if perms.LIST %} - -{% endif %} - -{% block pageactions %} -{% endblock %} -
    - -
    - -
    - -

    {% block subtitle %}pyLoad - {{_("Webinterface")}}{% endblock %}

    - -{% block statusbar %} -{% endblock %} - - -
    - -
    -
    - - -{% for message in messages %} -

    {{message}}

    -{% endfor %} - -
    - - {{_("loading")}} -
    - -{% block content %} -{% endblock content %} - -
    - - -
    -
    - - - - diff --git a/module/webui/themes/dark/tml/captcha.html b/module/webui/themes/dark/tml/captcha.html deleted file mode 100644 index ae1afe444..000000000 --- a/module/webui/themes/dark/tml/captcha.html +++ /dev/null @@ -1,42 +0,0 @@ - -
    - -
    - -

    {{_("Captcha reading")}}

    -

    {{_("Please read the text on the captcha.")}}

    - -
    - - - - - - - - - - - -
    - -
    - -
    - -
    - - - - -
    - -
    - -
    - -
    \ No newline at end of file diff --git a/module/webui/themes/dark/tml/downloads.html b/module/webui/themes/dark/tml/downloads.html deleted file mode 100644 index 0c7fb9209..000000000 --- a/module/webui/themes/dark/tml/downloads.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends '/dark/tml/base.html' %} - -{% block title %}Downloads - {{super()}} {% endblock %} - -{% block subtitle %} -{{_("Downloads")}} -{% endblock %} - -{% block content %} - -
      - {% for folder in files.folder %} -
    • - {{ folder.name }} -
        - {% for file in folder.files %} -
      • {{file}}
      • - {% endfor %} -
      -
    • - {% endfor %} - - {% for file in files.files %} -
    • {{ file }}
    • - {% endfor %} - -
    - -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/dark/tml/folder.html b/module/webui/themes/dark/tml/folder.html deleted file mode 100644 index 05176d51e..000000000 --- a/module/webui/themes/dark/tml/folder.html +++ /dev/null @@ -1,15 +0,0 @@ -
  • - - - - {{ name }} - - -    - -    - - - -
    {{ _("Folder is empty") }}
    -
  • \ No newline at end of file diff --git a/module/webui/themes/dark/tml/home.html b/module/webui/themes/dark/tml/home.html deleted file mode 100644 index b350b705e..000000000 --- a/module/webui/themes/dark/tml/home.html +++ /dev/null @@ -1,263 +0,0 @@ -{% extends '/dark/tml/base.html' %} -{% block head %} - - - -{% endblock %} - -{% block subtitle %} -{{_("Active Downloads")}} -{% endblock %} - -{% block menu %} -
  • - {{_("Home")}} -
  • -
  • - {{_("Queue")}} -
  • -
  • - {{_("Collector")}} -
  • -
  • - {{_("Downloads")}} -
  • -
  • - {{_("Logs")}} -
  • -
  • - {{_("Config")}} -
  • -{% endblock %} - -{% block content %} - - - - - - - - - - - - - {% for link in content %} - - - - - - - - - - - {% endfor %} - - -
    {{_("Name")}}{{_("Status")}}{{_("Information")}}{{_("Size")}}{{_("Progress")}}
    -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/dark/tml/info.html b/module/webui/themes/dark/tml/info.html deleted file mode 100644 index 7ff2b639b..000000000 --- a/module/webui/themes/dark/tml/info.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends '/dark/tml/base.html' %} - -{% block head %} -{% endblock %} - -{% block title %}{{ _("Information") }} - {{ super() }} {% endblock %} -{% block subtitle %}{{ _("Information") }}{% endblock %} - -{% block content %} -

    {{ _("News") }}

    - -
      - - - -

      {{ _("Support") }}

      - - - -

      {{ _("System") }}

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      {{ _("Python:") }}{{ python }}
      {{ _("OS:") }}{{ os }}
      {{ _("pyLoad version:") }}{{ version }}
      {{ _("Installation Folder:") }}{{ folder }}
      {{ _("Config Folder:") }}{{ config }}
      {{ _("Download Folder:") }}{{ download }}
      {{ _("Free Space:") }}{{ freespace }}
      {{ _("Language:") }}{{ language }}
      {{ _("Webinterface Port:") }}{{ webif }}
      {{ _("Remote Interface Port:") }}{{ remote }}
      - -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/dark/tml/login.html b/module/webui/themes/dark/tml/login.html deleted file mode 100644 index 9f5e2cb2f..000000000 --- a/module/webui/themes/dark/tml/login.html +++ /dev/null @@ -1,37 +0,0 @@ -{% extends '/dark/tml/base.html' %} - -{% block title %}{{_("Login")}} - {{super()}} {% endblock %} - -{% block content %} - -
      -
      -
      - -
      - Login -{% if errors %} -

      {{_("Your username and password didn't match. Please try again.")}}

      -{% endif %} - - - - - - - - - - - - - -
      {{_("Username")}}
      {{_("Password")}}
       
      -
      -
      -
      - -
      -
      - -{% endblock %} diff --git a/module/webui/themes/dark/tml/logout.html b/module/webui/themes/dark/tml/logout.html deleted file mode 100644 index 5320e07f5..000000000 --- a/module/webui/themes/dark/tml/logout.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends '/dark/tml/base.html' %} - -{% block head %} - -{% endblock %} - -{% block content %} -

      {{_("You were successfully logged out.")}}

      -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/dark/tml/logs.html b/module/webui/themes/dark/tml/logs.html deleted file mode 100644 index e178c6c5c..000000000 --- a/module/webui/themes/dark/tml/logs.html +++ /dev/null @@ -1,41 +0,0 @@ -{% extends '/dark/tml/base.html' %} - -{% block title %}{{_("Logs")}} - {{super()}} {% endblock %} -{% block subtitle %}{{_("Logs")}}{% endblock %} -{% block head %} - -{% endblock %} - -{% block content %} -
      - - -
      -
      - -   - - -
      -
      -
      {{warning}}
      -
      -
      - - {% for line in log %} - - {% endfor %} -
      {{line.line}}{{line.date}}{{line.level}}{{line.message}}
      -
      -
      -
      - - -
      -
      -
       
      -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/dark/tml/pathchooser.html b/module/webui/themes/dark/tml/pathchooser.html deleted file mode 100644 index 2b94f1019..000000000 --- a/module/webui/themes/dark/tml/pathchooser.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - -
      -
      -
      - - -
      - - {% if type == 'folder' %} - {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} - {% else %} - {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} - {% endif %} -
      - - - - - - - - {% if parentdir %} - - - - {% endif %} -{% for file in files %} - - {% if type == 'folder' %} - - {% else %} - - {% endif %} - - - - - -{% endfor %} -
      {{_("name")}}{{_("size")}}{{_("type")}}{{_("last modified")}}
      - {{_("parent directory")}} -
      {% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{{ file.size|float|filesizeformat }}{% if file.type == 'dir' %}directory{% else %}{{ file.ext|default("file") }}{% endif %}{{ file.modified|date("d.m.Y - H:i:s") }}
      -
      - - \ No newline at end of file diff --git a/module/webui/themes/dark/tml/queue.html b/module/webui/themes/dark/tml/queue.html deleted file mode 100644 index f68079106..000000000 --- a/module/webui/themes/dark/tml/queue.html +++ /dev/null @@ -1,104 +0,0 @@ -{% extends '/dark/tml/base.html' %} -{% block head %} - - - - -{% endblock %} - -{% if target %} - {% set name = _("Queue") %} -{% else %} - {% set name = _("Collector") %} -{% endif %} - -{% block title %}{{name}} - {{super()}} {% endblock %} -{% block subtitle %}{{name}}{% endblock %} - -{% block pageactions %} - -{% endblock %} - -{% block content %} -{% autoescape true %} - -
        -{% for package in content %} -
      • -
        - - -
        - - {{package.name}} -    - - -    - -    - -    - - -
        - {% set progress = (package.linksdone * 100) / package.linkstotal %} - -
        -
        - - -
        -
        - - -
        -
      • -{% endfor %} -
      -{% endautoescape %} -{% endblock %} - -{% block hidden %} -
      -
      -

      {{_("Edit Package")}}

      -

      {{_("Edit the package detais below.")}}

      - - - - - - - - - - - - -
      - -
      - -
      -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/dark/tml/settings.html b/module/webui/themes/dark/tml/settings.html deleted file mode 100644 index c9c0bed8a..000000000 --- a/module/webui/themes/dark/tml/settings.html +++ /dev/null @@ -1,204 +0,0 @@ -{% extends '/dark/tml/base.html' %} - -{% block title %}{{ _("Config") }} - {{ super() }} {% endblock %} -{% block subtitle %}{{ _("Config") }}{% endblock %} - -{% block head %} - - - - -{% endblock %} - -{% block content %} - - - -
      - -
      - - - - - - -
      - -
      -

         {{ _("Choose a section from the menu") }}

      -
      -
      - - -
      -
      - - - - - - -
      - - -
      -

         {{ _("Choose a section from the menu") }}

      -
      -
      - -
      - -
      - - - -
      - - - - - - - - - - - - - - - - - - - - {% for account in conf.accs %} - {% set plugin = account.type %} - - - - - - - - - - - - - - {% endfor %} -
      {{ _("Plugin") }}{{ _("Name") }}{{ _("Password") }}{{ _("Status") }}{{ _("Premium") }}{{ _("Valid until") }}{{ _("Traffic left") }}{{ _("Time") }}{{ _("Max Parallel") }}{{ _("Delete?") }}
      - {{ plugin }} - - - - {% if account.valid %} - - {{ _("valid") }} - {% else %} - - {{ _("not valid") }} - {% endif %} - - - {% if account.premium %} - - {{ _("yes") }} - {% else %} - - {{ _("no") }} - {% endif %} - - - - {{ account.validuntil }} - - - - {{ account.trafficleft }} - - - - - - - -
      - - - -
      -
      -
      -{% endblock %} -{% block hidden %} -
      -
      -

      {{_("Add Account")}}

      -

      {{_("Enter your account data to use premium features.")}}

      - - - - - - - - - - - -
      - -
      - -
      -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/dark/tml/settings_item.html b/module/webui/themes/dark/tml/settings_item.html deleted file mode 100644 index e417e564c..000000000 --- a/module/webui/themes/dark/tml/settings_item.html +++ /dev/null @@ -1,48 +0,0 @@ - - {% if section.outline %} - - {% endif %} - {% for okey, option in section.iteritems() %} - {% if okey not in ("desc","outline") %} - - - - - {% endif %} - {% endfor %} -
      {{ section.outline }}
      - {% if option.type == "bool" %} - - {% elif ";" in option.type %} - - {% elif option.type == "folder" %} - - - {% elif option.type == "file" %} - - - {% elif option.type == "password" %} - - {% else %} - - {% endif %} -
      \ No newline at end of file diff --git a/module/webui/themes/dark/tml/window.html b/module/webui/themes/dark/tml/window.html deleted file mode 100644 index 0b4f5362b..000000000 --- a/module/webui/themes/dark/tml/window.html +++ /dev/null @@ -1,52 +0,0 @@ - - -
      -
      -

      {{_("Add Package")}}

      -

      {{_("Paste your links or upload a container.")}}

      - - - - - - - - - - - - - - - - - - - - - - - -
      {{_("Queue")}}
      {{_("Collector")}}
      -
      - - - -
      - -
      - -
      \ No newline at end of file diff --git a/module/webui/themes/default/css/MooDialog.css b/module/webui/themes/default/css/MooDialog.css deleted file mode 100644 index d26bf2ff2..000000000 --- a/module/webui/themes/default/css/MooDialog.css +++ /dev/null @@ -1,91 +0,0 @@ -/* Created by Arian Stolwijk */ - -.MooDialog { -/* position: fixed;*/ - margin: 0 auto 0 -350px; - width:600px; - padding:14px; - left:50%; - top: 100px; - - position: absolute; - left: 50%; - z-index: 50000; - - background: #eef5f8; - color: black; - border-radius: 7px; - -moz-border-radius: 7px; - -webkit-border-radius: 7px; - border-radius: 7px; - -moz-box-shadow: 1px 1px 5px rgba(0,0,0,0.8); - -webkit-box-shadow: 1px 1px 5px rgba(0,0,0,0.8); - box-shadow: 1px 1px 5px rgba(0,0,0,0.8); -} - -.MooDialogTitle { - padding-top: 30px; -} - -.MooDialog .title { - position: absolute; - top: 0; - left: 0; - right: 0; - padding: 3px 20px; - background: #b7c4dc; - border-bottom: 1px solid #a1aec5; - font-weight: bold; - text-shadow: 1px 1px 0 #fff; - color: black; - border-radius: 7px; - -moz-border-radius: 7px; - -webkit-border-radius: 7px; -} - -.MooDialog .close { - background: url(../img/MooDialog/dialog-close.png) no-repeat; - width: 16px; - height: 16px; - display: block; - cursor: pointer; - top: -5px; - left: -5px; - position: absolute; -} - -.MooDialog .buttons { - text-align: right; - margin: 0; - padding: 0; - border: 0; - background: none; -} - -.MooDialog .iframe { - width: 100%; - height: 100%; -} - -.MooDialog .textInput { - width: 200px; - float: left; -} - -.MooDialog .MooDialogAlert, -.MooDialog .MooDialogConfirm, -.MooDialog .MooDialogPrompt, -.MooDialog .MooDialogError { - background: url(../img/MooDialog/dialog-warning.png) no-repeat; - padding-left: 40px; - min-height: 40px; -} - -.MooDialog .MooDialogConfirm, -.MooDialog .MooDialogPromt { - background: url(../img/MooDialog/dialog-question.png) no-repeat; -} - -.MooDialog .MooDialogError { - background: url(../img/MooDialog/dialog-error.png) no-repeat; -} diff --git a/module/webui/themes/default/css/default.css b/module/webui/themes/default/css/default.css deleted file mode 100644 index 5d4b9ebf2..000000000 --- a/module/webui/themes/default/css/default.css +++ /dev/null @@ -1,902 +0,0 @@ -.hidden { - display:none; -} -.leftalign { - text-align:left; -} -.centeralign { - text-align:center; -} -.rightalign { - text-align:right; -} - - -.dokuwiki div.plugin_translation ul li a.wikilink1:link, .dokuwiki div.plugin_translation ul li a.wikilink1:hover, .dokuwiki div.plugin_translation ul li a.wikilink1:active, .dokuwiki div.plugin_translation ul li a.wikilink1:visited { - background-color:#000080; - color:#fff !important; - text-decoration:none; - padding:0 0.2em; - margin:0.1em 0.2em; - border:none !important; -} -.dokuwiki div.plugin_translation ul li a.wikilink2:link, .dokuwiki div.plugin_translation ul li a.wikilink2:hover, .dokuwiki div.plugin_translation ul li a.wikilink2:active, .dokuwiki div.plugin_translation ul li a.wikilink2:visited { - background-color:#808080; - color:#fff !important; - text-decoration:none; - padding:0 0.2em; - margin:0.1em 0.2em; - border:none !important; -} - -.dokuwiki div.plugin_translation ul li a:hover img { - opacity:1.0; - height:15px; -} - -body { - margin:0; - padding:0; - background-color:white; - color:black; - font-size:12px; - font-family:Verdana, Helvetica, "Lucida Grande", Lucida, Arial, sans-serif; - font-family:sans-serif; - font-size:99, 96%; - font-size-adjust:none; - font-style:normal; - font-variant:normal; - font-weight:normal; - line-height:normal; -} -hr { - border-width:0; - border-bottom:1px #aaa dotted; -} -img { - border:none; -} -form { - margin:0px; - padding:0px; - border:none; - display:inline; - background:transparent; -} -ul li { - margin:5px; -} -textarea { - font-family:monospace; -} -table { - margin:0.5em 0; - border-collapse:collapse; -} -td { - padding:0.25em; - border:1pt solid #ADB9CC; -} -a { - color:#3465a4; - text-decoration:none; -} -a:hover { - text-decoration:underline; -} - -option { - border:0 none #fff; -} -strong.highlight { - background-color:#fc9; - padding:1pt; -} -#pagebottom { - clear:both; -} -hr { - height:1px; - color:#c0c0c0; - background-color:#c0c0c0; - border:none; - margin:.2em 0 .2em 0; -} - -.invisible { - margin:0px; - border:0px; - padding:0px; - height:0px; - visibility:hidden; -} -.left { - float:left !important; -} -.right { - float:right !important; -} -.center { - text-align:center; -} -div#body-wrapper { - padding:40px 40px 10px 40px; - font-size:127%; -} -div#content { - margin-top:-20px; - padding:0; - font-size:14px; - color:black; - line-height:1.5em; -} -h1, h2, h3, h4, h5, h6 { - background:transparent none repeat scroll 0 0; - border-bottom:1px solid #aaa; - color:black; - font-weight:normal; - margin:0; - padding:0; - padding-bottom:0.17em; - padding-top:0.5em; -} -h1 { - font-size:188%; - line-height:1.2em; - margin-bottom:0.1em; - padding-bottom:0; -} -h2 { - font-size:150%; -} -h3, h4, h5, h6 { - border-bottom:none; - font-weight:bold; -} -h3 { - font-size:132%; -} -h4 { - font-size:116%; -} -h5 { - font-size:100%; -} -h6 { - font-size:80%; -} -ul#page-actions, ul#page-actions-more { - float:right; - margin:10px 10px 0 10px; - padding:6px; - color:black; - background-color:#ececec; - list-style-type:none; - white-space: nowrap; - border-radius:5px; - -moz-border-radius:5px; -} -ul#user-actions { - padding:5px; - margin:0; - display:inline; - color:black; - background-color:#ececec; - list-style-type:none; - -moz-border-radius:3px; - border-radius:3px; -} -ul#page-actions li, ul#user-actions li, ul#page-actions-more li { - display:inline; -} -ul#page-actions a, ul#user-actions a, ul#page-actions-more a { - text-decoration:none; - color:black; - display:inline; - margin:0 3px; - padding:2px 0px 2px 18px; -} -ul#page-actions a:hover, ul#page-actions a:focus, ul#user-actions a:hover, ul#user-actions a:focus { - /*text-decoration:underline;*/ -} -/***************************/ -ul#page-actions2 { - float:left; - margin:10px 10px 0 10px; - padding:6px; - color:black; - background-color:#ececec; - list-style-type:none; - border-radius:5px; - -moz-border-radius:5px; -} -ul#user-actions2 { - padding:5px; - margin:0; - display:inline; - color:black; - background-color:#ececec; - list-style-type:none; - border-radius:3px; - -moz-border-radius:3px; -} -ul#page-actions2 li, ul#user-actions2 li { - display:inline; -} -ul#page-actions2 a, ul#user-actions2 a { - text-decoration:none; - color:black; - display:inline; - margin:0 3px; - padding:2px 0px 2px 18px; -} -ul#page-actions2 a:hover, ul#page-actions2 a:focus, ul#user-actions2 a:hover, ul#user-actions2 a:focus, -ul#page-actions-more a:hover, ul#page-actions-more a:focus{ - color: #4e7bb4; -} -/****************************/ -.hidden { - display:none; -} - -a.logout { - background:transparent url(../img/user-actions-logout.png) 0px 1px no-repeat; -} - -a.info { - background:transparent url(../img/user-info.png) 0px 1px no-repeat; -} - -a.admin { - background:transparent url(../img/user-actions-admin.png) 0px 1px no-repeat; -} -a.profile { - background:transparent url(../img/user-actions-profile.png) 0px 1px no-repeat; -} -a.create, a.edit { - background:transparent url(../img/page-tools-edit.png) 0px 1px no-repeat; -} -a.source, a.show { - background:transparent url(../img/page-tools-source.png) 0px 1px no-repeat; -} -a.revisions { - background:transparent url(../img/page-tools-revisions.png) 0px 1px no-repeat; -} -a.subscribe, a.unsubscribe { - background:transparent url(../img/page-tools-subscribe.png) 0px 1px no-repeat; -} -a.backlink { - background:transparent url(../img/page-tools-backlinks.png) 0px 1px no-repeat; -} -a.play { - background:transparent url(../img/control_play.png) 0px 1px no-repeat; -} -.time { - background:transparent url(../img/status_None.png) 0px 1px no-repeat; - padding: 2px 0px 2px 18px; - margin: 0px 3px; -} -.reconnect { - background:transparent url(../img/reconnect.png) 0px 1px no-repeat; - padding: 2px 0px 2px 18px; - margin: 0px 3px; -} -a.play:hover { - background:transparent url(../img/control_play_blue.png) 0px 1px no-repeat; -} -a.cancel { - background:transparent url(../img/control_cancel.png) 0px 1px no-repeat; -} -a.cancel:hover { - background:transparent url(../img/control_cancel_blue.png) 0px 1px no-repeat; -} -a.pause { - background:transparent url(../img/control_pause.png) 0px 1px no-repeat; -} -a.pause:hover { - background:transparent url(../img/control_pause_blue.png) 0px 1px no-repeat; - font-weight: bold; -} -a.stop { - background:transparent url(../img/control_stop.png) 0px 1px no-repeat; -} -a.stop:hover { - background:transparent url(../img/control_stop_blue.png) 0px 1px no-repeat; -} -a.add { - background:transparent url(../img/control_add.png) 0px 1px no-repeat; -} -a.add:hover { - background:transparent url(../img/control_add_blue.png) 0px 1px no-repeat; -} -a.cog { - background:transparent url(../img/cog.png) 0px 1px no-repeat; -} -#head-panel { - background:#525252 url(../img/head_bg1.png) bottom left repeat-x; -} -#head-panel h1 { - display:none; - margin:0; - text-decoration:none; - padding-top:0.8em; - padding-left:3.3em; - font-size:2.6em; - color:#eeeeec; -} -#head-panel #head-logo { - float:left; - margin:5px 0 -15px 5px; - padding:0; - overflow:visible; -} -#head-menu { - background:transparent url(../img/tabs-border-bottom.png) 0 100% repeat-x; - width:100%; - float:left; - margin:0; - padding:0; - padding-top:0.8em; -} -#head-menu ul { - list-style:none; - margin:0 1em 0 2em; -} -#head-menu ul li { - float:left; - margin:0; - margin-left:0.3em; - font-size:14px; - margin-bottom:4px; -} -#head-menu ul li.selected, #head-menu ul li:hover { - margin-bottom:0px; -} -#head-menu ul li a img { - height:22px; - width:22px; - vertical-align:middle; -} -#head-menu ul li a, #head-menu ul li a:link { - float:left; - text-decoration:none; - color:#555; - background:#eaeaea url(../img/tab-background.png) 0 100% repeat-x; - padding:3px 7px 3px 7px; - border:2px solid #ccc; - border-bottom:0px solid transparent; - padding-bottom:3px; - -moz-border-radius:5px; - border-radius:5px; -} -#head-menu ul li a:hover, #head-menu ul li a:focus { - color:#111; - padding-bottom:7px; - border-bottom:0px none transparent; - outline:none; - border-bottom-left-radius: 0px; - border-bottom-right-radius: 0px; - -moz-border-radius-bottomright:0px; - -moz-border-radius-bottomleft:0px; -} -#head-menu ul li a:focus { - margin-bottom:-4px; -} -#head-menu ul li.selected a { - color:#3566A5; - background:#fff; - padding-bottom:7px; - border-bottom:0px none transparent; - border-bottom-left-radius: 0px; - border-bottom-right-radius: 0px; - -moz-border-radius-bottomright:0px; - -moz-border-radius-bottomleft:0px; -} -#head-menu ul li.selected a:hover, #head-menu ul li.selected a:focus { - color:#111; -} -div#head-search-and-login { - float:right; - margin:0 1em 0 0; - background-color:#222; - padding:7px 7px 5px 5px; - color:white; - white-space: nowrap; - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-bottomright:6px; - -moz-border-radius-bottomleft:6px; -} -div#head-search-and-login form { - display:inline; - padding:0 3px; -} -div#head-search-and-login form input { - border:2px solid #888; - background:#eee; - font-size:14px; - padding:2px; - border-radius:3px; - -moz-border-radius:3px; -} -div#head-search-and-login form input:focus { - background:#fff; -} -#head-search { - font-size:14px; -} -#head-username, #head-password { - width:80px; - font-size:14px; -} -#pageinfo { - clear:both; - color:#888; - padding:0.6em 0; - margin:0; -} -#foot { - font-style:normal; - color:#888; - text-align:center; -} -#foot a { - color:#aaf; -} -#foot img { - vertical-align:middle; -} -div.toc { - border:1px dotted #888; - background:#f0f0f0; - margin:1em 0 1em 1em; - float:right; - font-size:95%; -} -div.toc .tocheader { - font-weight:bold; - margin:0.5em 1em; -} -div.toc ol { - margin:1em 0.5em 1em 1em; - padding:0; -} -div.toc ol li { - margin:0; - padding:0; - margin-left:1em; -} -div.toc ol ol { - margin:0.5em 0.5em 0.5em 1em; - padding:0; -} -div.recentchanges table { - clear:both; -} -div#editor-help { - font-size:90%; - border:1px dotted #888; - padding:0ex 1ex 1ex 1ex; - background:#f7f6f2; -} -div#preview { - margin-top:1em; -} -label.block { - display:block; - text-align:right; - font-weight:bold; -} -label.simple { - display:block; - text-align:left; - font-weight:normal; -} -label.block input.edit { - width:50%; -} -/*fieldset { - width:300px; - text-align:center; - padding:0.5em; - margin:auto; -} -*/ -div.editor { - margin:0 0 0 0; -} -table { - margin:0.5em 0; - border-collapse:collapse; -} -td { - padding:0.25em; - border:1pt solid #ADB9CC; -} -td p { - margin:0; - padding:0; -} -.u { - text-decoration:underline; -} -.footnotes ul { - padding:0 2em; - margin:0 0 1em; -} -.footnotes li { - list-style:none; -} -.userpref table, .userpref td { - border:none; -} -#message { - clear:both; - padding:5px 10px; - background-color:#eee; - border-bottom:2px solid #ccc; -} -#message p { - margin:5px 0; - padding:0; - font-weight:bold; -} -#message div.buttons { - font-weight:normal; -} -.diff { - width:99%; -} -.diff-title { - background-color:#C0C0C0; -} -.searchresult dd span { - font-weight:bold; -} -.boxtext { - font-family:tahoma, arial, sans-serif; - font-size:11px; - color:#000; - float:none; - padding:3px 0 0 10px; -} -.statusbutton { - width:32px; - height:32px; - float:left; - margin-left:-32px; - margin-right:5px; - opacity:0; - cursor:pointer -} -.dlsize { - float:left; - padding-right: 8px; -} -.dlspeed { - float:left; - padding-right: 8px; -} -.package { - margin-bottom: 10px; -} -.packagename { - font-weight: bold; -} - -.child { - margin-left: 20px; -} -.child_status { - margin-right: 10px; -} -.child_secrow { - font-size: 10px; -} - -.header, .header th { - text-align: left; - font-weight: normal; - background-color:#ececec; - -moz-border-radius:5px; - border-radius:5px; -} -.progress_bar { - background: #0C0; - height: 5px; - -} - -.queue { - border: none -} - -.queue tr td { - border: none -} - -.header, .header th{ - text-align: left; - font-weight: normal; -} - - -.clearer -{ - clear: both; - height: 1px; -} - -.left -{ - float: left; -} - -.right -{ - float: right; -} - - -.setfield -{ - display: table-cell; -} - -ul.tabs li a -{ - padding: 5px 16px 4px 15px; - border: none; - font-weight: bold; - - border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - -} - - -#tabs span -{ - display: none; -} - -#tabs span.selected -{ - display: inline; -} - -#tabsback -{ - background-color: #525252; - margin: 2px 0 0; - padding: 6px 4px 1px 4px; - - border-top-right-radius: 30px; - border-top-left-radius: 3px; - -moz-border-radius-topright: 30px; - -moz-border-radius-topleft: 3px; -} -ul.tabs -{ - list-style-type: none; - margin:0; - padding: 0 40px 0 0; -} - -ul.tabs li -{ - display: inline; - margin-left: 8px; -} - - -ul.tabs li a -{ - color: #42454a; - background-color: #eaeaea; - border: 1px none #c9c3ba; - margin: 0; - text-decoration: none; - - outline: 0; - - padding: 5px 16px 4px 15px; - font-weight: bold; - - border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - -} - -ul.tabs li a.selected, ul.tabs li a:hover -{ - color: #000; - background-color: white; - - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomright: 0; - -moz-border-radius-bottomleft: 0; -} - -ul.tabs li a:hover -{ - background-color: #f1f4ee; -} - -ul.tabs li a.selected -{ - font-weight: bold; - background-color: #525252; - padding-bottom: 5px; - color: white; -} - - -#tabs-body { - position: relative; - overflow: hidden; -} - - -span.tabContent -{ - border: 2px solid #525252; - margin: 0; - padding: 0; - padding-bottom: 10px; -} - -#tabs-body > span { - display: none; -} - -#tabs-body > span.active { - display: block; -} - -.hide -{ - display: none; -} - -.settable -{ - margin: 20px; - border: none; -} -.settable td -{ - border: none; - margin: 0; - padding: 5px; -} - -.settable th{ - padding-bottom: 8px; -} - -.settable.wide td , .settable.wide th { - padding-left: 15px; - padding-right: 15px; -} - - -/*settings navbar*/ -ul.nav { - margin: -30px 0 0; - padding: 0; - list-style: none; - position: absolute; -} - - -ul.nav li { - position: relative; - float: left; - padding: 5px; -} - -ul.nav > li a { - background: white; - -moz-border-radius: 4px 4px 4px 4px; - border: 1px solid #C9C3BA; - border-bottom: medium none; - color: black; -} - -ul.nav ul { - position: absolute; - top: 26px; - left: 10px; - margin: 0; - padding: 0; - list-style: none; - border: 1px solid #AAA; - background: #f1f1f1; - -webkit-box-shadow: 1px 1px 5px #AAA; - -moz-box-shadow: 1px 1px 5px #AAA; - box-shadow: 1px 1px 5px #AAA; - cursor: pointer; -} - -ul.nav .open { - display: block; -} - -ul.nav .close { - display: none; -} - -ul.nav ul li { - float: none; - padding: 0; -} - -ul.nav ul li a { - width: 130px; - background: #f1f1f1; - padding: 3px; - display: block; - font-weight: normal; -} - -ul.nav ul li a:hover { - background: #CDCDCD; -} - -ul.nav ul ul { - left: 137px; - top: 0; -} - -.purr-wrapper{ - margin:10px; -} - -/*Purr alert styles*/ - -.purr-alert{ - margin-bottom:10px; - padding:10px; - background:#000; - font-size:13px; - font-weight:bold; - color:#FFF; - -moz-border-radius:5px; - -webkit-border-radius:5px; - /*-moz-box-shadow: 0 0 10px rgba(255,255,0,.25);*/ - width:300px; -} -.purr-alert.error{ - color:#F55; - padding-left:30px; - background:url(../img/error.png) no-repeat #000 7px 10px; - width:280px; -} -.purr-alert.success{ - color:#5F5; - padding-left:30px; - background:url(../img/success.png) no-repeat #000 7px 10px; - width:280px; -} -.purr-alert.notice{ - color:#99F; - padding-left:30px; - background:url(../img/notice.png) no-repeat #000 7px 10px; - width:280px; -} - -table.system { - border: none; - margin-left: 10px; -} - -table.system td { - border: none -} - -table.system tr > td:first-child { - font-weight: bold; - padding-right: 10px; -} diff --git a/module/webui/themes/default/css/log.css b/module/webui/themes/default/css/log.css deleted file mode 100644 index 26449b244..000000000 --- a/module/webui/themes/default/css/log.css +++ /dev/null @@ -1,71 +0,0 @@ - -html, body, #content -{ - height: 100%; -} -#body-wrapper -{ - height: 70%; -} -.logdiv -{ - height: 90%; - width: 100%; - overflow: auto; - border: 2px solid #CCC; - outline: 1px solid #666; - background-color: #FFE; - margin-right: auto; - margin-left: auto; -} -.logform -{ - display: table; - margin: 0 auto 0 auto; - padding-top: 5px; -} -.logtable -{ - - margin: 0px; -} -.logtable td -{ - border: none; - white-space: nowrap; - - font-family: monospace; - font-size: 16px; - margin: 0px; - padding: 0px 10px 0px 10px; - line-height: 110%; -} -td.logline -{ - background-color: #EEE; - text-align:right; - padding: 0px 5px 0px 5px; -} -td.loglevel -{ - text-align:right; -} -.logperpage -{ - float: right; - padding-bottom: 8px; -} -.logpaginator -{ - float: left; - padding-top: 5px; -} -.logpaginator a -{ - padding: 0px 8px 0px 8px; -} -.logwarn -{ - text-align: center; - color: red; -} diff --git a/module/webui/themes/default/css/pathchooser.css b/module/webui/themes/default/css/pathchooser.css deleted file mode 100644 index 894cc335e..000000000 --- a/module/webui/themes/default/css/pathchooser.css +++ /dev/null @@ -1,68 +0,0 @@ -table { - width: 90%; - border: 1px dotted #888888; - font-family: sans-serif; - font-size: 10pt; -} - -th { - background-color: #525252; - color: #E0E0E0; -} - -table, tr, td { - background-color: #F0F0F0; -} - -a, a:visited { - text-decoration: none; - font-weight: bold; -} - -#paths { - width: 90%; - text-align: left; -} - -.file_directory { - color: #c0c0c0; -} -.path_directory { - color: #3c3c3c; -} -.file_file { - color: #3c3c3c; -} -.path_file { - color: #c0c0c0; -} - -.parentdir { - color: #000000; - font-size: 10pt; -} -.name { - text-align: left; -} -.size { - text-align: right; -} -.type { - text-align: left; -} -.mtime { - text-align: center; -} - -.path_abs_rel { - color: #3c3c3c; - text-decoration: none; - font-weight: bold; - font-family: sans-serif; - font-size: 10pt; -} - -.path_abs_rel a { - color: #3c3c3c; - font-style: italic; -} diff --git a/module/webui/themes/default/css/window.css b/module/webui/themes/default/css/window.css deleted file mode 100644 index 12829868b..000000000 --- a/module/webui/themes/default/css/window.css +++ /dev/null @@ -1,73 +0,0 @@ -/* ----------- stylized ----------- */ -.window_box h1{ - font-size:14px; - font-weight:bold; - margin-bottom:8px; -} -.window_box p{ - font-size:11px; - color:#666666; - margin-bottom:20px; - border-bottom:solid 1px #b7ddf2; - padding-bottom:10px; -} -.window_box label{ - display:block; - font-weight:bold; - text-align:right; - width:240px; - float:left; -} -.window_box .small{ - color:#666666; - display:block; - font-size:11px; - font-weight:normal; - text-align:right; - width:240px; -} -.window_box select, .window_box input{ - float:left; - font-size:12px; - padding:4px 2px; - border:solid 1px #aacfe4; - width:300px; - margin:2px 0 20px 10px; -} -.window_box .cont{ - float:left; - font-size:12px; - padding: 0px 10px 15px 0px; - width:300px; - margin:0px 0px 0px 10px; -} -.window_box .cont input{ - float: none; - margin: 0px 15px 0px 1px; -} -.window_box textarea{ - float:left; - font-size:12px; - padding:4px 2px; - border:solid 1px #aacfe4; - width:300px; - margin:2px 0 20px 10px; -} -.window_box button, .styled_button{ - clear:both; - margin-left:150px; - width:125px; - height:31px; - background:#666666 url(../img/button.png) no-repeat; - text-align:center; - line-height:31px; - color:#FFFFFF; - font-size:11px; - font-weight:bold; - border: 0px; -} - -.styled_button { - margin-left: 15px; - cursor: pointer; -} diff --git a/module/webui/themes/default/img/MooDialog/dialog-close.png b/module/webui/themes/default/img/MooDialog/dialog-close.png deleted file mode 100644 index 81ebb88b2..000000000 Binary files a/module/webui/themes/default/img/MooDialog/dialog-close.png and /dev/null differ diff --git a/module/webui/themes/default/img/MooDialog/dialog-error.png b/module/webui/themes/default/img/MooDialog/dialog-error.png deleted file mode 100644 index d70328403..000000000 Binary files a/module/webui/themes/default/img/MooDialog/dialog-error.png and /dev/null differ diff --git a/module/webui/themes/default/img/MooDialog/dialog-question.png b/module/webui/themes/default/img/MooDialog/dialog-question.png deleted file mode 100644 index b0af3db5b..000000000 Binary files a/module/webui/themes/default/img/MooDialog/dialog-question.png and /dev/null differ diff --git a/module/webui/themes/default/img/MooDialog/dialog-warning.png b/module/webui/themes/default/img/MooDialog/dialog-warning.png deleted file mode 100644 index aad64d4be..000000000 Binary files a/module/webui/themes/default/img/MooDialog/dialog-warning.png and /dev/null differ diff --git a/module/webui/themes/default/img/add_folder.png b/module/webui/themes/default/img/add_folder.png deleted file mode 100644 index 8acbc411b..000000000 Binary files a/module/webui/themes/default/img/add_folder.png and /dev/null differ diff --git a/module/webui/themes/default/img/ajax-loader.gif b/module/webui/themes/default/img/ajax-loader.gif deleted file mode 100644 index 2fd8e0737..000000000 Binary files a/module/webui/themes/default/img/ajax-loader.gif and /dev/null differ diff --git a/module/webui/themes/default/img/arrow_refresh.png b/module/webui/themes/default/img/arrow_refresh.png deleted file mode 100644 index 0de26566d..000000000 Binary files a/module/webui/themes/default/img/arrow_refresh.png and /dev/null differ diff --git a/module/webui/themes/default/img/arrow_right.png b/module/webui/themes/default/img/arrow_right.png deleted file mode 100644 index b1a181923..000000000 Binary files a/module/webui/themes/default/img/arrow_right.png and /dev/null differ diff --git a/module/webui/themes/default/img/big_button.gif b/module/webui/themes/default/img/big_button.gif deleted file mode 100644 index 7680490ea..000000000 Binary files a/module/webui/themes/default/img/big_button.gif and /dev/null differ diff --git a/module/webui/themes/default/img/big_button_over.gif b/module/webui/themes/default/img/big_button_over.gif deleted file mode 100644 index 2e3ee10d2..000000000 Binary files a/module/webui/themes/default/img/big_button_over.gif and /dev/null differ diff --git a/module/webui/themes/default/img/body.png b/module/webui/themes/default/img/body.png deleted file mode 100644 index 7ff1043e0..000000000 Binary files a/module/webui/themes/default/img/body.png and /dev/null differ diff --git a/module/webui/themes/default/img/button.png b/module/webui/themes/default/img/button.png deleted file mode 100644 index 890160614..000000000 Binary files a/module/webui/themes/default/img/button.png and /dev/null differ diff --git a/module/webui/themes/default/img/closebtn.gif b/module/webui/themes/default/img/closebtn.gif deleted file mode 100644 index 3e27e6030..000000000 Binary files a/module/webui/themes/default/img/closebtn.gif and /dev/null differ diff --git a/module/webui/themes/default/img/cog.png b/module/webui/themes/default/img/cog.png deleted file mode 100644 index 67de2c6cc..000000000 Binary files a/module/webui/themes/default/img/cog.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_add.png b/module/webui/themes/default/img/control_add.png deleted file mode 100644 index d39886893..000000000 Binary files a/module/webui/themes/default/img/control_add.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_add_blue.png b/module/webui/themes/default/img/control_add_blue.png deleted file mode 100644 index d11b7f41d..000000000 Binary files a/module/webui/themes/default/img/control_add_blue.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_cancel.png b/module/webui/themes/default/img/control_cancel.png deleted file mode 100644 index 7b9bc3fba..000000000 Binary files a/module/webui/themes/default/img/control_cancel.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_cancel_blue.png b/module/webui/themes/default/img/control_cancel_blue.png deleted file mode 100644 index 0c5c96ce3..000000000 Binary files a/module/webui/themes/default/img/control_cancel_blue.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_pause.png b/module/webui/themes/default/img/control_pause.png deleted file mode 100644 index 2d9ce9c4e..000000000 Binary files a/module/webui/themes/default/img/control_pause.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_pause_blue.png b/module/webui/themes/default/img/control_pause_blue.png deleted file mode 100644 index ec61099b0..000000000 Binary files a/module/webui/themes/default/img/control_pause_blue.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_play.png b/module/webui/themes/default/img/control_play.png deleted file mode 100644 index 0846555d0..000000000 Binary files a/module/webui/themes/default/img/control_play.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_play_blue.png b/module/webui/themes/default/img/control_play_blue.png deleted file mode 100644 index f8c8ec683..000000000 Binary files a/module/webui/themes/default/img/control_play_blue.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_stop.png b/module/webui/themes/default/img/control_stop.png deleted file mode 100644 index 893bb60e5..000000000 Binary files a/module/webui/themes/default/img/control_stop.png and /dev/null differ diff --git a/module/webui/themes/default/img/control_stop_blue.png b/module/webui/themes/default/img/control_stop_blue.png deleted file mode 100644 index e6f75d232..000000000 Binary files a/module/webui/themes/default/img/control_stop_blue.png and /dev/null differ diff --git a/module/webui/themes/default/img/delete.png b/module/webui/themes/default/img/delete.png deleted file mode 100644 index 08f249365..000000000 Binary files a/module/webui/themes/default/img/delete.png and /dev/null differ diff --git a/module/webui/themes/default/img/drag_corner.gif b/module/webui/themes/default/img/drag_corner.gif deleted file mode 100644 index befb1adf1..000000000 Binary files a/module/webui/themes/default/img/drag_corner.gif and /dev/null differ diff --git a/module/webui/themes/default/img/error.png b/module/webui/themes/default/img/error.png deleted file mode 100644 index c37bd062e..000000000 Binary files a/module/webui/themes/default/img/error.png and /dev/null differ diff --git a/module/webui/themes/default/img/folder.png b/module/webui/themes/default/img/folder.png deleted file mode 100644 index 784e8fa48..000000000 Binary files a/module/webui/themes/default/img/folder.png and /dev/null differ diff --git a/module/webui/themes/default/img/full.png b/module/webui/themes/default/img/full.png deleted file mode 100644 index fea52af76..000000000 Binary files a/module/webui/themes/default/img/full.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-login.png b/module/webui/themes/default/img/head-login.png deleted file mode 100644 index b59b7cbbf..000000000 Binary files a/module/webui/themes/default/img/head-login.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-collector.png b/module/webui/themes/default/img/head-menu-collector.png deleted file mode 100644 index 861be40bc..000000000 Binary files a/module/webui/themes/default/img/head-menu-collector.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-config.png b/module/webui/themes/default/img/head-menu-config.png deleted file mode 100644 index bbf43d4f3..000000000 Binary files a/module/webui/themes/default/img/head-menu-config.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-development.png b/module/webui/themes/default/img/head-menu-development.png deleted file mode 100644 index fad150fe1..000000000 Binary files a/module/webui/themes/default/img/head-menu-development.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-download.png b/module/webui/themes/default/img/head-menu-download.png deleted file mode 100644 index 98c5da9db..000000000 Binary files a/module/webui/themes/default/img/head-menu-download.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-home.png b/module/webui/themes/default/img/head-menu-home.png deleted file mode 100644 index 9d62109aa..000000000 Binary files a/module/webui/themes/default/img/head-menu-home.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-index.png b/module/webui/themes/default/img/head-menu-index.png deleted file mode 100644 index 44d631064..000000000 Binary files a/module/webui/themes/default/img/head-menu-index.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-news.png b/module/webui/themes/default/img/head-menu-news.png deleted file mode 100644 index 43950ebc9..000000000 Binary files a/module/webui/themes/default/img/head-menu-news.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-queue.png b/module/webui/themes/default/img/head-menu-queue.png deleted file mode 100644 index be98793ce..000000000 Binary files a/module/webui/themes/default/img/head-menu-queue.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-recent.png b/module/webui/themes/default/img/head-menu-recent.png deleted file mode 100644 index fc9b0497f..000000000 Binary files a/module/webui/themes/default/img/head-menu-recent.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-menu-wiki.png b/module/webui/themes/default/img/head-menu-wiki.png deleted file mode 100644 index 07cf0102d..000000000 Binary files a/module/webui/themes/default/img/head-menu-wiki.png and /dev/null differ diff --git a/module/webui/themes/default/img/head-search-noshadow.png b/module/webui/themes/default/img/head-search-noshadow.png deleted file mode 100644 index aafdae015..000000000 Binary files a/module/webui/themes/default/img/head-search-noshadow.png and /dev/null differ diff --git a/module/webui/themes/default/img/head_bg1.png b/module/webui/themes/default/img/head_bg1.png deleted file mode 100644 index f2848c3cc..000000000 Binary files a/module/webui/themes/default/img/head_bg1.png and /dev/null differ diff --git a/module/webui/themes/default/img/images.png b/module/webui/themes/default/img/images.png deleted file mode 100644 index 184860d1e..000000000 Binary files a/module/webui/themes/default/img/images.png and /dev/null differ diff --git a/module/webui/themes/default/img/notice.png b/module/webui/themes/default/img/notice.png deleted file mode 100644 index 12cd1aef9..000000000 Binary files a/module/webui/themes/default/img/notice.png and /dev/null differ diff --git a/module/webui/themes/default/img/package_go.png b/module/webui/themes/default/img/package_go.png deleted file mode 100644 index aace63ad6..000000000 Binary files a/module/webui/themes/default/img/package_go.png and /dev/null differ diff --git a/module/webui/themes/default/img/page-tools-backlinks.png b/module/webui/themes/default/img/page-tools-backlinks.png deleted file mode 100644 index 3eb6a9ce3..000000000 Binary files a/module/webui/themes/default/img/page-tools-backlinks.png and /dev/null differ diff --git a/module/webui/themes/default/img/page-tools-edit.png b/module/webui/themes/default/img/page-tools-edit.png deleted file mode 100644 index 188e1c12b..000000000 Binary files a/module/webui/themes/default/img/page-tools-edit.png and /dev/null differ diff --git a/module/webui/themes/default/img/page-tools-revisions.png b/module/webui/themes/default/img/page-tools-revisions.png deleted file mode 100644 index 5c3b8587f..000000000 Binary files a/module/webui/themes/default/img/page-tools-revisions.png and /dev/null differ diff --git a/module/webui/themes/default/img/parseUri.png b/module/webui/themes/default/img/parseUri.png deleted file mode 100644 index 937bded9d..000000000 Binary files a/module/webui/themes/default/img/parseUri.png and /dev/null differ diff --git a/module/webui/themes/default/img/pencil.png b/module/webui/themes/default/img/pencil.png deleted file mode 100644 index 0bfecd50e..000000000 Binary files a/module/webui/themes/default/img/pencil.png and /dev/null differ diff --git a/module/webui/themes/default/img/pyload-logo.png b/module/webui/themes/default/img/pyload-logo.png deleted file mode 100644 index 2443cd8b1..000000000 Binary files a/module/webui/themes/default/img/pyload-logo.png and /dev/null differ diff --git a/module/webui/themes/default/img/reconnect.png b/module/webui/themes/default/img/reconnect.png deleted file mode 100644 index 49b269145..000000000 Binary files a/module/webui/themes/default/img/reconnect.png and /dev/null differ diff --git a/module/webui/themes/default/img/status_None.png b/module/webui/themes/default/img/status_None.png deleted file mode 100644 index 293b13f77..000000000 Binary files a/module/webui/themes/default/img/status_None.png and /dev/null differ diff --git a/module/webui/themes/default/img/status_downloading.png b/module/webui/themes/default/img/status_downloading.png deleted file mode 100644 index fb4ebc850..000000000 Binary files a/module/webui/themes/default/img/status_downloading.png and /dev/null differ diff --git a/module/webui/themes/default/img/status_failed.png b/module/webui/themes/default/img/status_failed.png deleted file mode 100644 index c37bd062e..000000000 Binary files a/module/webui/themes/default/img/status_failed.png and /dev/null differ diff --git a/module/webui/themes/default/img/status_finished.png b/module/webui/themes/default/img/status_finished.png deleted file mode 100644 index 89c8129a4..000000000 Binary files a/module/webui/themes/default/img/status_finished.png and /dev/null differ diff --git a/module/webui/themes/default/img/status_offline.png b/module/webui/themes/default/img/status_offline.png deleted file mode 100644 index 0cfd58596..000000000 Binary files a/module/webui/themes/default/img/status_offline.png and /dev/null differ diff --git a/module/webui/themes/default/img/status_proc.png b/module/webui/themes/default/img/status_proc.png deleted file mode 100644 index 67de2c6cc..000000000 Binary files a/module/webui/themes/default/img/status_proc.png and /dev/null differ diff --git a/module/webui/themes/default/img/status_queue.png b/module/webui/themes/default/img/status_queue.png deleted file mode 100644 index 293b13f77..000000000 Binary files a/module/webui/themes/default/img/status_queue.png and /dev/null differ diff --git a/module/webui/themes/default/img/status_waiting.png b/module/webui/themes/default/img/status_waiting.png deleted file mode 100644 index 2842cc338..000000000 Binary files a/module/webui/themes/default/img/status_waiting.png and /dev/null differ diff --git a/module/webui/themes/default/img/success.png b/module/webui/themes/default/img/success.png deleted file mode 100644 index 89c8129a4..000000000 Binary files a/module/webui/themes/default/img/success.png and /dev/null differ diff --git a/module/webui/themes/default/img/tab-background.png b/module/webui/themes/default/img/tab-background.png deleted file mode 100644 index 29a5d1991..000000000 Binary files a/module/webui/themes/default/img/tab-background.png and /dev/null differ diff --git a/module/webui/themes/default/img/tabs-border-bottom.png b/module/webui/themes/default/img/tabs-border-bottom.png deleted file mode 100644 index 02440f428..000000000 Binary files a/module/webui/themes/default/img/tabs-border-bottom.png and /dev/null differ diff --git a/module/webui/themes/default/img/user-actions-logout.png b/module/webui/themes/default/img/user-actions-logout.png deleted file mode 100644 index 0010931e2..000000000 Binary files a/module/webui/themes/default/img/user-actions-logout.png and /dev/null differ diff --git a/module/webui/themes/default/img/user-actions-profile.png b/module/webui/themes/default/img/user-actions-profile.png deleted file mode 100644 index 46573fff6..000000000 Binary files a/module/webui/themes/default/img/user-actions-profile.png and /dev/null differ diff --git a/module/webui/themes/default/img/user-info.png b/module/webui/themes/default/img/user-info.png deleted file mode 100644 index 6e643100f..000000000 Binary files a/module/webui/themes/default/img/user-info.png and /dev/null differ diff --git a/module/webui/themes/default/js/render/admin.coffee b/module/webui/themes/default/js/render/admin.coffee deleted file mode 100644 index 5afbcbb66..000000000 --- a/module/webui/themes/default/js/render/admin.coffee +++ /dev/null @@ -1,58 +0,0 @@ -root = this - -window.addEvent "domready", -> - - root.passwordDialog = new MooDialog {destroyOnHide: false} - root.passwordDialog.setContent $ 'password_box' - - $("login_password_reset").addEvent "click", (e) -> root.passwordDialog.close() - $("login_password_button").addEvent "click", (e) -> - - newpw = $("login_new_password").get("value") - newpw2 = $("login_new_password2").get("value") - - if newpw is newpw2 - form = $("password_form") - form.set "send", { - onSuccess: (data) -> - root.notify.alert "Success", { - 'className': 'success' - } - onFailure: (data) -> - root.notify.alert "Error", { - 'className': 'error' - } - } - - form.send() - - root.passwordDialog.close() - else - alert '{{_("Passwords did not match.")}}' - - e.stop() - - for item in $$(".change_password") - id = item.get("id") - user = id.split("|")[1] - $("user_login").set("value", user) - item.addEvent "click", (e) -> root.passwordDialog.open() - - $('quit-pyload').addEvent "click", (e) -> - new MooDialog.Confirm "{{_('You are really sure you want to quit pyLoad?')}}", -> - new Request.JSON({ - url: '/api/kill' - method: 'get' - }).send() - , -> - e.stop() - - $('restart-pyload').addEvent "click", (e) -> - new MooDialog.Confirm "{{_('Are you sure you want to restart pyLoad?')}}", -> - new Request.JSON({ - url: '/api/restart' - method: 'get' - onSuccess: (data) -> alert "{{_('pyLoad restarted')}}" - }).send() - , -> - e.stop() diff --git a/module/webui/themes/default/js/render/admin.min.js b/module/webui/themes/default/js/render/admin.min.js deleted file mode 100644 index 94a5e494d..000000000 --- a/module/webui/themes/default/js/render/admin.min.js +++ /dev/null @@ -1,3 +0,0 @@ -{% autoescape true %} -var root;root=this;window.addEvent("domready",function(){var f,c,b,e,a,d;root.passwordDialog=new MooDialog({destroyOnHide:false});root.passwordDialog.setContent($("password_box"));$("login_password_reset").addEvent("click",function(g){return root.passwordDialog.close()});$("login_password_button").addEvent("click",function(j){var h,i,g;i=$("login_new_password").get("value");g=$("login_new_password2").get("value");if(i===g){h=$("password_form");h.set("send",{onSuccess:function(k){return root.notify.alert("Success",{className:"success"})},onFailure:function(k){return root.notify.alert("Error",{className:"error"})}});h.send();root.passwordDialog.close()}else{alert('{{_("Passwords did not match.")}}')}return j.stop()});d=$$(".change_password");for(e=0,a=d.length;e - filesizename = new Array("B", "KiB", "MiB", "GiB", "TiB", "PiB") - loga = Math.log(size) / Math.log(1024) - i = Math.floor(loga) - a = Math.pow(1024, i) - if size is 0 then "0 B" else (Math.round(size * 100 / a) / 100 + " " + filesizename[i]) - - -parseUri = () -> - oldString = $("add_links").value - regxp = new RegExp('(ht|f)tp(s?):\/\/[a-zA-Z0-9\-\.\/\?=_&%#]+[<| |\"|\'|\r|\n|\t]{1}', 'g') - resu = oldString.match regxp - return if resu == null - res = "" - - for part in resu - if part.indexOf(" ") != -1 - res = res + part.replace(" ", " \n") - else if part.indexOf("\t") != -1 - res = res + part.replace("\t", " \n") - else if part.indexOf("\r") != -1 - res = res + part.replace("\r", " \n") - else if part.indexOf("\"") != -1 - res = res + part.replace("\"", " \n") - else if part.indexOf("<") != -1 - res = res + part.replace("<", " \n") - else if part.indexOf("'") != -1 - res = res + part.replace("'", " \n") - else - res = res + part.replace("\n", " \n") - - $("add_links").value = res - - -Array::remove = (from, to) -> - rest = this.slice((to || from) + 1 || this.length) - this.length = from < 0 ? this.length + from : from - return [] if this.length == 0 - return this.push.apply(this, rest) - - -document.addEvent "domready", -> - - # global notification - root.notify = new Purr { - 'mode': 'top' - 'position': 'center' - } - - root.captchaBox = new MooDialog {destroyOnHide: false} - root.captchaBox.setContent $ 'cap_box' - - root.addBox = new MooDialog {destroyOnHide: false} - root.addBox.setContent $ 'add_box' - - $('add_form').onsubmit = -> - $('add_form').target = 'upload_target' - if $('add_name').value is "" and $('add_file').value is "" - alert '{{_("Please Enter a packagename.")}}' - return false - else - root.addBox.close() - return true - - $('add_reset').addEvent 'click', -> root.addBox.close() - - $('action_add').addEvent 'click', -> $("add_form").reset(); root.addBox.open() - $('action_play').addEvent 'click', -> new Request({method: 'get', url: '/api/unpauseServer'}).send() - $('action_cancel').addEvent 'click', -> new Request({method: 'get', url: '/api/stopAllDownloads'}).send() - $('action_stop').addEvent 'click', -> new Request({method: 'get', url: '/api/pauseServer'}).send() - - - # captcha events - - $('cap_info').addEvent 'click', -> - load_captcha "get", "" - root.captchaBox.open() - $('cap_reset').addEvent 'click', -> root.captchaBox.close() - $('cap_form').addEvent 'submit', (e) -> - submit_captcha() - e.stop() - - $('cap_positional').addEvent 'click', on_captcha_click - - new Request.JSON({ - url: "/json/status" - onSuccess: LoadJsonToContent - secure: false - async: true - initialDelay: 0 - delay: 4000 - limit: 3000 - }).startTimer() - - -LoadJsonToContent = (data) -> - $("speed").set 'text', humanFileSize(data.speed)+"/s" - $("aktiv").set 'text', data.active - $("aktiv_from").set 'text', data.queue - $("aktiv_total").set 'text', data.total - - if data.captcha - if $("cap_info").getStyle("display") != "inline" - $("cap_info").setStyle 'display', 'inline' - root.notify.alert '{{_("New Captcha Request")}}', { - 'className': 'notify' - } - else - $("cap_info").setStyle 'display', 'none' - - - if data.download - $("time").set 'text', ' {{_("on")}}' - $("time").setStyle 'background-color', "#8ffc25" - else - $("time").set 'text', ' {{_("off")}}' - $("time").setStyle 'background-color', "#fc6e26" - - if data.reconnect - $("reconnect").set 'text', ' {{_("on")}}' - $("reconnect").setStyle 'background-color', "#8ffc25" - else - $("reconnect").set 'text', ' {{_("off")}}' - $("reconnect").setStyle 'background-color', "#fc6e26" - - return null - - -set_captcha = (data) -> - $('cap_id').set 'value', data.id - if (data.result_type is 'textual') - $('cap_textual_img').set 'src', data.src - $('cap_title').set 'text', '{{_("Please read the text on the captcha.")}}' - $('cap_submit').setStyle 'display', 'inline' - $('cap_textual').setStyle 'display', 'block' - $('cap_positional').setStyle 'display', 'none' - - else if (data.result_type == 'positional') - $('cap_positional_img').set('src', data.src) - $('cap_title').set('text', '{{_("Please click on the right captcha position.")}}') - $('cap_submit').setStyle('display', 'none') - $('cap_textual').setStyle('display', 'none') - - -load_captcha = (method, post) -> - new Request.JSON({ - url: "/json/set_captcha" - onSuccess: (data) -> set_captcha(data) if data.captcha else clear_captcha() - secure: false - async: true - method: method - }).send(post) - - -clear_captcha = -> - $('cap_textual').setStyle 'display', 'none' - $('cap_textual_img').set 'src', '' - $('cap_positional').setStyle 'display', 'none' - $('cap_positional_img').set 'src', '' - $('cap_title').set 'text', '{{_("No Captchas to read.")}}' - - -submit_captcha = -> - load_captcha("post", "cap_id=" + $('cap_id').get('value') + "&cap_result=" + $('cap_result').get('value') ) - $('cap_result').set('value', '') - - -on_captcha_click = (e) -> - position = e.target.getPosition() - x = e.page.x - position.x - y = e.page.y - position.y - $('cap_result').value = x + "," + y - submit_captcha() diff --git a/module/webui/themes/default/js/render/base.min.js b/module/webui/themes/default/js/render/base.min.js deleted file mode 100644 index 1ba1d73f9..000000000 --- a/module/webui/themes/default/js/render/base.min.js +++ /dev/null @@ -1,3 +0,0 @@ -{% autoescape true %} -var LoadJsonToContent,clear_captcha,humanFileSize,load_captcha,on_captcha_click,parseUri,root,set_captcha,submit_captcha;root=this;humanFileSize=function(f){var c,d,e,b;d=new Array("B","KiB","MiB","GiB","TiB","PiB");b=Math.log(f)/Math.log(1024);e=Math.floor(b);c=Math.pow(1024,e);if(f===0){return"0 B"}else{return Math.round(f*100/c)/100+" "+d[e]}};parseUri=function(){var b,c,g,e,d,f,a;b=$("add_links").value;g=new RegExp("(ht|f)tp(s?)://[a-zA-Z0-9-./?=_&%#]+[<| |\"|'|\r|\n|\t]{1}","g");d=b.match(g);if(d===null){return}e="";for(f=0,a=d.length;f 0) - { - uls[0].getChildren("li.folder").each(function(fld) { - var path = fld.getElements("input.path")[0].get("value"); - var name = fld.getElements("input.name")[0].get("value"); - this.directories.push(new Item(this, path, name, fld)); - }.bind(this)); - uls[0].getChildren("li.file").each(function(fld) { - var path = fld.getElements("input.path")[0].get("value"); - var name = fld.getElements("input.name")[0].get("value"); - this.files.push(new Item(this, path, name, fld)); - }.bind(this)); - } - }, - - reorderElements: function() { - //TODO sort the main ul again (to keep data ordered after renaming something) - }, - - del: function(event) { - $("confirm_form").removeEvents("submit"); - $("confirm_form").addEvent("submit", this.deleteDirectory.bind(this)); - - $$("#confirm_form p").set('html', '{{_(("Are you sure you want to delete the selected item?"))}}'); - - show_confirm_box(); - event.stop(); - }, - - deleteDirectory: function(event) { - hide_confirm_box(); - new Request.JSON({ - method: 'POST', - url: "/json/filemanager/delete", - data: {'path': this.path, 'name': this.name}, - onSuccess: function(data) { - if(data.response == "success") - { - new Fx.Tween(this.ele).start('opacity', 0); - var ul = this.ele.parentNode; - this.ele.dispose(); - //if this was the only child, add a "empty folder" div - if(!ul.getChildren('li')[0]) - { - var div = new Element("div", { 'html': '{{ _("Folder is empty") }}' }); - div.replaces(ul); - } - - indicateSuccess(); - } else - { - //error from json code... - indicateFail(); - } - }.bind(this), - onFailure: indicateFail - }).send(); - - event.stop(); - }, - - rename: function(event) { - $("rename_form").removeEvents("submit"); - $("rename_form").addEvent("submit", this.renameDirectory.bind(this)); - - $("path").set("value", this.path); - $("old_name").set("value", this.name); - $("new_name").set("value", this.name); - - show_rename_box(); - event.stop(); - }, - - renameDirectory: function(event) { - hide_rename_box(); - new Request.JSON({ - method: 'POST', - url: "/json/filemanager/rename", - onSuccess: function(data) { - if(data.response == "success") - { - this.name = $("new_name").get("value"); - this.ele.getElements("b")[0].set('html', $("new_name").get("value")); - this.reorderElements(); - indicateSuccess(); - } else - { - //error from json code... - indicateFail(); - } - }.bind(this), - onFailure: indicateFail - }).send($("rename_form").toQueryString()); - - event.stop(); - }, - - mkdir: function(event) { - new Request.JSON({ - method: 'POST', - url: "/json/filemanager/mkdir", - data: {'path': this.path + "/" + this.name, 'name': '{{_("New folder")}}'}, - onSuccess: function(data) { - if(data.response == "success") - { - new Request.HTML({ - method: 'POST', - url: "/filemanager/get_dir", - data: {'path': data.path, 'name': data.name}, - onSuccess: function(li) { - //add node as first child of ul - var ul = this.ele.getChildren('ul')[0]; - if(!ul) - { - //remove the "Folder Empty" div - this.ele.getChildren('div').dispose(); - - //create new ul to contain subfolder - ul = new Element("ul"); - ul.inject(this.ele, 'bottom'); - } - li[0].inject(ul, 'top'); - - //add directory as a subdirectory of the current item - this.directories.push(new Item(this.ui, data.path, data.name, ul.firstChild)); - }.bind(this), - onFailure: indicateFail - }).send(); - indicateSuccess(); - } else - { - //error from json code... - indicateFail(); - } - }.bind(this), - onFailure: indicateFail - }).send(); - - event.stop(); - }, - - toggle: function() { - var child = this.ele.getElement('ul'); - if(child == null) - child = this.ele.getElement('div'); - - if(child != null) - { - if (child.getStyle('display') == "block") { - child.dissolve(); - } else { - child.reveal(); - } - } - } -}); diff --git a/module/webui/themes/default/js/render/package.js b/module/webui/themes/default/js/render/package.js deleted file mode 100644 index 659a8e6fc..000000000 --- a/module/webui/themes/default/js/render/package.js +++ /dev/null @@ -1,376 +0,0 @@ -var root = this; - -document.addEvent("domready", function() { - root.load = new Fx.Tween($("load-indicator"), {link: "cancel"}); - root.load.set("opacity", 0); - - - root.packageBox = new MooDialog({destroyOnHide: false}); - root.packageBox.setContent($('pack_box')); - - $('pack_reset').addEvent('click', function() { - $('pack_form').reset(); - root.packageBox.close(); - }); -}); - -function indicateLoad() { - //$("load-indicator").reveal(); - root.load.start("opacity", 1) -} - -function indicateFinish() { - root.load.start("opacity", 0) -} - -function indicateSuccess() { - indicateFinish(); - root.notify.alert('{{_("Success")}}.', { - 'className': 'success' - }); -} - -function indicateFail() { - indicateFinish(); - root.notify.alert('{{_("Failed")}}.', { - 'className': 'error' - }); -} - -var PackageUI = new Class({ - initialize: function(url, type) { - this.url = url; - this.type = type; - this.packages = []; - this.parsePackages(); - - this.sorts = new Sortables($("package-list"), { - constrain: false, - clone: true, - revert: true, - opacity: 0.4, - handle: ".package_drag", - onComplete: this.saveSort.bind(this) - }); - - $("del_finished").addEvent("click", this.deleteFinished.bind(this)); - $("restart_failed").addEvent("click", this.restartFailed.bind(this)); - - }, - - parsePackages: function() { - $("package-list").getChildren("li").each(function(ele) { - var id = ele.getFirst().get("id").match(/[0-9]+/); - this.packages.push(new Package(this, id, ele)) - }.bind(this)) - }, - - loadPackages: function() { - }, - - deleteFinished: function() { - indicateLoad(); - new Request.JSON({ - method: 'get', - url: '/api/deleteFinished', - onSuccess: function(data) { - if (data.length > 0) { - window.location.reload() - } else { - this.packages.each(function(pack) { - pack.close(); - }); - indicateSuccess(); - } - }.bind(this), - onFailure: indicateFail - }).send(); - }, - - restartFailed: function() { - indicateLoad(); - new Request.JSON({ - method: 'get', - url: '/api/restartFailed', - onSuccess: function(data) { - this.packages.each(function(pack) { - pack.close(); - }); - indicateSuccess(); - }.bind(this), - onFailure: indicateFail - }).send(); - }, - - startSort: function(ele, copy) { - }, - - saveSort: function(ele, copy) { - var order = []; - this.sorts.serialize(function(li, pos) { - if (li == ele && ele.retrieve("order") != pos) { - order.push(ele.retrieve("pid") + "|" + pos) - } - li.store("order", pos) - }); - if (order.length > 0) { - indicateLoad(); - new Request.JSON({ - method: 'get', - url: '/json/package_order/' + order[0], - onSuccess: indicateFinish, - onFailure: indicateFail - }).send(); - } - } - -}); - -var Package = new Class({ - initialize: function(ui, id, ele, data) { - this.ui = ui; - this.id = id; - this.linksLoaded = false; - - if (!ele) { - this.createElement(data); - } else { - this.ele = ele; - this.order = ele.getElements("div.order")[0].get("html"); - this.ele.store("order", this.order); - this.ele.store("pid", this.id); - this.parseElement(); - } - - var pname = this.ele.getElements(".packagename")[0]; - this.buttons = new Fx.Tween(this.ele.getElements(".buttons")[0], {link: "cancel"}); - this.buttons.set("opacity", 0); - - pname.addEvent("mouseenter", function(e) { - this.buttons.start("opacity", 1) - }.bind(this)); - - pname.addEvent("mouseleave", function(e) { - this.buttons.start("opacity", 0) - }.bind(this)); - - - }, - - createElement: function() { - alert("create") - }, - - parseElement: function() { - var imgs = this.ele.getElements('img'); - - this.name = this.ele.getElements('.name')[0]; - this.folder = this.ele.getElements('.folder')[0]; - this.password = this.ele.getElements('.password')[0]; - - imgs[1].addEvent('click', this.deletePackage.bind(this)); - imgs[2].addEvent('click', this.restartPackage.bind(this)); - imgs[3].addEvent('click', this.editPackage.bind(this)); - imgs[4].addEvent('click', this.movePackage.bind(this)); - - this.ele.getElement('.packagename').addEvent('click', this.toggle.bind(this)); - - }, - - loadLinks: function() { - indicateLoad(); - new Request.JSON({ - method: 'get', - url: '/json/package/' + this.id, - onSuccess: this.createLinks.bind(this), - onFailure: indicateFail - }).send(); - }, - - createLinks: function(data) { - var ul = $("sort_children_{id}".substitute({'id': this.id})); - ul.set("html", ""); - data.links.each(function(link) { - link.id = link.fid; - var li = new Element("li", { - 'style': { - 'margin-left': 0 - } - }); - - var html = "\n".substitute({'icon': link.icon}); - html += "{name}
      ".substitute({'url': link.url, 'name': link.name}); - html += "{statusmsg}{error} ".substitute({'statusmsg': link.statusmsg, 'error':link.error}); - html += "{format_size}".substitute({'format_size': link.format_size}); - html += "{plugin}  ".substitute({'plugin': link.plugin}); - html += "  "; - html += "
      "; - - var div = new Element("div", { - 'id': "file_" + link.id, - 'class': "child", - 'html': html - }); - - li.store("order", link.order); - li.store("lid", link.id); - - li.adopt(div); - ul.adopt(li); - }); - this.sorts = new Sortables(ul, { - constrain: false, - clone: true, - revert: true, - opacity: 0.4, - handle: ".sorthandle", - onComplete: this.saveSort.bind(this) - }); - this.registerLinkEvents(); - this.linksLoaded = true; - indicateFinish(); - this.toggle(); - }, - - registerLinkEvents: function() { - this.ele.getElements('.child').each(function(child) { - var lid = child.get('id').match(/[0-9]+/); - var imgs = child.getElements('.child_secrow img'); - imgs[0].addEvent('click', function(e) { - new Request({ - method: 'get', - url: '/api/deleteFiles/[' + this + "]", - onSuccess: function() { - $('file_' + this).nix() - }.bind(this), - onFailure: indicateFail - }).send(); - }.bind(lid)); - - imgs[1].addEvent('click', function(e) { - new Request({ - method: 'get', - url: '/api/restartFile/' + this, - onSuccess: function() { - var ele = $('file_' + this); - var imgs = ele.getElements("img"); - imgs[0].set("src", "../img/status_queue.png"); - var spans = ele.getElements(".child_status"); - spans[1].set("html", "queued"); - indicateSuccess(); - }.bind(this), - onFailure: indicateFail - }).send(); - }.bind(lid)); - }); - }, - - toggle: function() { - var child = this.ele.getElement('.children'); - if (child.getStyle('display') == "block") { - child.dissolve(); - } else { - if (!this.linksLoaded) { - this.loadLinks(); - } else { - child.reveal(); - } - } - }, - - - deletePackage: function(event) { - indicateLoad(); - new Request({ - method: 'get', - url: '/api/deletePackages/[' + this.id + "]", - onSuccess: function() { - this.ele.nix(); - indicateFinish(); - }.bind(this), - onFailure: indicateFail - }).send(); - //hide_pack(); - event.stop(); - }, - - restartPackage: function(event) { - indicateLoad(); - new Request({ - method: 'get', - url: '/api/restartPackage/' + this.id, - onSuccess: function() { - this.close(); - indicateSuccess(); - }.bind(this), - onFailure: indicateFail - }).send(); - event.stop(); - }, - - close: function() { - var child = this.ele.getElement('.children'); - if (child.getStyle('display') == "block") { - child.dissolve(); - } - var ul = $("sort_children_{id}".substitute({'id': this.id})); - ul.erase("html"); - this.linksLoaded = false; - }, - - movePackage: function(event) { - indicateLoad(); - new Request({ - method: 'get', - url: '/json/move_package/' + ((this.ui.type + 1) % 2) + "/" + this.id, - onSuccess: function() { - this.ele.nix(); - indicateFinish(); - }.bind(this), - onFailure: indicateFail - }).send(); - event.stop(); - }, - - editPackage: function(event) { - $("pack_form").removeEvents("submit"); - $("pack_form").addEvent("submit", this.savePackage.bind(this)); - - $("pack_id").set("value", this.id); - $("pack_name").set("value", this.name.get("text")); - $("pack_folder").set("value", this.folder.get("text")); - $("pack_pws").set("value", this.password.get("text")); - - root.packageBox.open(); - event.stop(); - }, - - savePackage: function(event) { - $("pack_form").send(); - this.name.set("text", $("pack_name").get("value")); - this.folder.set("text", $("pack_folder").get("value")); - this.password.set("text", $("pack_pws").get("value")); - root.packageBox.close(); - event.stop(); - }, - - saveSort: function(ele, copy) { - var order = []; - this.sorts.serialize(function(li, pos) { - if (li == ele && ele.retrieve("order") != pos) { - order.push(ele.retrieve("lid") + "|" + pos) - } - li.store("order", pos) - }); - if (order.length > 0) { - indicateLoad(); - new Request.JSON({ - method: 'get', - url: '/json/link_order/' + order[0], - onSuccess: indicateFinish, - onFailure: indicateFail - }).send(); - } - } - -}); diff --git a/module/webui/themes/default/js/render/settings.coffee b/module/webui/themes/default/js/render/settings.coffee deleted file mode 100644 index d522741b9..000000000 --- a/module/webui/themes/default/js/render/settings.coffee +++ /dev/null @@ -1,107 +0,0 @@ -root = this - -window.addEvent 'domready', -> - root.accountDialog = new MooDialog {destroyOnHide: false} - root.accountDialog.setContent $ 'account_box' - - new TinyTab $$('#toptabs li a'), $$('#tabs-body > span') - - $$('ul.nav').each (nav) -> - new MooDropMenu nav, { - onOpen: (el) -> el.fade 'in' - onClose: (el) -> el.fade 'out' - onInitialize: (el) -> el.fade('hide').set 'tween', {duration:500} - } - - new SettingsUI() - - -class SettingsUI - constructor: -> - @menu = $$ "#general-menu li" - @menu.append $$ "#plugin-menu li" - - @name = $ "tabsback" - @general = $ "general_form_content" - @plugin = $ "plugin_form_content" - - el.addEvent 'click', @menuClick.bind(this) for el in @menu - - $("general|submit").addEvent "click", @configSubmit.bind(this) - $("plugin|submit").addEvent "click", @configSubmit.bind(this) - - $("account_add").addEvent "click", (e) -> - root.accountDialog.open() - e.stop() - - $("account_reset").addEvent "click", (e) -> - root.accountDialog.close() - - $("account_add_button").addEvent "click", @addAccount.bind(this) - $("account_submit").addEvent "click", @submitAccounts.bind(this) - - - menuClick: (e) -> - [category, section] = e.target.get("id").split("|") - name = e.target.get "text" - - - target = if category is "general" then @general else @plugin - target.dissolve() - - new Request({ - "method" : "get" - "url" : "/json/load_config/#{category}/#{section}" - 'onSuccess': (data) => - target.set "html", data - target.reveal() - this.name.set "text", name - }).send() - - - configSubmit: (e) -> - category = e.target.get("id").split("|")[0] - form = $("#{category}_form") - - form.set "send", { - 'method': "post" - 'url': "/json/save_config/#{category}" - "onSuccess" : -> - root.notify.alert '{{ _("Settings saved.")}}', { - 'className': 'success' - } - 'onFailure': -> - root.notify.alert '{{ _("Error occured.")}}', { - 'className': 'error' - } - } - form.send() - e.stop() - - addAccount: (e) -> - form = $ "add_account_form" - form.set "send", { - 'method': "post" - "onSuccess" : -> window.location.reload() - 'onFailure': -> - root.notify.alert '{{_("Error occured.")}}', { - 'className': 'error' - } - } - - form.send() - e.stop() - - submitAccounts: (e) -> - form = $ "account_form" - form.set "send", { - 'method': "post", - "onSuccess" : -> window.location.reload() - 'onFailure': -> - root.notify.alert('{{ _("Error occured.") }}', { - 'className': 'error' - }) - } - - form.send() - e.stop() diff --git a/module/webui/themes/default/js/render/settings.min.js b/module/webui/themes/default/js/render/settings.min.js deleted file mode 100644 index 41d1cb25a..000000000 --- a/module/webui/themes/default/js/render/settings.min.js +++ /dev/null @@ -1,3 +0,0 @@ -{% autoescape true %} -var SettingsUI,root;var __bind=function(a,b){return function(){return a.apply(b,arguments)}};root=this;window.addEvent("domready",function(){root.accountDialog=new MooDialog({destroyOnHide:false});root.accountDialog.setContent($("account_box"));new TinyTab($$("#toptabs li a"),$$("#tabs-body > span"));$$("ul.nav").each(function(a){return new MooDropMenu(a,{onOpen:function(b){return b.fade("in")},onClose:function(b){return b.fade("out")},onInitialize:function(b){return b.fade("hide").set("tween",{duration:500})}})});return new SettingsUI()});SettingsUI=(function(){function a(){var c,e,b,d;this.menu=$$("#general-menu li");this.menu.append($$("#plugin-menu li"));this.name=$("tabsback");this.general=$("general_form_content");this.plugin=$("plugin_form_content");d=this.menu;for(e=0,b=d.length;e*/// IE 6 scroll - if ((options.scroll && Browser.ie6) || options.forceScroll){ - wrapper.setStyle('position', 'absolute'); - var position = wrapper.getPosition(options.inject); - window.addEvent('scroll', function(){ - var scroll = document.getScroll(); - wrapper.setPosition({ - x: position.x + scroll.x, - y: position.y + scroll.y - }); - }); - } - /**/ - - if (options.useEscKey){ - // Add event for the esc key - document.addEvent('keydown', function(e){ - if (e.key == 'esc') this.close(); - }.bind(this)); - } - - this.addEvent('hide', function(){ - if (options.destroyOnHide) this.destroy(); - }.bind(this)); - - this.fireEvent('initialize', wrapper); - }, - - setContent: function(){ - var content = Array.from(arguments); - if (content.length == 1) content = content[0]; - - this.content.empty(); - - var type = typeOf(content); - if (['string', 'number'].contains(type)) this.content.set('text', content); - else this.content.adopt(content); - - this.fireEvent('contentChange', this.content); - - return this; - }, - - open: function(){ - this.fireEvent('beforeOpen', this.wrapper).fireEvent('open'); - this.opened = true; - return this; - }, - - close: function(){ - this.fireEvent('beforeClose', this.wrapper).fireEvent('close'); - this.opened = false; - return this; - }, - - destroy: function(){ - this.wrapper.destroy(); - }, - - toElement: function(){ - return this.wrapper; - } - -}); - - -Element.implement({ - - MooDialog: function(options){ - this.store('MooDialog', - new MooDialog(options).setContent(this).open() - ); - return this; - } - -}); diff --git a/module/webui/themes/default/js/static/MooDialog.min.js b/module/webui/themes/default/js/static/MooDialog.min.js deleted file mode 100644 index 90b3ae100..000000000 --- a/module/webui/themes/default/js/static/MooDialog.min.js +++ /dev/null @@ -1 +0,0 @@ -var MooDialog=new Class({Implements:[Options,Events],options:{"class":"MooDialog",title:null,scroll:!0,forceScroll:!1,useEscKey:!0,destroyOnHide:!0,autoOpen:!0,closeButton:!0,onInitialize:function(){this.wrapper.setStyle("display","none")},onBeforeOpen:function(){this.wrapper.setStyle("display","block"),this.fireEvent("show")},onBeforeClose:function(){this.wrapper.setStyle("display","none"),this.fireEvent("hide")}},initialize:function(t){this.setOptions(t),this.options.inject=this.options.inject||document.body,t=this.options;var e=this.wrapper=new Element("div."+t["class"].replace(" ",".")).inject(t.inject);if(this.content=new Element("div.content").inject(e),t.title&&(this.title=new Element("div.title").set("text",t.title).inject(e),e.addClass("MooDialogTitle")),t.closeButton&&(this.closeButton=new Element("a.close",{events:{click:this.close.bind(this)}}).inject(e)),t.scroll&&Browser.ie6||t.forceScroll){e.setStyle("position","absolute");var n=e.getPosition(t.inject);window.addEvent("scroll",function(){var t=document.getScroll();e.setPosition({x:n.x+t.x,y:n.y+t.y})})}t.useEscKey&&document.addEvent("keydown",function(t){"esc"==t.key&&this.close()}.bind(this)),this.addEvent("hide",function(){t.destroyOnHide&&this.destroy()}.bind(this)),this.fireEvent("initialize",e)},setContent:function(){var t=Array.from(arguments);1==t.length&&(t=t[0]),this.content.empty();var e=typeOf(t);return["string","number"].contains(e)?this.content.set("text",t):this.content.adopt(t),this.fireEvent("contentChange",this.content),this},open:function(){return this.fireEvent("beforeOpen",this.wrapper).fireEvent("open"),this.opened=!0,this},close:function(){return this.fireEvent("beforeClose",this.wrapper).fireEvent("close"),this.opened=!1,this},destroy:function(){this.wrapper.destroy()},toElement:function(){return this.wrapper}});Element.implement({MooDialog:function(t){return this.store("MooDialog",new MooDialog(t).setContent(this).open()),this}}); \ No newline at end of file diff --git a/module/webui/themes/default/js/static/MooDropMenu.js b/module/webui/themes/default/js/static/MooDropMenu.js deleted file mode 100644 index ac0fa1874..000000000 --- a/module/webui/themes/default/js/static/MooDropMenu.js +++ /dev/null @@ -1,86 +0,0 @@ -/* ---- -description: This provides a simple Drop Down menu with infinit levels - -license: MIT-style - -authors: -- Arian Stolwijk - -requires: - - Core/Class.Extras - - Core/Element.Event - - Core/Selectors - -provides: [MooDropMenu, Element.MooDropMenu] - -... -*/ - -var MooDropMenu = new Class({ - - Implements: [Options, Events], - - options: { - onOpen: function(el){ - el.removeClass('close').addClass('open'); - }, - onClose: function(el){ - el.removeClass('open').addClass('close'); - }, - onInitialize: function(el){ - el.removeClass('open').addClass('close'); - }, - mouseoutDelay: 200, - mouseoverDelay: 0, - listSelector: 'ul', - itemSelector: 'li', - openEvent: 'mouseenter', - closeEvent: 'mouseleave' - }, - - initialize: function(menu, options, level){ - this.setOptions(options); - options = this.options; - - var menu = this.menu = document.id(menu); - - menu.getElements(options.itemSelector + ' > ' + options.listSelector).each(function(el){ - - this.fireEvent('initialize', el); - - var parent = el.getParent(options.itemSelector), - timer; - - parent.addEvent(options.openEvent, function(){ - parent.store('DropDownOpen', true); - - clearTimeout(timer); - if (options.mouseoverDelay) timer = this.fireEvent.delay(options.mouseoverDelay, this, ['open', el]); - else this.fireEvent('open', el); - - }.bind(this)).addEvent(options.closeEvent, function(){ - parent.store('DropDownOpen', false); - - clearTimeout(timer); - timer = (function(){ - if (!parent.retrieve('DropDownOpen')) this.fireEvent('close', el); - }).delay(options.mouseoutDelay, this); - - }.bind(this)); - - }, this); - }, - - toElement: function(){ - return this.menu - } - -}); - -/* So you can do like this $('nav').MooDropMenu(); or even $('nav').MooDropMenu().setStyle('border',1); */ -Element.implement({ - MooDropMenu: function(options){ - return this.store('MooDropMenu', new MooDropMenu(this, options)); - } -}); diff --git a/module/webui/themes/default/js/static/MooDropMenu.min.js b/module/webui/themes/default/js/static/MooDropMenu.min.js deleted file mode 100644 index 552ae247a..000000000 --- a/module/webui/themes/default/js/static/MooDropMenu.min.js +++ /dev/null @@ -1 +0,0 @@ -var MooDropMenu=new Class({Implements:[Options,Events],options:{onOpen:function(e){e.removeClass("close").addClass("open")},onClose:function(e){e.removeClass("open").addClass("close")},onInitialize:function(e){e.removeClass("open").addClass("close")},mouseoutDelay:200,mouseoverDelay:0,listSelector:"ul",itemSelector:"li",openEvent:"mouseenter",closeEvent:"mouseleave"},initialize:function(e,o){this.setOptions(o),o=this.options;var e=this.menu=document.id(e);e.getElements(o.itemSelector+" > "+o.listSelector).each(function(e){this.fireEvent("initialize",e);var n,t=e.getParent(o.itemSelector);t.addEvent(o.openEvent,function(){t.store("DropDownOpen",!0),clearTimeout(n),o.mouseoverDelay?n=this.fireEvent.delay(o.mouseoverDelay,this,["open",e]):this.fireEvent("open",e)}.bind(this)).addEvent(o.closeEvent,function(){t.store("DropDownOpen",!1),clearTimeout(n),n=function(){t.retrieve("DropDownOpen")||this.fireEvent("close",e)}.delay(o.mouseoutDelay,this)}.bind(this))},this)},toElement:function(){return this.menu}});Element.implement({MooDropMenu:function(e){return this.store("MooDropMenu",new MooDropMenu(this,e))}}); \ No newline at end of file diff --git a/module/webui/themes/default/js/static/mootools-core.js b/module/webui/themes/default/js/static/mootools-core.js deleted file mode 100644 index db83850fd..000000000 --- a/module/webui/themes/default/js/static/mootools-core.js +++ /dev/null @@ -1,5977 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/core/8423c12ffd6a6bfcde9ea22554aec795 - -packager build: - - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady - -... -*/ - -/* ---- - -name: Core - -description: The heart of MooTools. - -license: MIT-style license. - -copyright: Copyright (c) 2006-2014 [Valerio Proietti](http://mad4milk.net/). - -authors: The MooTools production team (http://mootools.net/developers/) - -inspiration: - - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php) - - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php) - -provides: [Core, MooTools, Type, typeOf, instanceOf, Native] - -... -*/ - -(function(){ - -this.MooTools = { - version: '1.5.0', - build: '0f7b690afee9349b15909f33016a25d2e4d9f4e3' -}; - -// typeOf, instanceOf - -var typeOf = this.typeOf = function(item){ - if (item == null) return 'null'; - if (item.$family != null) return item.$family(); - - if (item.nodeName){ - if (item.nodeType == 1) return 'element'; - if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace'; - } else if (typeof item.length == 'number'){ - if ('callee' in item) return 'arguments'; - if ('item' in item) return 'collection'; - } - - return typeof item; -}; - -var instanceOf = this.instanceOf = function(item, object){ - if (item == null) return false; - var constructor = item.$constructor || item.constructor; - while (constructor){ - if (constructor === object) return true; - constructor = constructor.parent; - } - /**/ - if (!item.hasOwnProperty) return false; - /**/ - return item instanceof object; -}; - -// Function overloading - -var Function = this.Function; - -var enumerables = true; -for (var i in {toString: 1}) enumerables = null; -if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor']; - -Function.prototype.overloadSetter = function(usePlural){ - var self = this; - return function(a, b){ - if (a == null) return this; - if (usePlural || typeof a != 'string'){ - for (var k in a) self.call(this, k, a[k]); - if (enumerables) for (var i = enumerables.length; i--;){ - k = enumerables[i]; - if (a.hasOwnProperty(k)) self.call(this, k, a[k]); - } - } else { - self.call(this, a, b); - } - return this; - }; -}; - -Function.prototype.overloadGetter = function(usePlural){ - var self = this; - return function(a){ - var args, result; - if (typeof a != 'string') args = a; - else if (arguments.length > 1) args = arguments; - else if (usePlural) args = [a]; - if (args){ - result = {}; - for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]); - } else { - result = self.call(this, a); - } - return result; - }; -}; - -Function.prototype.extend = function(key, value){ - this[key] = value; -}.overloadSetter(); - -Function.prototype.implement = function(key, value){ - this.prototype[key] = value; -}.overloadSetter(); - -// From - -var slice = Array.prototype.slice; - -Function.from = function(item){ - return (typeOf(item) == 'function') ? item : function(){ - return item; - }; -}; - -Array.from = function(item){ - if (item == null) return []; - return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item]; -}; - -Number.from = function(item){ - var number = parseFloat(item); - return isFinite(number) ? number : null; -}; - -String.from = function(item){ - return item + ''; -}; - -// hide, protect - -Function.implement({ - - hide: function(){ - this.$hidden = true; - return this; - }, - - protect: function(){ - this.$protected = true; - return this; - } - -}); - -// Type - -var Type = this.Type = function(name, object){ - if (name){ - var lower = name.toLowerCase(); - var typeCheck = function(item){ - return (typeOf(item) == lower); - }; - - Type['is' + name] = typeCheck; - if (object != null){ - object.prototype.$family = (function(){ - return lower; - }).hide(); - - } - } - - if (object == null) return null; - - object.extend(this); - object.$constructor = Type; - object.prototype.$constructor = object; - - return object; -}; - -var toString = Object.prototype.toString; - -Type.isEnumerable = function(item){ - return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' ); -}; - -var hooks = {}; - -var hooksOf = function(object){ - var type = typeOf(object.prototype); - return hooks[type] || (hooks[type] = []); -}; - -var implement = function(name, method){ - if (method && method.$hidden) return; - - var hooks = hooksOf(this); - - for (var i = 0; i < hooks.length; i++){ - var hook = hooks[i]; - if (typeOf(hook) == 'type') implement.call(hook, name, method); - else hook.call(this, name, method); - } - - var previous = this.prototype[name]; - if (previous == null || !previous.$protected) this.prototype[name] = method; - - if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){ - return method.apply(item, slice.call(arguments, 1)); - }); -}; - -var extend = function(name, method){ - if (method && method.$hidden) return; - var previous = this[name]; - if (previous == null || !previous.$protected) this[name] = method; -}; - -Type.implement({ - - implement: implement.overloadSetter(), - - extend: extend.overloadSetter(), - - alias: function(name, existing){ - implement.call(this, name, this.prototype[existing]); - }.overloadSetter(), - - mirror: function(hook){ - hooksOf(this).push(hook); - return this; - } - -}); - -new Type('Type', Type); - -// Default Types - -var force = function(name, object, methods){ - var isType = (object != Object), - prototype = object.prototype; - - if (isType) object = new Type(name, object); - - for (var i = 0, l = methods.length; i < l; i++){ - var key = methods[i], - generic = object[key], - proto = prototype[key]; - - if (generic) generic.protect(); - if (isType && proto) object.implement(key, proto.protect()); - } - - if (isType){ - var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]); - object.forEachMethod = function(fn){ - if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){ - fn.call(prototype, prototype[methods[i]], methods[i]); - } - for (var key in prototype) fn.call(prototype, prototype[key], key); - }; - } - - return force; -}; - -force('String', String, [ - 'charAt', 'charCodeAt', 'concat', 'contains', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search', - 'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase' -])('Array', Array, [ - 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', - 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight' -])('Number', Number, [ - 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision' -])('Function', Function, [ - 'apply', 'call', 'bind' -])('RegExp', RegExp, [ - 'exec', 'test' -])('Object', Object, [ - 'create', 'defineProperty', 'defineProperties', 'keys', - 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames', - 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen' -])('Date', Date, ['now']); - -Object.extend = extend.overloadSetter(); - -Date.extend('now', function(){ - return +(new Date); -}); - -new Type('Boolean', Boolean); - -// fixes NaN returning as Number - -Number.prototype.$family = function(){ - return isFinite(this) ? 'number' : 'null'; -}.hide(); - -// Number.random - -Number.extend('random', function(min, max){ - return Math.floor(Math.random() * (max - min + 1) + min); -}); - -// forEach, each - -var hasOwnProperty = Object.prototype.hasOwnProperty; -Object.extend('forEach', function(object, fn, bind){ - for (var key in object){ - if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object); - } -}); - -Object.each = Object.forEach; - -Array.implement({ - - /**/ - forEach: function(fn, bind){ - for (var i = 0, l = this.length; i < l; i++){ - if (i in this) fn.call(bind, this[i], i, this); - } - }, - /**/ - - each: function(fn, bind){ - Array.forEach(this, fn, bind); - return this; - } - -}); - -// Array & Object cloning, Object merging and appending - -var cloneOf = function(item){ - switch (typeOf(item)){ - case 'array': return item.clone(); - case 'object': return Object.clone(item); - default: return item; - } -}; - -Array.implement('clone', function(){ - var i = this.length, clone = new Array(i); - while (i--) clone[i] = cloneOf(this[i]); - return clone; -}); - -var mergeOne = function(source, key, current){ - switch (typeOf(current)){ - case 'object': - if (typeOf(source[key]) == 'object') Object.merge(source[key], current); - else source[key] = Object.clone(current); - break; - case 'array': source[key] = current.clone(); break; - default: source[key] = current; - } - return source; -}; - -Object.extend({ - - merge: function(source, k, v){ - if (typeOf(k) == 'string') return mergeOne(source, k, v); - for (var i = 1, l = arguments.length; i < l; i++){ - var object = arguments[i]; - for (var key in object) mergeOne(source, key, object[key]); - } - return source; - }, - - clone: function(object){ - var clone = {}; - for (var key in object) clone[key] = cloneOf(object[key]); - return clone; - }, - - append: function(original){ - for (var i = 1, l = arguments.length; i < l; i++){ - var extended = arguments[i] || {}; - for (var key in extended) original[key] = extended[key]; - } - return original; - } - -}); - -// Object-less types - -['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){ - new Type(name); -}); - -// Unique ID - -var UID = Date.now(); - -String.extend('uniqueID', function(){ - return (UID++).toString(36); -}); - - - -})(); - - -/* ---- - -name: Array - -description: Contains Array Prototypes like each, contains, and erase. - -license: MIT-style license. - -requires: [Type] - -provides: Array - -... -*/ - -Array.implement({ - - /**/ - every: function(fn, bind){ - for (var i = 0, l = this.length >>> 0; i < l; i++){ - if ((i in this) && !fn.call(bind, this[i], i, this)) return false; - } - return true; - }, - - filter: function(fn, bind){ - var results = []; - for (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){ - value = this[i]; - if (fn.call(bind, value, i, this)) results.push(value); - } - return results; - }, - - indexOf: function(item, from){ - var length = this.length >>> 0; - for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){ - if (this[i] === item) return i; - } - return -1; - }, - - map: function(fn, bind){ - var length = this.length >>> 0, results = Array(length); - for (var i = 0; i < length; i++){ - if (i in this) results[i] = fn.call(bind, this[i], i, this); - } - return results; - }, - - some: function(fn, bind){ - for (var i = 0, l = this.length >>> 0; i < l; i++){ - if ((i in this) && fn.call(bind, this[i], i, this)) return true; - } - return false; - }, - /**/ - - clean: function(){ - return this.filter(function(item){ - return item != null; - }); - }, - - invoke: function(methodName){ - var args = Array.slice(arguments, 1); - return this.map(function(item){ - return item[methodName].apply(item, args); - }); - }, - - associate: function(keys){ - var obj = {}, length = Math.min(this.length, keys.length); - for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; - return obj; - }, - - link: function(object){ - var result = {}; - for (var i = 0, l = this.length; i < l; i++){ - for (var key in object){ - if (object[key](this[i])){ - result[key] = this[i]; - delete object[key]; - break; - } - } - } - return result; - }, - - contains: function(item, from){ - return this.indexOf(item, from) != -1; - }, - - append: function(array){ - this.push.apply(this, array); - return this; - }, - - getLast: function(){ - return (this.length) ? this[this.length - 1] : null; - }, - - getRandom: function(){ - return (this.length) ? this[Number.random(0, this.length - 1)] : null; - }, - - include: function(item){ - if (!this.contains(item)) this.push(item); - return this; - }, - - combine: function(array){ - for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); - return this; - }, - - erase: function(item){ - for (var i = this.length; i--;){ - if (this[i] === item) this.splice(i, 1); - } - return this; - }, - - empty: function(){ - this.length = 0; - return this; - }, - - flatten: function(){ - var array = []; - for (var i = 0, l = this.length; i < l; i++){ - var type = typeOf(this[i]); - if (type == 'null') continue; - array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]); - } - return array; - }, - - pick: function(){ - for (var i = 0, l = this.length; i < l; i++){ - if (this[i] != null) return this[i]; - } - return null; - }, - - hexToRgb: function(array){ - if (this.length != 3) return null; - var rgb = this.map(function(value){ - if (value.length == 1) value += value; - return parseInt(value, 16); - }); - return (array) ? rgb : 'rgb(' + rgb + ')'; - }, - - rgbToHex: function(array){ - if (this.length < 3) return null; - if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; - var hex = []; - for (var i = 0; i < 3; i++){ - var bit = (this[i] - 0).toString(16); - hex.push((bit.length == 1) ? '0' + bit : bit); - } - return (array) ? hex : '#' + hex.join(''); - } - -}); - - - - -/* ---- - -name: String - -description: Contains String Prototypes like camelCase, capitalize, test, and toInt. - -license: MIT-style license. - -requires: [Type, Array] - -provides: String - -... -*/ - -String.implement({ - - // - contains: function(string, index){ - return (index ? String(this).slice(index) : String(this)).indexOf(string) > -1; - }, - // - - test: function(regex, params){ - return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this); - }, - - trim: function(){ - return String(this).replace(/^\s+|\s+$/g, ''); - }, - - clean: function(){ - return String(this).replace(/\s+/g, ' ').trim(); - }, - - camelCase: function(){ - return String(this).replace(/-\D/g, function(match){ - return match.charAt(1).toUpperCase(); - }); - }, - - hyphenate: function(){ - return String(this).replace(/[A-Z]/g, function(match){ - return ('-' + match.charAt(0).toLowerCase()); - }); - }, - - capitalize: function(){ - return String(this).replace(/\b[a-z]/g, function(match){ - return match.toUpperCase(); - }); - }, - - escapeRegExp: function(){ - return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); - }, - - toInt: function(base){ - return parseInt(this, base || 10); - }, - - toFloat: function(){ - return parseFloat(this); - }, - - hexToRgb: function(array){ - var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); - return (hex) ? hex.slice(1).hexToRgb(array) : null; - }, - - rgbToHex: function(array){ - var rgb = String(this).match(/\d{1,3}/g); - return (rgb) ? rgb.rgbToHex(array) : null; - }, - - substitute: function(object, regexp){ - return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ - if (match.charAt(0) == '\\') return match.slice(1); - return (object[name] != null) ? object[name] : ''; - }); - } - -}); - - - - -/* ---- - -name: Number - -description: Contains Number Prototypes like limit, round, times, and ceil. - -license: MIT-style license. - -requires: Type - -provides: Number - -... -*/ - -Number.implement({ - - limit: function(min, max){ - return Math.min(max, Math.max(min, this)); - }, - - round: function(precision){ - precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0); - return Math.round(this * precision) / precision; - }, - - times: function(fn, bind){ - for (var i = 0; i < this; i++) fn.call(bind, i, this); - }, - - toFloat: function(){ - return parseFloat(this); - }, - - toInt: function(base){ - return parseInt(this, base || 10); - } - -}); - -Number.alias('each', 'times'); - -(function(math){ - var methods = {}; - math.each(function(name){ - if (!Number[name]) methods[name] = function(){ - return Math[name].apply(null, [this].concat(Array.from(arguments))); - }; - }); - Number.implement(methods); -})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); - - -/* ---- - -name: Function - -description: Contains Function Prototypes like create, bind, pass, and delay. - -license: MIT-style license. - -requires: Type - -provides: Function - -... -*/ - -Function.extend({ - - attempt: function(){ - for (var i = 0, l = arguments.length; i < l; i++){ - try { - return arguments[i](); - } catch (e){} - } - return null; - } - -}); - -Function.implement({ - - attempt: function(args, bind){ - try { - return this.apply(bind, Array.from(args)); - } catch (e){} - - return null; - }, - - /**/ - bind: function(that){ - var self = this, - args = arguments.length > 1 ? Array.slice(arguments, 1) : null, - F = function(){}; - - var bound = function(){ - var context = that, length = arguments.length; - if (this instanceof bound){ - F.prototype = self.prototype; - context = new F; - } - var result = (!args && !length) - ? self.call(context) - : self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments); - return context == that ? result : context; - }; - return bound; - }, - /**/ - - pass: function(args, bind){ - var self = this; - if (args != null) args = Array.from(args); - return function(){ - return self.apply(bind, args || arguments); - }; - }, - - delay: function(delay, bind, args){ - return setTimeout(this.pass((args == null ? [] : args), bind), delay); - }, - - periodical: function(periodical, bind, args){ - return setInterval(this.pass((args == null ? [] : args), bind), periodical); - } - -}); - - - - -/* ---- - -name: Object - -description: Object generic methods - -license: MIT-style license. - -requires: Type - -provides: [Object, Hash] - -... -*/ - -(function(){ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -Object.extend({ - - subset: function(object, keys){ - var results = {}; - for (var i = 0, l = keys.length; i < l; i++){ - var k = keys[i]; - if (k in object) results[k] = object[k]; - } - return results; - }, - - map: function(object, fn, bind){ - var results = {}; - for (var key in object){ - if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object); - } - return results; - }, - - filter: function(object, fn, bind){ - var results = {}; - for (var key in object){ - var value = object[key]; - if (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value; - } - return results; - }, - - every: function(object, fn, bind){ - for (var key in object){ - if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false; - } - return true; - }, - - some: function(object, fn, bind){ - for (var key in object){ - if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true; - } - return false; - }, - - keys: function(object){ - var keys = []; - for (var key in object){ - if (hasOwnProperty.call(object, key)) keys.push(key); - } - return keys; - }, - - values: function(object){ - var values = []; - for (var key in object){ - if (hasOwnProperty.call(object, key)) values.push(object[key]); - } - return values; - }, - - getLength: function(object){ - return Object.keys(object).length; - }, - - keyOf: function(object, value){ - for (var key in object){ - if (hasOwnProperty.call(object, key) && object[key] === value) return key; - } - return null; - }, - - contains: function(object, value){ - return Object.keyOf(object, value) != null; - }, - - toQueryString: function(object, base){ - var queryString = []; - - Object.each(object, function(value, key){ - if (base) key = base + '[' + key + ']'; - var result; - switch (typeOf(value)){ - case 'object': result = Object.toQueryString(value, key); break; - case 'array': - var qs = {}; - value.each(function(val, i){ - qs[i] = val; - }); - result = Object.toQueryString(qs, key); - break; - default: result = key + '=' + encodeURIComponent(value); - } - if (value != null) queryString.push(result); - }); - - return queryString.join('&'); - } - -}); - -})(); - - - - -/* ---- - -name: Browser - -description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash. - -license: MIT-style license. - -requires: [Array, Function, Number, String] - -provides: [Browser, Window, Document] - -... -*/ - -(function(){ - -var document = this.document; -var window = document.window = this; - -var parse = function(ua, platform){ - ua = ua.toLowerCase(); - platform = (platform ? platform.toLowerCase() : ''); - - var UA = ua.match(/(opera|ie|firefox|chrome|trident|crios|version)[\s\/:]([\w\d\.]+)?.*?(safari|(?:rv[\s\/:]|version[\s\/:])([\w\d\.]+)|$)/) || [null, 'unknown', 0]; - - if (UA[1] == 'trident'){ - UA[1] = 'ie'; - if (UA[4]) UA[2] = UA[4]; - } else if (UA[1] == 'crios') { - UA[1] = 'chrome'; - } - - var platform = ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]; - if (platform == 'win') platform = 'windows'; - - return { - extend: Function.prototype.extend, - name: (UA[1] == 'version') ? UA[3] : UA[1], - version: parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]), - platform: platform - }; -}; - -var Browser = this.Browser = parse(navigator.userAgent, navigator.platform); - -if (Browser.ie){ - Browser.version = document.documentMode; -} - -Browser.extend({ - Features: { - xpath: !!(document.evaluate), - air: !!(window.runtime), - query: !!(document.querySelector), - json: !!(window.JSON) - }, - parseUA: parse -}); - - - -// Request - -Browser.Request = (function(){ - - var XMLHTTP = function(){ - return new XMLHttpRequest(); - }; - - var MSXML2 = function(){ - return new ActiveXObject('MSXML2.XMLHTTP'); - }; - - var MSXML = function(){ - return new ActiveXObject('Microsoft.XMLHTTP'); - }; - - return Function.attempt(function(){ - XMLHTTP(); - return XMLHTTP; - }, function(){ - MSXML2(); - return MSXML2; - }, function(){ - MSXML(); - return MSXML; - }); - -})(); - -Browser.Features.xhr = !!(Browser.Request); - - - -// String scripts - -Browser.exec = function(text){ - if (!text) return text; - if (window.execScript){ - window.execScript(text); - } else { - var script = document.createElement('script'); - script.setAttribute('type', 'text/javascript'); - script.text = text; - document.head.appendChild(script); - document.head.removeChild(script); - } - return text; -}; - -String.implement('stripScripts', function(exec){ - var scripts = ''; - var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(all, code){ - scripts += code + '\n'; - return ''; - }); - if (exec === true) Browser.exec(scripts); - else if (typeOf(exec) == 'function') exec(scripts, text); - return text; -}); - -// Window, Document - -Browser.extend({ - Document: this.Document, - Window: this.Window, - Element: this.Element, - Event: this.Event -}); - -this.Window = this.$constructor = new Type('Window', function(){}); - -this.$family = Function.from('window').hide(); - -Window.mirror(function(name, method){ - window[name] = method; -}); - -this.Document = document.$constructor = new Type('Document', function(){}); - -document.$family = Function.from('document').hide(); - -Document.mirror(function(name, method){ - document[name] = method; -}); - -document.html = document.documentElement; -if (!document.head) document.head = document.getElementsByTagName('head')[0]; - -if (document.execCommand) try { - document.execCommand("BackgroundImageCache", false, true); -} catch (e){} - -/**/ -if (this.attachEvent && !this.addEventListener){ - var unloadEvent = function(){ - this.detachEvent('onunload', unloadEvent); - document.head = document.html = document.window = null; - }; - this.attachEvent('onunload', unloadEvent); -} - -// IE fails on collections and ) -var arrayFrom = Array.from; -try { - arrayFrom(document.html.childNodes); -} catch(e){ - Array.from = function(item){ - if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){ - var i = item.length, array = new Array(i); - while (i--) array[i] = item[i]; - return array; - } - return arrayFrom(item); - }; - - var prototype = Array.prototype, - slice = prototype.slice; - ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){ - var method = prototype[name]; - Array[name] = function(item){ - return method.apply(Array.from(item), slice.call(arguments, 1)); - }; - }); -} -/**/ - - - -})(); - - -/* ---- - -name: Event - -description: Contains the Event Type, to make the event object cross-browser. - -license: MIT-style license. - -requires: [Window, Document, Array, Function, String, Object] - -provides: Event - -... -*/ - -(function() { - -var _keys = {}; - -var DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){ - if (!win) win = window; - event = event || win.event; - if (event.$extended) return event; - this.event = event; - this.$extended = true; - this.shift = event.shiftKey; - this.control = event.ctrlKey; - this.alt = event.altKey; - this.meta = event.metaKey; - var type = this.type = event.type; - var target = event.target || event.srcElement; - while (target && target.nodeType == 3) target = target.parentNode; - this.target = document.id(target); - - if (type.indexOf('key') == 0){ - var code = this.code = (event.which || event.keyCode); - this.key = _keys[code]; - if (type == 'keydown' || type == 'keyup'){ - if (code > 111 && code < 124) this.key = 'f' + (code - 111); - else if (code > 95 && code < 106) this.key = code - 96; - } - if (this.key == null) this.key = String.fromCharCode(code).toLowerCase(); - } else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){ - var doc = win.document; - doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; - this.page = { - x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft, - y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop - }; - this.client = { - x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX, - y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY - }; - if (type == 'DOMMouseScroll' || type == 'mousewheel') - this.wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; - - this.rightClick = (event.which == 3 || event.button == 2); - if (type == 'mouseover' || type == 'mouseout'){ - var related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']; - while (related && related.nodeType == 3) related = related.parentNode; - this.relatedTarget = document.id(related); - } - } else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){ - this.rotation = event.rotation; - this.scale = event.scale; - this.targetTouches = event.targetTouches; - this.changedTouches = event.changedTouches; - var touches = this.touches = event.touches; - if (touches && touches[0]){ - var touch = touches[0]; - this.page = {x: touch.pageX, y: touch.pageY}; - this.client = {x: touch.clientX, y: touch.clientY}; - } - } - - if (!this.client) this.client = {}; - if (!this.page) this.page = {}; -}); - -DOMEvent.implement({ - - stop: function(){ - return this.preventDefault().stopPropagation(); - }, - - stopPropagation: function(){ - if (this.event.stopPropagation) this.event.stopPropagation(); - else this.event.cancelBubble = true; - return this; - }, - - preventDefault: function(){ - if (this.event.preventDefault) this.event.preventDefault(); - else this.event.returnValue = false; - return this; - } - -}); - -DOMEvent.defineKey = function(code, key){ - _keys[code] = key; - return this; -}; - -DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true); - -DOMEvent.defineKeys({ - '38': 'up', '40': 'down', '37': 'left', '39': 'right', - '27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab', - '46': 'delete', '13': 'enter' -}); - -})(); - - - - - - -/* ---- - -name: Class - -description: Contains the Class Function for easily creating, extending, and implementing reusable Classes. - -license: MIT-style license. - -requires: [Array, String, Function, Number] - -provides: Class - -... -*/ - -(function(){ - -var Class = this.Class = new Type('Class', function(params){ - if (instanceOf(params, Function)) params = {initialize: params}; - - var newClass = function(){ - reset(this); - if (newClass.$prototyping) return this; - this.$caller = null; - var value = (this.initialize) ? this.initialize.apply(this, arguments) : this; - this.$caller = this.caller = null; - return value; - }.extend(this).implement(params); - - newClass.$constructor = Class; - newClass.prototype.$constructor = newClass; - newClass.prototype.parent = parent; - - return newClass; -}); - -var parent = function(){ - if (!this.$caller) throw new Error('The method "parent" cannot be called.'); - var name = this.$caller.$name, - parent = this.$caller.$owner.parent, - previous = (parent) ? parent.prototype[name] : null; - if (!previous) throw new Error('The method "' + name + '" has no parent.'); - return previous.apply(this, arguments); -}; - -var reset = function(object){ - for (var key in object){ - var value = object[key]; - switch (typeOf(value)){ - case 'object': - var F = function(){}; - F.prototype = value; - object[key] = reset(new F); - break; - case 'array': object[key] = value.clone(); break; - } - } - return object; -}; - -var wrap = function(self, key, method){ - if (method.$origin) method = method.$origin; - var wrapper = function(){ - if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.'); - var caller = this.caller, current = this.$caller; - this.caller = current; this.$caller = wrapper; - var result = method.apply(this, arguments); - this.$caller = current; this.caller = caller; - return result; - }.extend({$owner: self, $origin: method, $name: key}); - return wrapper; -}; - -var implement = function(key, value, retain){ - if (Class.Mutators.hasOwnProperty(key)){ - value = Class.Mutators[key].call(this, value); - if (value == null) return this; - } - - if (typeOf(value) == 'function'){ - if (value.$hidden) return this; - this.prototype[key] = (retain) ? value : wrap(this, key, value); - } else { - Object.merge(this.prototype, key, value); - } - - return this; -}; - -var getInstance = function(klass){ - klass.$prototyping = true; - var proto = new klass; - delete klass.$prototyping; - return proto; -}; - -Class.implement('implement', implement.overloadSetter()); - -Class.Mutators = { - - Extends: function(parent){ - this.parent = parent; - this.prototype = getInstance(parent); - }, - - Implements: function(items){ - Array.from(items).each(function(item){ - var instance = new item; - for (var key in instance) implement.call(this, key, instance[key], true); - }, this); - } -}; - -})(); - - -/* ---- - -name: Class.Extras - -description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. - -license: MIT-style license. - -requires: Class - -provides: [Class.Extras, Chain, Events, Options] - -... -*/ - -(function(){ - -this.Chain = new Class({ - - $chain: [], - - chain: function(){ - this.$chain.append(Array.flatten(arguments)); - return this; - }, - - callChain: function(){ - return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; - }, - - clearChain: function(){ - this.$chain.empty(); - return this; - } - -}); - -var removeOn = function(string){ - return string.replace(/^on([A-Z])/, function(full, first){ - return first.toLowerCase(); - }); -}; - -this.Events = new Class({ - - $events: {}, - - addEvent: function(type, fn, internal){ - type = removeOn(type); - - - - this.$events[type] = (this.$events[type] || []).include(fn); - if (internal) fn.internal = true; - return this; - }, - - addEvents: function(events){ - for (var type in events) this.addEvent(type, events[type]); - return this; - }, - - fireEvent: function(type, args, delay){ - type = removeOn(type); - var events = this.$events[type]; - if (!events) return this; - args = Array.from(args); - events.each(function(fn){ - if (delay) fn.delay(delay, this, args); - else fn.apply(this, args); - }, this); - return this; - }, - - removeEvent: function(type, fn){ - type = removeOn(type); - var events = this.$events[type]; - if (events && !fn.internal){ - var index = events.indexOf(fn); - if (index != -1) delete events[index]; - } - return this; - }, - - removeEvents: function(events){ - var type; - if (typeOf(events) == 'object'){ - for (type in events) this.removeEvent(type, events[type]); - return this; - } - if (events) events = removeOn(events); - for (type in this.$events){ - if (events && events != type) continue; - var fns = this.$events[type]; - for (var i = fns.length; i--;) if (i in fns){ - this.removeEvent(type, fns[i]); - } - } - return this; - } - -}); - -this.Options = new Class({ - - setOptions: function(){ - var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments)); - if (this.addEvent) for (var option in options){ - if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; - this.addEvent(option, options[option]); - delete options[option]; - } - return this; - } - -}); - -})(); - - -/* ---- -name: Slick.Parser -description: Standalone CSS3 Selector parser -provides: Slick.Parser -... -*/ - -;(function(){ - -var parsed, - separatorIndex, - combinatorIndex, - reversed, - cache = {}, - reverseCache = {}, - reUnescape = /\\/g; - -var parse = function(expression, isReversed){ - if (expression == null) return null; - if (expression.Slick === true) return expression; - expression = ('' + expression).replace(/^\s+|\s+$/g, ''); - reversed = !!isReversed; - var currentCache = (reversed) ? reverseCache : cache; - if (currentCache[expression]) return currentCache[expression]; - parsed = { - Slick: true, - expressions: [], - raw: expression, - reverse: function(){ - return parse(this.raw, true); - } - }; - separatorIndex = -1; - while (expression != (expression = expression.replace(regexp, parser))); - parsed.length = parsed.expressions.length; - return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed; -}; - -var reverseCombinator = function(combinator){ - if (combinator === '!') return ' '; - else if (combinator === ' ') return '!'; - else if ((/^!/).test(combinator)) return combinator.replace(/^!/, ''); - else return '!' + combinator; -}; - -var reverse = function(expression){ - var expressions = expression.expressions; - for (var i = 0; i < expressions.length; i++){ - var exp = expressions[i]; - var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)}; - - for (var j = 0; j < exp.length; j++){ - var cexp = exp[j]; - if (!cexp.reverseCombinator) cexp.reverseCombinator = ' '; - cexp.combinator = cexp.reverseCombinator; - delete cexp.reverseCombinator; - } - - exp.reverse().push(last); - } - return expression; -}; - -var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan MIT License - return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){ - return '\\' + match; - }); -}; - -var regexp = new RegExp( -/* -#!/usr/bin/env ruby -puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'') -__END__ - "(?x)^(?:\ - \\s* ( , ) \\s* # Separator \n\ - | \\s* ( + ) \\s* # Combinator \n\ - | ( \\s+ ) # CombinatorChildren \n\ - | ( + | \\* ) # Tag \n\ - | \\# ( + ) # ID \n\ - | \\. ( + ) # ClassName \n\ - | # Attribute \n\ - \\[ \ - \\s* (+) (?: \ - \\s* ([*^$!~|]?=) (?: \ - \\s* (?:\ - ([\"']?)(.*?)\\9 \ - )\ - ) \ - )? \\s* \ - \\](?!\\]) \n\ - | :+ ( + )(?:\ - \\( (?:\ - (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\ - ) \\)\ - )?\ - )" -*/ - "^(?:\\s*(,)\\s*|\\s*(+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)" - .replace(//, '[' + escapeRegExp(">+~`!@$%^&={}\\;/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') - .replace(//g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') -); - -function parser( - rawMatch, - - separator, - combinator, - combinatorChildren, - - tagName, - id, - className, - - attributeKey, - attributeOperator, - attributeQuote, - attributeValue, - - pseudoMarker, - pseudoClass, - pseudoQuote, - pseudoClassQuotedValue, - pseudoClassValue -){ - if (separator || separatorIndex === -1){ - parsed.expressions[++separatorIndex] = []; - combinatorIndex = -1; - if (separator) return ''; - } - - if (combinator || combinatorChildren || combinatorIndex === -1){ - combinator = combinator || ' '; - var currentSeparator = parsed.expressions[separatorIndex]; - if (reversed && currentSeparator[combinatorIndex]) - currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator); - currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'}; - } - - var currentParsed = parsed.expressions[separatorIndex][combinatorIndex]; - - if (tagName){ - currentParsed.tag = tagName.replace(reUnescape, ''); - - } else if (id){ - currentParsed.id = id.replace(reUnescape, ''); - - } else if (className){ - className = className.replace(reUnescape, ''); - - if (!currentParsed.classList) currentParsed.classList = []; - if (!currentParsed.classes) currentParsed.classes = []; - currentParsed.classList.push(className); - currentParsed.classes.push({ - value: className, - regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)') - }); - - } else if (pseudoClass){ - pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue; - pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null; - - if (!currentParsed.pseudos) currentParsed.pseudos = []; - currentParsed.pseudos.push({ - key: pseudoClass.replace(reUnescape, ''), - value: pseudoClassValue, - type: pseudoMarker.length == 1 ? 'class' : 'element' - }); - - } else if (attributeKey){ - attributeKey = attributeKey.replace(reUnescape, ''); - attributeValue = (attributeValue || '').replace(reUnescape, ''); - - var test, regexp; - - switch (attributeOperator){ - case '^=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) ); break; - case '$=' : regexp = new RegExp( escapeRegExp(attributeValue) +'$' ); break; - case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break; - case '|=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) +'(-|$)' ); break; - case '=' : test = function(value){ - return attributeValue == value; - }; break; - case '*=' : test = function(value){ - return value && value.indexOf(attributeValue) > -1; - }; break; - case '!=' : test = function(value){ - return attributeValue != value; - }; break; - default : test = function(value){ - return !!value; - }; - } - - if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){ - return false; - }; - - if (!test) test = function(value){ - return value && regexp.test(value); - }; - - if (!currentParsed.attributes) currentParsed.attributes = []; - currentParsed.attributes.push({ - key: attributeKey, - operator: attributeOperator, - value: attributeValue, - test: test - }); - - } - - return ''; -}; - -// Slick NS - -var Slick = (this.Slick || {}); - -Slick.parse = function(expression){ - return parse(expression); -}; - -Slick.escapeRegExp = escapeRegExp; - -if (!this.Slick) this.Slick = Slick; - -}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); - - -/* ---- -name: Slick.Finder -description: The new, superfast css selector engine. -provides: Slick.Finder -requires: Slick.Parser -... -*/ - -;(function(){ - -var local = {}, - featuresCache = {}, - toString = Object.prototype.toString; - -// Feature / Bug detection - -local.isNativeCode = function(fn){ - return (/\{\s*\[native code\]\s*\}/).test('' + fn); -}; - -local.isXML = function(document){ - return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') || - (document.nodeType == 9 && document.documentElement.nodeName != 'HTML'); -}; - -local.setDocument = function(document){ - - // convert elements / window arguments to document. if document cannot be extrapolated, the function returns. - var nodeType = document.nodeType; - if (nodeType == 9); // document - else if (nodeType) document = document.ownerDocument; // node - else if (document.navigator) document = document.document; // window - else return; - - // check if it's the old document - - if (this.document === document) return; - this.document = document; - - // check if we have done feature detection on this document before - - var root = document.documentElement, - rootUid = this.getUIDXML(root), - features = featuresCache[rootUid], - feature; - - if (features){ - for (feature in features){ - this[feature] = features[feature]; - } - return; - } - - features = featuresCache[rootUid] = {}; - - features.root = root; - features.isXMLDocument = this.isXML(document); - - features.brokenStarGEBTN - = features.starSelectsClosedQSA - = features.idGetsName - = features.brokenMixedCaseQSA - = features.brokenGEBCN - = features.brokenCheckedQSA - = features.brokenEmptyAttributeQSA - = features.isHTMLDocument - = features.nativeMatchesSelector - = false; - - var starSelectsClosed, starSelectsComments, - brokenSecondClassNameGEBCN, cachedGetElementsByClassName, - brokenFormAttributeGetter; - - var selected, id = 'slick_uniqueid'; - var testNode = document.createElement('div'); - - var testRoot = document.body || document.getElementsByTagName('body')[0] || root; - testRoot.appendChild(testNode); - - // on non-HTML documents innerHTML and getElementsById doesnt work properly - try { - testNode.innerHTML = ''; - features.isHTMLDocument = !!document.getElementById(id); - } catch(e){}; - - if (features.isHTMLDocument){ - - testNode.style.display = 'none'; - - // IE returns comment nodes for getElementsByTagName('*') for some documents - testNode.appendChild(document.createComment('')); - starSelectsComments = (testNode.getElementsByTagName('*').length > 1); - - // IE returns closed nodes (EG:"") for getElementsByTagName('*') for some documents - try { - testNode.innerHTML = 'foo'; - selected = testNode.getElementsByTagName('*'); - starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); - } catch(e){}; - - features.brokenStarGEBTN = starSelectsComments || starSelectsClosed; - - // IE returns elements with the name instead of just id for getElementsById for some documents - try { - testNode.innerHTML = ''; - features.idGetsName = document.getElementById(id) === testNode.firstChild; - } catch(e){}; - - if (testNode.getElementsByClassName){ - - // Safari 3.2 getElementsByClassName caches results - try { - testNode.innerHTML = ''; - testNode.getElementsByClassName('b').length; - testNode.firstChild.className = 'b'; - cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2); - } catch(e){}; - - // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one - try { - testNode.innerHTML = ''; - brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2); - } catch(e){}; - - features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN; - } - - if (testNode.querySelectorAll){ - // IE 8 returns closed nodes (EG:"") for querySelectorAll('*') for some documents - try { - testNode.innerHTML = 'foo'; - selected = testNode.querySelectorAll('*'); - features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); - } catch(e){}; - - // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode - try { - testNode.innerHTML = ''; - features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length; - } catch(e){}; - - // Webkit and Opera dont return selected options on querySelectorAll - try { - testNode.innerHTML = ''; - features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0); - } catch(e){}; - - // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll - try { - testNode.innerHTML = ''; - features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0); - } catch(e){}; - - } - - // IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input - try { - testNode.innerHTML = '
      '; - brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's'); - } catch(e){}; - - // native matchesSelector function - - features.nativeMatchesSelector = root.matches || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector; - if (features.nativeMatchesSelector) try { - // if matchesSelector trows errors on incorrect sintaxes we can use it - features.nativeMatchesSelector.call(root, ':slick'); - features.nativeMatchesSelector = null; - } catch(e){}; - - } - - try { - root.slick_expando = 1; - delete root.slick_expando; - features.getUID = this.getUIDHTML; - } catch(e) { - features.getUID = this.getUIDXML; - } - - testRoot.removeChild(testNode); - testNode = selected = testRoot = null; - - // getAttribute - - features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){ - var method = this.attributeGetters[name]; - if (method) return method.call(node); - var attributeNode = node.getAttributeNode(name); - return (attributeNode) ? attributeNode.nodeValue : null; - } : function(node, name){ - var method = this.attributeGetters[name]; - return (method) ? method.call(node) : node.getAttribute(name); - }; - - // hasAttribute - - features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) { - return node.hasAttribute(attribute); - } : function(node, attribute) { - node = node.getAttributeNode(attribute); - return !!(node && (node.specified || node.nodeValue)); - }; - - // contains - // FIXME: Add specs: local.contains should be different for xml and html documents? - var nativeRootContains = root && this.isNativeCode(root.contains), - nativeDocumentContains = document && this.isNativeCode(document.contains); - - features.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){ - return context.contains(node); - } : (nativeRootContains && !nativeDocumentContains) ? function(context, node){ - // IE8 does not have .contains on document. - return context === node || ((context === document) ? document.documentElement : context).contains(node); - } : (root && root.compareDocumentPosition) ? function(context, node){ - return context === node || !!(context.compareDocumentPosition(node) & 16); - } : function(context, node){ - if (node) do { - if (node === context) return true; - } while ((node = node.parentNode)); - return false; - }; - - // document order sorting - // credits to Sizzle (http://sizzlejs.com/) - - features.documentSorter = (root.compareDocumentPosition) ? function(a, b){ - if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0; - return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; - } : ('sourceIndex' in root) ? function(a, b){ - if (!a.sourceIndex || !b.sourceIndex) return 0; - return a.sourceIndex - b.sourceIndex; - } : (document.createRange) ? function(a, b){ - if (!a.ownerDocument || !b.ownerDocument) return 0; - var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); - aRange.setStart(a, 0); - aRange.setEnd(a, 0); - bRange.setStart(b, 0); - bRange.setEnd(b, 0); - return aRange.compareBoundaryPoints(Range.START_TO_END, bRange); - } : null ; - - root = null; - - for (feature in features){ - this[feature] = features[feature]; - } -}; - -// Main Method - -var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/, - reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/, - qsaFailExpCache = {}; - -local.search = function(context, expression, append, first){ - - var found = this.found = (first) ? null : (append || []); - - if (!context) return found; - else if (context.navigator) context = context.document; // Convert the node from a window to a document - else if (!context.nodeType) return found; - - // setup - - var parsed, i, - uniques = this.uniques = {}, - hasOthers = !!(append && append.length), - contextIsDocument = (context.nodeType == 9); - - if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context); - - // avoid duplicating items already in the append array - if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true; - - // expression checks - - if (typeof expression == 'string'){ // expression is a string - - /**/ - var simpleSelector = expression.match(reSimpleSelector); - simpleSelectors: if (simpleSelector) { - - var symbol = simpleSelector[1], - name = simpleSelector[2], - node, nodes; - - if (!symbol){ - - if (name == '*' && this.brokenStarGEBTN) break simpleSelectors; - nodes = context.getElementsByTagName(name); - if (first) return nodes[0] || null; - for (i = 0; node = nodes[i++];){ - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - } - - } else if (symbol == '#'){ - - if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors; - node = context.getElementById(name); - if (!node) return found; - if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors; - if (first) return node || null; - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - - } else if (symbol == '.'){ - - if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors; - if (context.getElementsByClassName && !this.brokenGEBCN){ - nodes = context.getElementsByClassName(name); - if (first) return nodes[0] || null; - for (i = 0; node = nodes[i++];){ - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - } - } else { - var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)'); - nodes = context.getElementsByTagName('*'); - for (i = 0; node = nodes[i++];){ - className = node.className; - if (!(className && matchClass.test(className))) continue; - if (first) return node; - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - } - } - - } - - if (hasOthers) this.sort(found); - return (first) ? null : found; - - } - /**/ - - /**/ - querySelector: if (context.querySelectorAll) { - - if (!this.isHTMLDocument - || qsaFailExpCache[expression] - //TODO: only skip when expression is actually mixed case - || this.brokenMixedCaseQSA - || (this.brokenCheckedQSA && expression.indexOf(':checked') > -1) - || (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) - || (!contextIsDocument //Abort when !contextIsDocument and... - // there are multiple expressions in the selector - // since we currently only fix non-document rooted QSA for single expression selectors - && expression.indexOf(',') > -1 - ) - || Slick.disableQSA - ) break querySelector; - - var _expression = expression, _context = context; - if (!contextIsDocument){ - // non-document rooted QSA - // credits to Andrew Dupont - var currentId = _context.getAttribute('id'), slickid = 'slickid__'; - _context.setAttribute('id', slickid); - _expression = '#' + slickid + ' ' + _expression; - context = _context.parentNode; - } - - try { - if (first) return context.querySelector(_expression) || null; - else nodes = context.querySelectorAll(_expression); - } catch(e) { - qsaFailExpCache[expression] = 1; - break querySelector; - } finally { - if (!contextIsDocument){ - if (currentId) _context.setAttribute('id', currentId); - else _context.removeAttribute('id'); - context = _context; - } - } - - if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){ - if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node); - } else for (i = 0; node = nodes[i++];){ - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - } - - if (hasOthers) this.sort(found); - return found; - - } - /**/ - - parsed = this.Slick.parse(expression); - if (!parsed.length) return found; - } else if (expression == null){ // there is no expression - return found; - } else if (expression.Slick){ // expression is a parsed Slick object - parsed = expression; - } else if (this.contains(context.documentElement || context, expression)){ // expression is a node - (found) ? found.push(expression) : found = expression; - return found; - } else { // other junk - return found; - } - - /**//**/ - - // cache elements for the nth selectors - - this.posNTH = {}; - this.posNTHLast = {}; - this.posNTHType = {}; - this.posNTHTypeLast = {}; - - /**//**/ - - // if append is null and there is only a single selector with one expression use pushArray, else use pushUID - this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID; - - if (found == null) found = []; - - // default engine - - var j, m, n; - var combinator, tag, id, classList, classes, attributes, pseudos; - var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions; - - search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){ - - combinator = 'combinator:' + currentBit.combinator; - if (!this[combinator]) continue search; - - tag = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase(); - id = currentBit.id; - classList = currentBit.classList; - classes = currentBit.classes; - attributes = currentBit.attributes; - pseudos = currentBit.pseudos; - lastBit = (j === (currentExpression.length - 1)); - - this.bitUniques = {}; - - if (lastBit){ - this.uniques = uniques; - this.found = found; - } else { - this.uniques = {}; - this.found = []; - } - - if (j === 0){ - this[combinator](context, tag, id, classes, attributes, pseudos, classList); - if (first && lastBit && found.length) break search; - } else { - if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){ - this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); - if (found.length) break search; - } else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); - } - - currentItems = this.found; - } - - // should sort if there are nodes in append and if you pass multiple expressions. - if (hasOthers || (parsed.expressions.length > 1)) this.sort(found); - - return (first) ? (found[0] || null) : found; -}; - -// Utils - -local.uidx = 1; -local.uidk = 'slick-uniqueid'; - -local.getUIDXML = function(node){ - var uid = node.getAttribute(this.uidk); - if (!uid){ - uid = this.uidx++; - node.setAttribute(this.uidk, uid); - } - return uid; -}; - -local.getUIDHTML = function(node){ - return node.uniqueNumber || (node.uniqueNumber = this.uidx++); -}; - -// sort based on the setDocument documentSorter method. - -local.sort = function(results){ - if (!this.documentSorter) return results; - results.sort(this.documentSorter); - return results; -}; - -/**//**/ - -local.cacheNTH = {}; - -local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/; - -local.parseNTHArgument = function(argument){ - var parsed = argument.match(this.matchNTH); - if (!parsed) return false; - var special = parsed[2] || false; - var a = parsed[1] || 1; - if (a == '-') a = -1; - var b = +parsed[3] || 0; - parsed = - (special == 'n') ? {a: a, b: b} : - (special == 'odd') ? {a: 2, b: 1} : - (special == 'even') ? {a: 2, b: 0} : {a: 0, b: a}; - - return (this.cacheNTH[argument] = parsed); -}; - -local.createNTHPseudo = function(child, sibling, positions, ofType){ - return function(node, argument){ - var uid = this.getUID(node); - if (!this[positions][uid]){ - var parent = node.parentNode; - if (!parent) return false; - var el = parent[child], count = 1; - if (ofType){ - var nodeName = node.nodeName; - do { - if (el.nodeName != nodeName) continue; - this[positions][this.getUID(el)] = count++; - } while ((el = el[sibling])); - } else { - do { - if (el.nodeType != 1) continue; - this[positions][this.getUID(el)] = count++; - } while ((el = el[sibling])); - } - } - argument = argument || 'n'; - var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument); - if (!parsed) return false; - var a = parsed.a, b = parsed.b, pos = this[positions][uid]; - if (a == 0) return b == pos; - if (a > 0){ - if (pos < b) return false; - } else { - if (b < pos) return false; - } - return ((pos - b) % a) == 0; - }; -}; - -/**//**/ - -local.pushArray = function(node, tag, id, classes, attributes, pseudos){ - if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node); -}; - -local.pushUID = function(node, tag, id, classes, attributes, pseudos){ - var uid = this.getUID(node); - if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){ - this.uniques[uid] = true; - this.found.push(node); - } -}; - -local.matchNode = function(node, selector){ - if (this.isHTMLDocument && this.nativeMatchesSelector){ - try { - return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]')); - } catch(matchError) {} - } - - var parsed = this.Slick.parse(selector); - if (!parsed) return true; - - // simple (single) selectors - var expressions = parsed.expressions, simpleExpCounter = 0, i; - for (i = 0; (currentExpression = expressions[i]); i++){ - if (currentExpression.length == 1){ - var exp = currentExpression[0]; - if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true; - simpleExpCounter++; - } - } - - if (simpleExpCounter == parsed.length) return false; - - var nodes = this.search(this.document, parsed), item; - for (i = 0; item = nodes[i++];){ - if (item === node) return true; - } - return false; -}; - -local.matchPseudo = function(node, name, argument){ - var pseudoName = 'pseudo:' + name; - if (this[pseudoName]) return this[pseudoName](node, argument); - var attribute = this.getAttribute(node, name); - return (argument) ? argument == attribute : !!attribute; -}; - -local.matchSelector = function(node, tag, id, classes, attributes, pseudos){ - if (tag){ - var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase(); - if (tag == '*'){ - if (nodeName < '@') return false; // Fix for comment nodes and closed nodes - } else { - if (nodeName != tag) return false; - } - } - - if (id && node.getAttribute('id') != id) return false; - - var i, part, cls; - if (classes) for (i = classes.length; i--;){ - cls = this.getAttribute(node, 'class'); - if (!(cls && classes[i].regexp.test(cls))) return false; - } - if (attributes) for (i = attributes.length; i--;){ - part = attributes[i]; - if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false; - } - if (pseudos) for (i = pseudos.length; i--;){ - part = pseudos[i]; - if (!this.matchPseudo(node, part.key, part.value)) return false; - } - return true; -}; - -var combinators = { - - ' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level - - var i, item, children; - - if (this.isHTMLDocument){ - getById: if (id){ - item = this.document.getElementById(id); - if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){ - // all[id] returns all the elements with that name or id inside node - // if theres just one it will return the element, else it will be a collection - children = node.all[id]; - if (!children) return; - if (!children[0]) children = [children]; - for (i = 0; item = children[i++];){ - var idNode = item.getAttributeNode('id'); - if (idNode && idNode.nodeValue == id){ - this.push(item, tag, null, classes, attributes, pseudos); - break; - } - } - return; - } - if (!item){ - // if the context is in the dom we return, else we will try GEBTN, breaking the getById label - if (this.contains(this.root, node)) return; - else break getById; - } else if (this.document !== node && !this.contains(node, item)) return; - this.push(item, tag, null, classes, attributes, pseudos); - return; - } - getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){ - children = node.getElementsByClassName(classList.join(' ')); - if (!(children && children.length)) break getByClass; - for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos); - return; - } - } - getByTag: { - children = node.getElementsByTagName(tag); - if (!(children && children.length)) break getByTag; - if (!this.brokenStarGEBTN) tag = null; - for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos); - } - }, - - '>': function(node, tag, id, classes, attributes, pseudos){ // direct children - if ((node = node.firstChild)) do { - if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); - } while ((node = node.nextSibling)); - }, - - '+': function(node, tag, id, classes, attributes, pseudos){ // next sibling - while ((node = node.nextSibling)) if (node.nodeType == 1){ - this.push(node, tag, id, classes, attributes, pseudos); - break; - } - }, - - '^': function(node, tag, id, classes, attributes, pseudos){ // first child - node = node.firstChild; - if (node){ - if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); - else this['combinator:+'](node, tag, id, classes, attributes, pseudos); - } - }, - - '~': function(node, tag, id, classes, attributes, pseudos){ // next siblings - while ((node = node.nextSibling)){ - if (node.nodeType != 1) continue; - var uid = this.getUID(node); - if (this.bitUniques[uid]) break; - this.bitUniques[uid] = true; - this.push(node, tag, id, classes, attributes, pseudos); - } - }, - - '++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling - this['combinator:+'](node, tag, id, classes, attributes, pseudos); - this['combinator:!+'](node, tag, id, classes, attributes, pseudos); - }, - - '~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings - this['combinator:~'](node, tag, id, classes, attributes, pseudos); - this['combinator:!~'](node, tag, id, classes, attributes, pseudos); - }, - - '!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document - while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); - }, - - '!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level) - node = node.parentNode; - if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); - }, - - '!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling - while ((node = node.previousSibling)) if (node.nodeType == 1){ - this.push(node, tag, id, classes, attributes, pseudos); - break; - } - }, - - '!^': function(node, tag, id, classes, attributes, pseudos){ // last child - node = node.lastChild; - if (node){ - if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); - else this['combinator:!+'](node, tag, id, classes, attributes, pseudos); - } - }, - - '!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings - while ((node = node.previousSibling)){ - if (node.nodeType != 1) continue; - var uid = this.getUID(node); - if (this.bitUniques[uid]) break; - this.bitUniques[uid] = true; - this.push(node, tag, id, classes, attributes, pseudos); - } - } - -}; - -for (var c in combinators) local['combinator:' + c] = combinators[c]; - -var pseudos = { - - /**/ - - 'empty': function(node){ - var child = node.firstChild; - return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length; - }, - - 'not': function(node, expression){ - return !this.matchNode(node, expression); - }, - - 'contains': function(node, text){ - return (node.innerText || node.textContent || '').indexOf(text) > -1; - }, - - 'first-child': function(node){ - while ((node = node.previousSibling)) if (node.nodeType == 1) return false; - return true; - }, - - 'last-child': function(node){ - while ((node = node.nextSibling)) if (node.nodeType == 1) return false; - return true; - }, - - 'only-child': function(node){ - var prev = node; - while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false; - var next = node; - while ((next = next.nextSibling)) if (next.nodeType == 1) return false; - return true; - }, - - /**/ - - 'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'), - - 'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'), - - 'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true), - - 'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true), - - 'index': function(node, index){ - return this['pseudo:nth-child'](node, '' + (index + 1)); - }, - - 'even': function(node){ - return this['pseudo:nth-child'](node, '2n'); - }, - - 'odd': function(node){ - return this['pseudo:nth-child'](node, '2n+1'); - }, - - /**/ - - /**/ - - 'first-of-type': function(node){ - var nodeName = node.nodeName; - while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false; - return true; - }, - - 'last-of-type': function(node){ - var nodeName = node.nodeName; - while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false; - return true; - }, - - 'only-of-type': function(node){ - var prev = node, nodeName = node.nodeName; - while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false; - var next = node; - while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false; - return true; - }, - - /**/ - - // custom pseudos - - 'enabled': function(node){ - return !node.disabled; - }, - - 'disabled': function(node){ - return node.disabled; - }, - - 'checked': function(node){ - return node.checked || node.selected; - }, - - 'focus': function(node){ - return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex')); - }, - - 'root': function(node){ - return (node === this.root); - }, - - 'selected': function(node){ - return node.selected; - } - - /**/ -}; - -for (var p in pseudos) local['pseudo:' + p] = pseudos[p]; - -// attributes methods - -var attributeGetters = local.attributeGetters = { - - 'for': function(){ - return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for'); - }, - - 'href': function(){ - return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href'); - }, - - 'style': function(){ - return (this.style) ? this.style.cssText : this.getAttribute('style'); - }, - - 'tabindex': function(){ - var attributeNode = this.getAttributeNode('tabindex'); - return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; - }, - - 'type': function(){ - return this.getAttribute('type'); - }, - - 'maxlength': function(){ - var attributeNode = this.getAttributeNode('maxLength'); - return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; - } - -}; - -attributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength; - -// Slick - -var Slick = local.Slick = (this.Slick || {}); - -Slick.version = '1.1.7'; - -// Slick finder - -Slick.search = function(context, expression, append){ - return local.search(context, expression, append); -}; - -Slick.find = function(context, expression){ - return local.search(context, expression, null, true); -}; - -// Slick containment checker - -Slick.contains = function(container, node){ - local.setDocument(container); - return local.contains(container, node); -}; - -// Slick attribute getter - -Slick.getAttribute = function(node, name){ - local.setDocument(node); - return local.getAttribute(node, name); -}; - -Slick.hasAttribute = function(node, name){ - local.setDocument(node); - return local.hasAttribute(node, name); -}; - -// Slick matcher - -Slick.match = function(node, selector){ - if (!(node && selector)) return false; - if (!selector || selector === node) return true; - local.setDocument(node); - return local.matchNode(node, selector); -}; - -// Slick attribute accessor - -Slick.defineAttributeGetter = function(name, fn){ - local.attributeGetters[name] = fn; - return this; -}; - -Slick.lookupAttributeGetter = function(name){ - return local.attributeGetters[name]; -}; - -// Slick pseudo accessor - -Slick.definePseudo = function(name, fn){ - local['pseudo:' + name] = function(node, argument){ - return fn.call(node, argument); - }; - return this; -}; - -Slick.lookupPseudo = function(name){ - var pseudo = local['pseudo:' + name]; - if (pseudo) return function(argument){ - return pseudo.call(this, argument); - }; - return null; -}; - -// Slick overrides accessor - -Slick.override = function(regexp, fn){ - local.override(regexp, fn); - return this; -}; - -Slick.isXML = local.isXML; - -Slick.uidOf = function(node){ - return local.getUIDHTML(node); -}; - -if (!this.Slick) this.Slick = Slick; - -}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); - - -/* ---- - -name: Element - -description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements. - -license: MIT-style license. - -requires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder] - -provides: [Element, Elements, $, $$, IFrame, Selectors] - -... -*/ - -var Element = this.Element = function(tag, props){ - var konstructor = Element.Constructors[tag]; - if (konstructor) return konstructor(props); - if (typeof tag != 'string') return document.id(tag).set(props); - - if (!props) props = {}; - - if (!(/^[\w-]+$/).test(tag)){ - var parsed = Slick.parse(tag).expressions[0][0]; - tag = (parsed.tag == '*') ? 'div' : parsed.tag; - if (parsed.id && props.id == null) props.id = parsed.id; - - var attributes = parsed.attributes; - if (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){ - attr = attributes[i]; - if (props[attr.key] != null) continue; - - if (attr.value != null && attr.operator == '=') props[attr.key] = attr.value; - else if (!attr.value && !attr.operator) props[attr.key] = true; - } - - if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' '); - } - - return document.newElement(tag, props); -}; - - -if (Browser.Element){ - Element.prototype = Browser.Element.prototype; - // IE8 and IE9 require the wrapping. - Element.prototype._fireEvent = (function(fireEvent){ - return function(type, event){ - return fireEvent.call(this, type, event); - }; - })(Element.prototype.fireEvent); -} - -new Type('Element', Element).mirror(function(name){ - if (Array.prototype[name]) return; - - var obj = {}; - obj[name] = function(){ - var results = [], args = arguments, elements = true; - for (var i = 0, l = this.length; i < l; i++){ - var element = this[i], result = results[i] = element[name].apply(element, args); - elements = (elements && typeOf(result) == 'element'); - } - return (elements) ? new Elements(results) : results; - }; - - Elements.implement(obj); -}); - -if (!Browser.Element){ - Element.parent = Object; - - Element.Prototype = { - '$constructor': Element, - '$family': Function.from('element').hide() - }; - - Element.mirror(function(name, method){ - Element.Prototype[name] = method; - }); -} - -Element.Constructors = {}; - - - -var IFrame = new Type('IFrame', function(){ - var params = Array.link(arguments, { - properties: Type.isObject, - iframe: function(obj){ - return (obj != null); - } - }); - - var props = params.properties || {}, iframe; - if (params.iframe) iframe = document.id(params.iframe); - var onload = props.onload || function(){}; - delete props.onload; - props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick(); - iframe = new Element(iframe || 'iframe', props); - - var onLoad = function(){ - onload.call(iframe.contentWindow); - }; - - if (window.frames[props.id]) onLoad(); - else iframe.addListener('load', onLoad); - return iframe; -}); - -var Elements = this.Elements = function(nodes){ - if (nodes && nodes.length){ - var uniques = {}, node; - for (var i = 0; node = nodes[i++];){ - var uid = Slick.uidOf(node); - if (!uniques[uid]){ - uniques[uid] = true; - this.push(node); - } - } - } -}; - -Elements.prototype = {length: 0}; -Elements.parent = Array; - -new Type('Elements', Elements).implement({ - - filter: function(filter, bind){ - if (!filter) return this; - return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){ - return item.match(filter); - } : filter, bind)); - }.protect(), - - push: function(){ - var length = this.length; - for (var i = 0, l = arguments.length; i < l; i++){ - var item = document.id(arguments[i]); - if (item) this[length++] = item; - } - return (this.length = length); - }.protect(), - - unshift: function(){ - var items = []; - for (var i = 0, l = arguments.length; i < l; i++){ - var item = document.id(arguments[i]); - if (item) items.push(item); - } - return Array.prototype.unshift.apply(this, items); - }.protect(), - - concat: function(){ - var newElements = new Elements(this); - for (var i = 0, l = arguments.length; i < l; i++){ - var item = arguments[i]; - if (Type.isEnumerable(item)) newElements.append(item); - else newElements.push(item); - } - return newElements; - }.protect(), - - append: function(collection){ - for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]); - return this; - }.protect(), - - empty: function(){ - while (this.length) delete this[--this.length]; - return this; - }.protect() - -}); - - - -(function(){ - -// FF, IE -var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2}; - -splice.call(object, 1, 1); -if (object[1] == 1) Elements.implement('splice', function(){ - var length = this.length; - var result = splice.apply(this, arguments); - while (length >= this.length) delete this[length--]; - return result; -}.protect()); - -Array.forEachMethod(function(method, name){ - Elements.implement(name, method); -}); - -Array.mirror(Elements); - -/**/ -var createElementAcceptsHTML; -try { - createElementAcceptsHTML = (document.createElement('').name == 'x'); -} catch (e){} - -var escapeQuotes = function(html){ - return ('' + html).replace(/&/g, '&').replace(/"/g, '"'); -}; -/**/ - -Document.implement({ - - newElement: function(tag, props){ - if (props && props.checked != null) props.defaultChecked = props.checked; - /**/// Fix for readonly name and type properties in IE < 8 - if (createElementAcceptsHTML && props){ - tag = '<' + tag; - if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"'; - if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"'; - tag += '>'; - delete props.name; - delete props.type; - } - /**/ - return this.id(this.createElement(tag)).set(props); - } - -}); - -})(); - -(function(){ - -Slick.uidOf(window); -Slick.uidOf(document); - -Document.implement({ - - newTextNode: function(text){ - return this.createTextNode(text); - }, - - getDocument: function(){ - return this; - }, - - getWindow: function(){ - return this.window; - }, - - id: (function(){ - - var types = { - - string: function(id, nocash, doc){ - id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1')); - return (id) ? types.element(id, nocash) : null; - }, - - element: function(el, nocash){ - Slick.uidOf(el); - if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){ - var fireEvent = el.fireEvent; - // wrapping needed in IE7, or else crash - el._fireEvent = function(type, event){ - return fireEvent(type, event); - }; - Object.append(el, Element.Prototype); - } - return el; - }, - - object: function(obj, nocash, doc){ - if (obj.toElement) return types.element(obj.toElement(doc), nocash); - return null; - } - - }; - - types.textnode = types.whitespace = types.window = types.document = function(zero){ - return zero; - }; - - return function(el, nocash, doc){ - if (el && el.$family && el.uniqueNumber) return el; - var type = typeOf(el); - return (types[type]) ? types[type](el, nocash, doc || document) : null; - }; - - })() - -}); - -if (window.$ == null) Window.implement('$', function(el, nc){ - return document.id(el, nc, this.document); -}); - -Window.implement({ - - getDocument: function(){ - return this.document; - }, - - getWindow: function(){ - return this; - } - -}); - -[Document, Element].invoke('implement', { - - getElements: function(expression){ - return Slick.search(this, expression, new Elements); - }, - - getElement: function(expression){ - return document.id(Slick.find(this, expression)); - } - -}); - -var contains = {contains: function(element){ - return Slick.contains(this, element); -}}; - -if (!document.contains) Document.implement(contains); -if (!document.createElement('div').contains) Element.implement(contains); - - - -// tree walking - -var injectCombinator = function(expression, combinator){ - if (!expression) return combinator; - - expression = Object.clone(Slick.parse(expression)); - - var expressions = expression.expressions; - for (var i = expressions.length; i--;) - expressions[i][0].combinator = combinator; - - return expression; -}; - -Object.forEach({ - getNext: '~', - getPrevious: '!~', - getParent: '!' -}, function(combinator, method){ - Element.implement(method, function(expression){ - return this.getElement(injectCombinator(expression, combinator)); - }); -}); - -Object.forEach({ - getAllNext: '~', - getAllPrevious: '!~', - getSiblings: '~~', - getChildren: '>', - getParents: '!' -}, function(combinator, method){ - Element.implement(method, function(expression){ - return this.getElements(injectCombinator(expression, combinator)); - }); -}); - -Element.implement({ - - getFirst: function(expression){ - return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]); - }, - - getLast: function(expression){ - return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast()); - }, - - getWindow: function(){ - return this.ownerDocument.window; - }, - - getDocument: function(){ - return this.ownerDocument; - }, - - getElementById: function(id){ - return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1'))); - }, - - match: function(expression){ - return !expression || Slick.match(this, expression); - } - -}); - - - -if (window.$$ == null) Window.implement('$$', function(selector){ - if (arguments.length == 1){ - if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements); - else if (Type.isEnumerable(selector)) return new Elements(selector); - } - return new Elements(arguments); -}); - -// Inserters - -var inserters = { - - before: function(context, element){ - var parent = element.parentNode; - if (parent) parent.insertBefore(context, element); - }, - - after: function(context, element){ - var parent = element.parentNode; - if (parent) parent.insertBefore(context, element.nextSibling); - }, - - bottom: function(context, element){ - element.appendChild(context); - }, - - top: function(context, element){ - element.insertBefore(context, element.firstChild); - } - -}; - -inserters.inside = inserters.bottom; - - - -// getProperty / setProperty - -var propertyGetters = {}, propertySetters = {}; - -// properties - -var properties = {}; -Array.forEach([ - 'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', - 'frameBorder', 'rowSpan', 'tabIndex', 'useMap' -], function(property){ - properties[property.toLowerCase()] = property; -}); - -properties.html = 'innerHTML'; -properties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent'; - -Object.forEach(properties, function(real, key){ - propertySetters[key] = function(node, value){ - node[real] = value; - }; - propertyGetters[key] = function(node){ - return node[real]; - }; -}); - -// Booleans - -var bools = [ - 'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', - 'disabled', 'readOnly', 'multiple', 'selected', 'noresize', - 'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay', - 'loop' -]; - -var booleans = {}; -Array.forEach(bools, function(bool){ - var lower = bool.toLowerCase(); - booleans[lower] = bool; - propertySetters[lower] = function(node, value){ - node[bool] = !!value; - }; - propertyGetters[lower] = function(node){ - return !!node[bool]; - }; -}); - -// Special cases - -Object.append(propertySetters, { - - 'class': function(node, value){ - ('className' in node) ? node.className = (value || '') : node.setAttribute('class', value); - }, - - 'for': function(node, value){ - ('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value); - }, - - 'style': function(node, value){ - (node.style) ? node.style.cssText = value : node.setAttribute('style', value); - }, - - 'value': function(node, value){ - node.value = (value != null) ? value : ''; - } - -}); - -propertyGetters['class'] = function(node){ - return ('className' in node) ? node.className || null : node.getAttribute('class'); -}; - -/* */ -var el = document.createElement('button'); -// IE sets type as readonly and throws -try { el.type = 'button'; } catch(e){} -if (el.type != 'button') propertySetters.type = function(node, value){ - node.setAttribute('type', value); -}; -el = null; -/* */ - -/**/ -var input = document.createElement('input'); -input.value = 't'; -input.type = 'submit'; -if (input.value != 't') propertySetters.type = function(node, type){ - var value = node.value; - node.type = type; - node.value = value; -}; -input = null; -/**/ - -/* getProperty, setProperty */ - -/* */ -var pollutesGetAttribute = (function(div){ - div.random = 'attribute'; - return (div.getAttribute('random') == 'attribute'); -})(document.createElement('div')); - -var hasCloneBug = (function(test){ - test.innerHTML = ''; - return test.cloneNode(true).firstChild.childNodes.length != 1; -})(document.createElement('div')); -/* */ - -var hasClassList = !!document.createElement('div').classList; - -var classes = function(className){ - var classNames = (className || '').clean().split(" "), uniques = {}; - return classNames.filter(function(className){ - if (className !== "" && !uniques[className]) return uniques[className] = className; - }); -}; - -var addToClassList = function(name){ - this.classList.add(name); -}; - -var removeFromClassList = function(name){ - this.classList.remove(name); -}; - -Element.implement({ - - setProperty: function(name, value){ - var setter = propertySetters[name.toLowerCase()]; - if (setter){ - setter(this, value); - } else { - /* */ - var attributeWhiteList; - if (pollutesGetAttribute) attributeWhiteList = this.retrieve('$attributeWhiteList', {}); - /* */ - - if (value == null){ - this.removeAttribute(name); - /* */ - if (pollutesGetAttribute) delete attributeWhiteList[name]; - /* */ - } else { - this.setAttribute(name, '' + value); - /* */ - if (pollutesGetAttribute) attributeWhiteList[name] = true; - /* */ - } - } - return this; - }, - - setProperties: function(attributes){ - for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); - return this; - }, - - getProperty: function(name){ - var getter = propertyGetters[name.toLowerCase()]; - if (getter) return getter(this); - /* */ - if (pollutesGetAttribute){ - var attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {}); - if (!attr) return null; - if (attr.expando && !attributeWhiteList[name]){ - var outer = this.outerHTML; - // segment by the opening tag and find mention of attribute name - if (outer.substr(0, outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name) < 0) return null; - attributeWhiteList[name] = true; - } - } - /* */ - var result = Slick.getAttribute(this, name); - return (!result && !Slick.hasAttribute(this, name)) ? null : result; - }, - - getProperties: function(){ - var args = Array.from(arguments); - return args.map(this.getProperty, this).associate(args); - }, - - removeProperty: function(name){ - return this.setProperty(name, null); - }, - - removeProperties: function(){ - Array.each(arguments, this.removeProperty, this); - return this; - }, - - set: function(prop, value){ - var property = Element.Properties[prop]; - (property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value); - }.overloadSetter(), - - get: function(prop){ - var property = Element.Properties[prop]; - return (property && property.get) ? property.get.apply(this) : this.getProperty(prop); - }.overloadGetter(), - - erase: function(prop){ - var property = Element.Properties[prop]; - (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); - return this; - }, - - hasClass: hasClassList ? function(className){ - return this.classList.contains(className); - } : function(className){ - return this.className.clean().contains(className, ' '); - }, - - addClass: hasClassList ? function(className){ - classes(className).forEach(addToClassList, this); - return this; - } : function(className){ - this.className = classes(className + ' ' + this.className).join(' '); - return this; - }, - - removeClass: hasClassList ? function(className){ - classes(className).forEach(removeFromClassList, this); - return this; - } : function(className){ - var classNames = classes(this.className); - classes(className).forEach(classNames.erase, classNames); - this.className = classNames.join(' '); - return this; - }, - - toggleClass: function(className, force){ - if (force == null) force = !this.hasClass(className); - return (force) ? this.addClass(className) : this.removeClass(className); - }, - - adopt: function(){ - var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length; - if (length > 1) parent = fragment = document.createDocumentFragment(); - - for (var i = 0; i < length; i++){ - var element = document.id(elements[i], true); - if (element) parent.appendChild(element); - } - - if (fragment) this.appendChild(fragment); - - return this; - }, - - appendText: function(text, where){ - return this.grab(this.getDocument().newTextNode(text), where); - }, - - grab: function(el, where){ - inserters[where || 'bottom'](document.id(el, true), this); - return this; - }, - - inject: function(el, where){ - inserters[where || 'bottom'](this, document.id(el, true)); - return this; - }, - - replaces: function(el){ - el = document.id(el, true); - el.parentNode.replaceChild(this, el); - return this; - }, - - wraps: function(el, where){ - el = document.id(el, true); - return this.replaces(el).grab(el, where); - }, - - getSelected: function(){ - this.selectedIndex; // Safari 3.2.1 - return new Elements(Array.from(this.options).filter(function(option){ - return option.selected; - })); - }, - - toQueryString: function(){ - var queryString = []; - this.getElements('input, select, textarea').each(function(el){ - var type = el.type; - if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return; - - var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){ - // IE - return document.id(opt).get('value'); - }) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value'); - - Array.from(value).each(function(val){ - if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val)); - }); - }); - return queryString.join('&'); - } - -}); - - -// appendHTML - -var appendInserters = { - before: 'beforeBegin', - after: 'afterEnd', - bottom: 'beforeEnd', - top: 'afterBegin', - inside: 'beforeEnd' -}; - -Element.implement('appendHTML', ('insertAdjacentHTML' in document.createElement('div')) ? function(html, where){ - this.insertAdjacentHTML(appendInserters[where || 'bottom'], html); - return this; -} : function(html, where){ - var temp = new Element('div', {html: html}), - children = temp.childNodes, - fragment = temp.firstChild; - - if (!fragment) return this; - if (children.length > 1){ - fragment = document.createDocumentFragment(); - for (var i = 0, l = children.length; i < l; i++){ - fragment.appendChild(children[i]); - } - } - - inserters[where || 'bottom'](fragment, this); - return this; -}); - -var collected = {}, storage = {}; - -var get = function(uid){ - return (storage[uid] || (storage[uid] = {})); -}; - -var clean = function(item){ - var uid = item.uniqueNumber; - if (item.removeEvents) item.removeEvents(); - if (item.clearAttributes) item.clearAttributes(); - if (uid != null){ - delete collected[uid]; - delete storage[uid]; - } - return item; -}; - -var formProps = {input: 'checked', option: 'selected', textarea: 'value'}; - -Element.implement({ - - destroy: function(){ - var children = clean(this).getElementsByTagName('*'); - Array.each(children, clean); - Element.dispose(this); - return null; - }, - - empty: function(){ - Array.from(this.childNodes).each(Element.dispose); - return this; - }, - - dispose: function(){ - return (this.parentNode) ? this.parentNode.removeChild(this) : this; - }, - - clone: function(contents, keepid){ - contents = contents !== false; - var clone = this.cloneNode(contents), ce = [clone], te = [this], i; - - if (contents){ - ce.append(Array.from(clone.getElementsByTagName('*'))); - te.append(Array.from(this.getElementsByTagName('*'))); - } - - for (i = ce.length; i--;){ - var node = ce[i], element = te[i]; - if (!keepid) node.removeAttribute('id'); - /**/ - if (node.clearAttributes){ - node.clearAttributes(); - node.mergeAttributes(element); - node.removeAttribute('uniqueNumber'); - if (node.options){ - var no = node.options, eo = element.options; - for (var j = no.length; j--;) no[j].selected = eo[j].selected; - } - } - /**/ - var prop = formProps[element.tagName.toLowerCase()]; - if (prop && element[prop]) node[prop] = element[prop]; - } - - /**/ - if (hasCloneBug){ - var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object'); - for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML; - } - /**/ - return document.id(clone); - } - -}); - -[Element, Window, Document].invoke('implement', { - - addListener: function(type, fn){ - if (window.attachEvent && !window.addEventListener){ - collected[Slick.uidOf(this)] = this; - } - if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]); - else this.attachEvent('on' + type, fn); - return this; - }, - - removeListener: function(type, fn){ - if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]); - else this.detachEvent('on' + type, fn); - return this; - }, - - retrieve: function(property, dflt){ - var storage = get(Slick.uidOf(this)), prop = storage[property]; - if (dflt != null && prop == null) prop = storage[property] = dflt; - return prop != null ? prop : null; - }, - - store: function(property, value){ - var storage = get(Slick.uidOf(this)); - storage[property] = value; - return this; - }, - - eliminate: function(property){ - var storage = get(Slick.uidOf(this)); - delete storage[property]; - return this; - } - -}); - -/**/ -if (window.attachEvent && !window.addEventListener){ - var gc = function(){ - Object.each(collected, clean); - if (window.CollectGarbage) CollectGarbage(); - window.removeListener('unload', gc); - } - window.addListener('unload', gc); -} -/**/ - -Element.Properties = {}; - - - -Element.Properties.style = { - - set: function(style){ - this.style.cssText = style; - }, - - get: function(){ - return this.style.cssText; - }, - - erase: function(){ - this.style.cssText = ''; - } - -}; - -Element.Properties.tag = { - - get: function(){ - return this.tagName.toLowerCase(); - } - -}; - -Element.Properties.html = { - - set: function(html){ - if (html == null) html = ''; - else if (typeOf(html) == 'array') html = html.join(''); - this.innerHTML = html; - }, - - erase: function(){ - this.innerHTML = ''; - } - -}; - -var supportsHTML5Elements = true, supportsTableInnerHTML = true, supportsTRInnerHTML = true; - -/**/ -// technique by jdbarlett - http://jdbartlett.com/innershiv/ -var div = document.createElement('div'); -div.innerHTML = ''; -supportsHTML5Elements = (div.childNodes.length == 1); -if (!supportsHTML5Elements){ - var tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '), - fragment = document.createDocumentFragment(), l = tags.length; - while (l--) fragment.createElement(tags[l]); -} -div = null; -/**/ - -/**/ -supportsTableInnerHTML = Function.attempt(function(){ - var table = document.createElement('table'); - table.innerHTML = ''; - return true; -}); - -/**/ -var tr = document.createElement('tr'), html = ''; -tr.innerHTML = html; -supportsTRInnerHTML = (tr.innerHTML == html); -tr = null; -/**/ - -if (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){ - - Element.Properties.html.set = (function(set){ - - var translations = { - table: [1, '', '
      '], - select: [1, ''], - tbody: [2, '', '
      '], - tr: [3, '', '
      '] - }; - - translations.thead = translations.tfoot = translations.tbody; - - return function(html){ - var wrap = translations[this.get('tag')]; - if (!wrap && !supportsHTML5Elements) wrap = [0, '', '']; - if (!wrap) return set.call(this, html); - - var level = wrap[0], wrapper = document.createElement('div'), target = wrapper; - if (!supportsHTML5Elements) fragment.appendChild(wrapper); - wrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join(''); - while (level--) target = target.firstChild; - this.empty().adopt(target.childNodes); - if (!supportsHTML5Elements) fragment.removeChild(wrapper); - wrapper = null; - }; - - })(Element.Properties.html.set); -} -/*
      */ - -/**/ -var testForm = document.createElement('form'); -testForm.innerHTML = ''; - -if (testForm.firstChild.value != 's') Element.Properties.value = { - - set: function(value){ - var tag = this.get('tag'); - if (tag != 'select') return this.setProperty('value', value); - var options = this.getElements('option'); - value = String(value); - for (var i = 0; i < options.length; i++){ - var option = options[i], - attr = option.getAttributeNode('value'), - optionValue = (attr && attr.specified) ? option.value : option.get('text'); - if (optionValue === value) return option.selected = true; - } - }, - - get: function(){ - var option = this, tag = option.get('tag'); - - if (tag != 'select' && tag != 'option') return this.getProperty('value'); - - if (tag == 'select' && !(option = option.getSelected()[0])) return ''; - - var attr = option.getAttributeNode('value'); - return (attr && attr.specified) ? option.value : option.get('text'); - } - -}; -testForm = null; -/**/ - -/**/ -if (document.createElement('div').getAttributeNode('id')) Element.Properties.id = { - set: function(id){ - this.id = this.getAttributeNode('id').value = id; - }, - get: function(){ - return this.id || null; - }, - erase: function(){ - this.id = this.getAttributeNode('id').value = ''; - } -}; -/**/ - -})(); - - -/* ---- - -name: Element.Style - -description: Contains methods for interacting with the styles of Elements in a fashionable way. - -license: MIT-style license. - -requires: Element - -provides: Element.Style - -... -*/ - -(function(){ - -var html = document.html, el; - -// -// Check for oldIE, which does not remove styles when they're set to null -el = document.createElement('div'); -el.style.color = 'red'; -el.style.color = null; -var doesNotRemoveStyles = el.style.color == 'red'; - -// check for oldIE, which returns border* shorthand styles in the wrong order (color-width-style instead of width-style-color) -var border = '1px solid #123abc'; -el.style.border = border; -var returnsBordersInWrongOrder = el.style.border != border; -el = null; -// - -var hasGetComputedStyle = !!window.getComputedStyle; - -Element.Properties.styles = {set: function(styles){ - this.setStyles(styles); -}}; - -var hasOpacity = (html.style.opacity != null), - hasFilter = (html.style.filter != null), - reAlpha = /alpha\(opacity=([\d.]+)\)/i; - -var setVisibility = function(element, opacity){ - element.store('$opacity', opacity); - element.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden'; -}; - -// -var setFilter = function(element, regexp, value){ - var style = element.style, - filter = style.filter || element.getComputedStyle('filter') || ''; - style.filter = (regexp.test(filter) ? filter.replace(regexp, value) : filter + ' ' + value).trim(); - if (!style.filter) style.removeAttribute('filter'); -}; -// - -var setOpacity = (hasOpacity ? function(element, opacity){ - element.style.opacity = opacity; -} : (hasFilter ? function(element, opacity){ - if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1; - if (opacity == null || opacity == 1){ - setFilter(element, reAlpha, ''); - if (opacity == 1 && getOpacity(element) != 1) setFilter(element, reAlpha, 'alpha(opacity=100)'); - } else { - setFilter(element, reAlpha, 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')'); - } -} : setVisibility)); - -var getOpacity = (hasOpacity ? function(element){ - var opacity = element.style.opacity || element.getComputedStyle('opacity'); - return (opacity == '') ? 1 : opacity.toFloat(); -} : (hasFilter ? function(element){ - var filter = (element.style.filter || element.getComputedStyle('filter')), - opacity; - if (filter) opacity = filter.match(reAlpha); - return (opacity == null || filter == null) ? 1 : (opacity[1] / 100); -} : function(element){ - var opacity = element.retrieve('$opacity'); - if (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1); - return opacity; -})); - -var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat', - namedPositions = {left: '0%', top: '0%', center: '50%', right: '100%', bottom: '100%'}, - hasBackgroundPositionXY = (html.style.backgroundPositionX != null); - -// -var removeStyle = function(style, property){ - if (property == 'backgroundPosition'){ - style.removeAttribute(property + 'X'); - property += 'Y'; - } - style.removeAttribute(property); -}; -// - -Element.implement({ - - getComputedStyle: function(property){ - if (!hasGetComputedStyle && this.currentStyle) return this.currentStyle[property.camelCase()]; - var defaultView = Element.getDocument(this).defaultView, - computed = defaultView ? defaultView.getComputedStyle(this, null) : null; - return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : ''; - }, - - setStyle: function(property, value){ - if (property == 'opacity'){ - if (value != null) value = parseFloat(value); - setOpacity(this, value); - return this; - } - property = (property == 'float' ? floatName : property).camelCase(); - if (typeOf(value) != 'string'){ - var map = (Element.Styles[property] || '@').split(' '); - value = Array.from(value).map(function(val, i){ - if (!map[i]) return ''; - return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; - }).join(' '); - } else if (value == String(Number(value))){ - value = Math.round(value); - } - this.style[property] = value; - // - if ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){ - removeStyle(this.style, property); - } - // - return this; - }, - - getStyle: function(property){ - if (property == 'opacity') return getOpacity(this); - property = (property == 'float' ? floatName : property).camelCase(); - var result = this.style[property]; - if (!result || property == 'zIndex'){ - if (Element.ShortStyles.hasOwnProperty(property)){ - result = []; - for (var s in Element.ShortStyles[property]) result.push(this.getStyle(s)); - return result.join(' '); - } - result = this.getComputedStyle(property); - } - if (hasBackgroundPositionXY && /^backgroundPosition[XY]?$/.test(property)){ - return result.replace(/(top|right|bottom|left)/g, function(position){ - return namedPositions[position]; - }) || '0px'; - } - if (!result && property == 'backgroundPosition') return '0px 0px'; - if (result){ - result = String(result); - var color = result.match(/rgba?\([\d\s,]+\)/); - if (color) result = result.replace(color[0], color[0].rgbToHex()); - } - if (!hasGetComputedStyle && !this.style[property]){ - if ((/^(height|width)$/).test(property) && !(/px$/.test(result))){ - var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; - values.each(function(value){ - size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); - }, this); - return this['offset' + property.capitalize()] - size + 'px'; - } - if ((/^border(.+)Width|margin|padding/).test(property) && isNaN(parseFloat(result))){ - return '0px'; - } - } - // - if (returnsBordersInWrongOrder && /^border(Top|Right|Bottom|Left)?$/.test(property) && /^#/.test(result)){ - return result.replace(/^(.+)\s(.+)\s(.+)$/, '$2 $3 $1'); - } - // - return result; - }, - - setStyles: function(styles){ - for (var style in styles) this.setStyle(style, styles[style]); - return this; - }, - - getStyles: function(){ - var result = {}; - Array.flatten(arguments).each(function(key){ - result[key] = this.getStyle(key); - }, this); - return result; - } - -}); - -Element.Styles = { - left: '@px', top: '@px', bottom: '@px', right: '@px', - width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px', - backgroundColor: 'rgb(@, @, @)', backgroundSize: '@px', backgroundPosition: '@px @px', color: 'rgb(@, @, @)', - fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)', - margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)', - borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)', - zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@' -}; - - - - - -Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; - -['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ - var Short = Element.ShortStyles; - var All = Element.Styles; - ['margin', 'padding'].each(function(style){ - var sd = style + direction; - Short[style][sd] = All[sd] = '@px'; - }); - var bd = 'border' + direction; - Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; - var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; - Short[bd] = {}; - Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; - Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; - Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; -}); - -if (hasBackgroundPositionXY) Element.ShortStyles.backgroundPosition = {backgroundPositionX: '@', backgroundPositionY: '@'}; -})(); - - -/* ---- - -name: Element.Event - -description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary. - -license: MIT-style license. - -requires: [Element, Event] - -provides: Element.Event - -... -*/ - -(function(){ - -Element.Properties.events = {set: function(events){ - this.addEvents(events); -}}; - -[Element, Window, Document].invoke('implement', { - - addEvent: function(type, fn){ - var events = this.retrieve('events', {}); - if (!events[type]) events[type] = {keys: [], values: []}; - if (events[type].keys.contains(fn)) return this; - events[type].keys.push(fn); - var realType = type, - custom = Element.Events[type], - condition = fn, - self = this; - if (custom){ - if (custom.onAdd) custom.onAdd.call(this, fn, type); - if (custom.condition){ - condition = function(event){ - if (custom.condition.call(this, event, type)) return fn.call(this, event); - return true; - }; - } - if (custom.base) realType = Function.from(custom.base).call(this, type); - } - var defn = function(){ - return fn.call(self); - }; - var nativeEvent = Element.NativeEvents[realType]; - if (nativeEvent){ - if (nativeEvent == 2){ - defn = function(event){ - event = new DOMEvent(event, self.getWindow()); - if (condition.call(self, event) === false) event.stop(); - }; - } - this.addListener(realType, defn, arguments[2]); - } - events[type].values.push(defn); - return this; - }, - - removeEvent: function(type, fn){ - var events = this.retrieve('events'); - if (!events || !events[type]) return this; - var list = events[type]; - var index = list.keys.indexOf(fn); - if (index == -1) return this; - var value = list.values[index]; - delete list.keys[index]; - delete list.values[index]; - var custom = Element.Events[type]; - if (custom){ - if (custom.onRemove) custom.onRemove.call(this, fn, type); - if (custom.base) type = Function.from(custom.base).call(this, type); - } - return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this; - }, - - addEvents: function(events){ - for (var event in events) this.addEvent(event, events[event]); - return this; - }, - - removeEvents: function(events){ - var type; - if (typeOf(events) == 'object'){ - for (type in events) this.removeEvent(type, events[type]); - return this; - } - var attached = this.retrieve('events'); - if (!attached) return this; - if (!events){ - for (type in attached) this.removeEvents(type); - this.eliminate('events'); - } else if (attached[events]){ - attached[events].keys.each(function(fn){ - this.removeEvent(events, fn); - }, this); - delete attached[events]; - } - return this; - }, - - fireEvent: function(type, args, delay){ - var events = this.retrieve('events'); - if (!events || !events[type]) return this; - args = Array.from(args); - - events[type].keys.each(function(fn){ - if (delay) fn.delay(delay, this, args); - else fn.apply(this, args); - }, this); - return this; - }, - - cloneEvents: function(from, type){ - from = document.id(from); - var events = from.retrieve('events'); - if (!events) return this; - if (!type){ - for (var eventType in events) this.cloneEvents(from, eventType); - } else if (events[type]){ - events[type].keys.each(function(fn){ - this.addEvent(type, fn); - }, this); - } - return this; - } - -}); - -Element.NativeEvents = { - click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons - mousewheel: 2, DOMMouseScroll: 2, //mouse wheel - mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement - keydown: 2, keypress: 2, keyup: 2, //keyboard - orientationchange: 2, // mobile - touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch - gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture - focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements - load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window - hashchange: 1, popstate: 2, // history - error: 1, abort: 1, scroll: 1 //misc -}; - -Element.Events = { - mousewheel: { - base: 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll' - } -}; - -var check = function(event){ - var related = event.relatedTarget; - if (related == null) return true; - if (!related) return false; - return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related)); -}; - -if ('onmouseenter' in document.documentElement){ - Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2; - Element.MouseenterCheck = check; -} else { - Element.Events.mouseenter = { - base: 'mouseover', - condition: check - }; - - Element.Events.mouseleave = { - base: 'mouseout', - condition: check - }; -} - -/**/ -if (!window.addEventListener){ - Element.NativeEvents.propertychange = 2; - Element.Events.change = { - base: function(){ - var type = this.type; - return (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change'; - }, - condition: function(event){ - return event.type != 'propertychange' || event.event.propertyName == 'checked'; - } - }; -} -/**/ - - - -})(); - - -/* ---- - -name: Element.Delegation - -description: Extends the Element native object to include the delegate method for more efficient event management. - -license: MIT-style license. - -requires: [Element.Event] - -provides: [Element.Delegation] - -... -*/ - -(function(){ - -var eventListenerSupport = !!window.addEventListener; - -Element.NativeEvents.focusin = Element.NativeEvents.focusout = 2; - -var bubbleUp = function(self, match, fn, event, target){ - while (target && target != self){ - if (match(target, event)) return fn.call(target, event, target); - target = document.id(target.parentNode); - } -}; - -var map = { - mouseenter: { - base: 'mouseover', - condition: Element.MouseenterCheck - }, - mouseleave: { - base: 'mouseout', - condition: Element.MouseenterCheck - }, - focus: { - base: 'focus' + (eventListenerSupport ? '' : 'in'), - capture: true - }, - blur: { - base: eventListenerSupport ? 'blur' : 'focusout', - capture: true - } -}; - -/**/ -var _key = '$delegation:'; -var formObserver = function(type){ - - return { - - base: 'focusin', - - remove: function(self, uid){ - var list = self.retrieve(_key + type + 'listeners', {})[uid]; - if (list && list.forms) for (var i = list.forms.length; i--;){ - list.forms[i].removeEvent(type, list.fns[i]); - } - }, - - listen: function(self, match, fn, event, target, uid){ - var form = (target.get('tag') == 'form') ? target : event.target.getParent('form'); - if (!form) return; - - var listeners = self.retrieve(_key + type + 'listeners', {}), - listener = listeners[uid] || {forms: [], fns: []}, - forms = listener.forms, fns = listener.fns; - - if (forms.indexOf(form) != -1) return; - forms.push(form); - - var _fn = function(event){ - bubbleUp(self, match, fn, event, target); - }; - form.addEvent(type, _fn); - fns.push(_fn); - - listeners[uid] = listener; - self.store(_key + type + 'listeners', listeners); - } - }; -}; - -var inputObserver = function(type){ - return { - base: 'focusin', - listen: function(self, match, fn, event, target){ - var events = {blur: function(){ - this.removeEvents(events); - }}; - events[type] = function(event){ - bubbleUp(self, match, fn, event, target); - }; - event.target.addEvents(events); - } - }; -}; - -if (!eventListenerSupport) Object.append(map, { - submit: formObserver('submit'), - reset: formObserver('reset'), - change: inputObserver('change'), - select: inputObserver('select') -}); -/**/ - -var proto = Element.prototype, - addEvent = proto.addEvent, - removeEvent = proto.removeEvent; - -var relay = function(old, method){ - return function(type, fn, useCapture){ - if (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture); - var parsed = Slick.parse(type).expressions[0][0]; - if (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture); - var newType = parsed.tag; - parsed.pseudos.slice(1).each(function(pseudo){ - newType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : ''); - }); - old.call(this, type, fn); - return method.call(this, newType, parsed.pseudos[0].value, fn); - }; -}; - -var delegation = { - - addEvent: function(type, match, fn){ - var storage = this.retrieve('$delegates', {}), stored = storage[type]; - if (stored) for (var _uid in stored){ - if (stored[_uid].fn == fn && stored[_uid].match == match) return this; - } - - var _type = type, _match = match, _fn = fn, _map = map[type] || {}; - type = _map.base || _type; - - match = function(target){ - return Slick.match(target, _match); - }; - - var elementEvent = Element.Events[_type]; - if (_map.condition || elementEvent && elementEvent.condition){ - var __match = match, condition = _map.condition || elementEvent.condition; - match = function(target, event){ - return __match(target, event) && condition.call(target, event, type); - }; - } - - var self = this, uid = String.uniqueID(); - var delegator = _map.listen ? function(event, target){ - if (!target && event && event.target) target = event.target; - if (target) _map.listen(self, match, fn, event, target, uid); - } : function(event, target){ - if (!target && event && event.target) target = event.target; - if (target) bubbleUp(self, match, fn, event, target); - }; - - if (!stored) stored = {}; - stored[uid] = { - match: _match, - fn: _fn, - delegator: delegator - }; - storage[_type] = stored; - return addEvent.call(this, type, delegator, _map.capture); - }, - - removeEvent: function(type, match, fn, _uid){ - var storage = this.retrieve('$delegates', {}), stored = storage[type]; - if (!stored) return this; - - if (_uid){ - var _type = type, delegator = stored[_uid].delegator, _map = map[type] || {}; - type = _map.base || _type; - if (_map.remove) _map.remove(this, _uid); - delete stored[_uid]; - storage[_type] = stored; - return removeEvent.call(this, type, delegator, _map.capture); - } - - var __uid, s; - if (fn) for (__uid in stored){ - s = stored[__uid]; - if (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid); - } else for (__uid in stored){ - s = stored[__uid]; - if (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid); - } - return this; - } - -}; - -[Element, Window, Document].invoke('implement', { - addEvent: relay(addEvent, delegation.addEvent), - removeEvent: relay(removeEvent, delegation.removeEvent) -}); - -})(); - - -/* ---- - -name: Element.Dimensions - -description: Contains methods to work with size, scroll, or positioning of Elements and the window object. - -license: MIT-style license. - -credits: - - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). - - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). - -requires: [Element, Element.Style] - -provides: [Element.Dimensions] - -... -*/ - -(function(){ - -var element = document.createElement('div'), - child = document.createElement('div'); -element.style.height = '0'; -element.appendChild(child); -var brokenOffsetParent = (child.offsetParent === element); -element = child = null; - -var isOffset = function(el){ - return styleString(el, 'position') != 'static' || isBody(el); -}; - -var isOffsetStatic = function(el){ - return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName); -}; - -Element.implement({ - - scrollTo: function(x, y){ - if (isBody(this)){ - this.getWindow().scrollTo(x, y); - } else { - this.scrollLeft = x; - this.scrollTop = y; - } - return this; - }, - - getSize: function(){ - if (isBody(this)) return this.getWindow().getSize(); - return {x: this.offsetWidth, y: this.offsetHeight}; - }, - - getScrollSize: function(){ - if (isBody(this)) return this.getWindow().getScrollSize(); - return {x: this.scrollWidth, y: this.scrollHeight}; - }, - - getScroll: function(){ - if (isBody(this)) return this.getWindow().getScroll(); - return {x: this.scrollLeft, y: this.scrollTop}; - }, - - getScrolls: function(){ - var element = this.parentNode, position = {x: 0, y: 0}; - while (element && !isBody(element)){ - position.x += element.scrollLeft; - position.y += element.scrollTop; - element = element.parentNode; - } - return position; - }, - - getOffsetParent: brokenOffsetParent ? function(){ - var element = this; - if (isBody(element) || styleString(element, 'position') == 'fixed') return null; - - var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset; - while ((element = element.parentNode)){ - if (isOffsetCheck(element)) return element; - } - return null; - } : function(){ - var element = this; - if (isBody(element) || styleString(element, 'position') == 'fixed') return null; - - try { - return element.offsetParent; - } catch(e) {} - return null; - }, - - getOffsets: function(){ - var hasGetBoundingClientRect = this.getBoundingClientRect; - - if (hasGetBoundingClientRect){ - var bound = this.getBoundingClientRect(), - html = document.id(this.getDocument().documentElement), - htmlScroll = html.getScroll(), - elemScrolls = this.getScrolls(), - isFixed = (styleString(this, 'position') == 'fixed'); - - return { - x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, - y: bound.top.toInt() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop - }; - } - - var element = this, position = {x: 0, y: 0}; - if (isBody(this)) return position; - - while (element && !isBody(element)){ - position.x += element.offsetLeft; - position.y += element.offsetTop; - - element = element.offsetParent; - } - - return position; - }, - - getPosition: function(relative){ - var offset = this.getOffsets(), - scroll = this.getScrolls(); - var position = { - x: offset.x - scroll.x, - y: offset.y - scroll.y - }; - - if (relative && (relative = document.id(relative))){ - var relativePosition = relative.getPosition(); - return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)}; - } - return position; - }, - - getCoordinates: function(element){ - if (isBody(this)) return this.getWindow().getCoordinates(); - var position = this.getPosition(element), - size = this.getSize(); - var obj = { - left: position.x, - top: position.y, - width: size.x, - height: size.y - }; - obj.right = obj.left + obj.width; - obj.bottom = obj.top + obj.height; - return obj; - }, - - computePosition: function(obj){ - return { - left: obj.x - styleNumber(this, 'margin-left'), - top: obj.y - styleNumber(this, 'margin-top') - }; - }, - - setPosition: function(obj){ - return this.setStyles(this.computePosition(obj)); - } - -}); - - -[Document, Window].invoke('implement', { - - getSize: function(){ - var doc = getCompatElement(this); - return {x: doc.clientWidth, y: doc.clientHeight}; - }, - - getScroll: function(){ - var win = this.getWindow(), doc = getCompatElement(this); - return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; - }, - - getScrollSize: function(){ - var doc = getCompatElement(this), - min = this.getSize(), - body = this.getDocument().body; - - return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)}; - }, - - getPosition: function(){ - return {x: 0, y: 0}; - }, - - getCoordinates: function(){ - var size = this.getSize(); - return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; - } - -}); - -// private methods - -var styleString = Element.getComputedStyle; - -function styleNumber(element, style){ - return styleString(element, style).toInt() || 0; -} - -function borderBox(element){ - return styleString(element, '-moz-box-sizing') == 'border-box'; -} - -function topBorder(element){ - return styleNumber(element, 'border-top-width'); -} - -function leftBorder(element){ - return styleNumber(element, 'border-left-width'); -} - -function isBody(element){ - return (/^(?:body|html)$/i).test(element.tagName); -} - -function getCompatElement(element){ - var doc = element.getDocument(); - return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; -} - -})(); - -//aliases -Element.alias({position: 'setPosition'}); //compatability - -[Window, Document, Element].invoke('implement', { - - getHeight: function(){ - return this.getSize().y; - }, - - getWidth: function(){ - return this.getSize().x; - }, - - getScrollTop: function(){ - return this.getScroll().y; - }, - - getScrollLeft: function(){ - return this.getScroll().x; - }, - - getScrollHeight: function(){ - return this.getScrollSize().y; - }, - - getScrollWidth: function(){ - return this.getScrollSize().x; - }, - - getTop: function(){ - return this.getPosition().y; - }, - - getLeft: function(){ - return this.getPosition().x; - } - -}); - - -/* ---- - -name: Fx - -description: Contains the basic animation logic to be extended by all other Fx Classes. - -license: MIT-style license. - -requires: [Chain, Events, Options] - -provides: Fx - -... -*/ - -(function(){ - -var Fx = this.Fx = new Class({ - - Implements: [Chain, Events, Options], - - options: { - /* - onStart: nil, - onCancel: nil, - onComplete: nil, - */ - fps: 60, - unit: false, - duration: 500, - frames: null, - frameSkip: true, - link: 'ignore' - }, - - initialize: function(options){ - this.subject = this.subject || this; - this.setOptions(options); - }, - - getTransition: function(){ - return function(p){ - return -(Math.cos(Math.PI * p) - 1) / 2; - }; - }, - - step: function(now){ - if (this.options.frameSkip){ - var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval; - this.time = now; - this.frame += frames; - } else { - this.frame++; - } - - if (this.frame < this.frames){ - var delta = this.transition(this.frame / this.frames); - this.set(this.compute(this.from, this.to, delta)); - } else { - this.frame = this.frames; - this.set(this.compute(this.from, this.to, 1)); - this.stop(); - } - }, - - set: function(now){ - return now; - }, - - compute: function(from, to, delta){ - return Fx.compute(from, to, delta); - }, - - check: function(){ - if (!this.isRunning()) return true; - switch (this.options.link){ - case 'cancel': this.cancel(); return true; - case 'chain': this.chain(this.caller.pass(arguments, this)); return false; - } - return false; - }, - - start: function(from, to){ - if (!this.check(from, to)) return this; - this.from = from; - this.to = to; - this.frame = (this.options.frameSkip) ? 0 : -1; - this.time = null; - this.transition = this.getTransition(); - var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration; - this.duration = Fx.Durations[duration] || duration.toInt(); - this.frameInterval = 1000 / fps; - this.frames = frames || Math.round(this.duration / this.frameInterval); - this.fireEvent('start', this.subject); - pushInstance.call(this, fps); - return this; - }, - - stop: function(){ - if (this.isRunning()){ - this.time = null; - pullInstance.call(this, this.options.fps); - if (this.frames == this.frame){ - this.fireEvent('complete', this.subject); - if (!this.callChain()) this.fireEvent('chainComplete', this.subject); - } else { - this.fireEvent('stop', this.subject); - } - } - return this; - }, - - cancel: function(){ - if (this.isRunning()){ - this.time = null; - pullInstance.call(this, this.options.fps); - this.frame = this.frames; - this.fireEvent('cancel', this.subject).clearChain(); - } - return this; - }, - - pause: function(){ - if (this.isRunning()){ - this.time = null; - pullInstance.call(this, this.options.fps); - } - return this; - }, - - resume: function(){ - if (this.isPaused()) pushInstance.call(this, this.options.fps); - return this; - }, - - isRunning: function(){ - var list = instances[this.options.fps]; - return list && list.contains(this); - }, - - isPaused: function(){ - return (this.frame < this.frames) && !this.isRunning(); - } - -}); - -Fx.compute = function(from, to, delta){ - return (to - from) * delta + from; -}; - -Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; - -// global timers - -var instances = {}, timers = {}; - -var loop = function(){ - var now = Date.now(); - for (var i = this.length; i--;){ - var instance = this[i]; - if (instance) instance.step(now); - } -}; - -var pushInstance = function(fps){ - var list = instances[fps] || (instances[fps] = []); - list.push(this); - if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list); -}; - -var pullInstance = function(fps){ - var list = instances[fps]; - if (list){ - list.erase(this); - if (!list.length && timers[fps]){ - delete instances[fps]; - timers[fps] = clearInterval(timers[fps]); - } - } -}; - -})(); - - -/* ---- - -name: Fx.CSS - -description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. - -license: MIT-style license. - -requires: [Fx, Element.Style] - -provides: Fx.CSS - -... -*/ - -Fx.CSS = new Class({ - - Extends: Fx, - - //prepares the base from/to object - - prepare: function(element, property, values){ - values = Array.from(values); - var from = values[0], to = values[1]; - if (to == null){ - to = from; - from = element.getStyle(property); - var unit = this.options.unit; - // adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299 - if (unit && from && typeof from == 'string' && from.slice(-unit.length) != unit && parseFloat(from) != 0){ - element.setStyle(property, to + unit); - var value = element.getComputedStyle(property); - // IE and Opera support pixelLeft or pixelWidth - if (!(/px$/.test(value))){ - value = element.style[('pixel-' + property).camelCase()]; - if (value == null){ - // adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - var left = element.style.left; - element.style.left = to + unit; - value = element.style.pixelLeft; - element.style.left = left; - } - } - from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0); - element.setStyle(property, from + unit); - } - } - return {from: this.parse(from), to: this.parse(to)}; - }, - - //parses a value into an array - - parse: function(value){ - value = Function.from(value)(); - value = (typeof value == 'string') ? value.split(' ') : Array.from(value); - return value.map(function(val){ - val = String(val); - var found = false; - Object.each(Fx.CSS.Parsers, function(parser, key){ - if (found) return; - var parsed = parser.parse(val); - if (parsed || parsed === 0) found = {value: parsed, parser: parser}; - }); - found = found || {value: val, parser: Fx.CSS.Parsers.String}; - return found; - }); - }, - - //computes by a from and to prepared objects, using their parsers. - - compute: function(from, to, delta){ - var computed = []; - (Math.min(from.length, to.length)).times(function(i){ - computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); - }); - computed.$family = Function.from('fx:css:value'); - return computed; - }, - - //serves the value as settable - - serve: function(value, unit){ - if (typeOf(value) != 'fx:css:value') value = this.parse(value); - var returned = []; - value.each(function(bit){ - returned = returned.concat(bit.parser.serve(bit.value, unit)); - }); - return returned; - }, - - //renders the change to an element - - render: function(element, property, value, unit){ - element.setStyle(property, this.serve(value, unit)); - }, - - //searches inside the page css to find the values for a selector - - search: function(selector){ - if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; - var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$'); - - var searchStyles = function(rules){ - Array.each(rules, function(rule, i){ - if (rule.media){ - searchStyles(rule.rules || rule.cssRules); - return; - } - if (!rule.style) return; - var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ - return m.toLowerCase(); - }) : null; - if (!selectorText || !selectorTest.test(selectorText)) return; - Object.each(Element.Styles, function(value, style){ - if (!rule.style[style] || Element.ShortStyles[style]) return; - value = String(rule.style[style]); - to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value; - }); - }); - }; - - Array.each(document.styleSheets, function(sheet, j){ - var href = sheet.href; - if (href && href.indexOf('://') > -1 && href.indexOf(document.domain) == -1) return; - var rules = sheet.rules || sheet.cssRules; - searchStyles(rules); - }); - return Fx.CSS.Cache[selector] = to; - } - -}); - -Fx.CSS.Cache = {}; - -Fx.CSS.Parsers = { - - Color: { - parse: function(value){ - if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); - return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; - }, - compute: function(from, to, delta){ - return from.map(function(value, i){ - return Math.round(Fx.compute(from[i], to[i], delta)); - }); - }, - serve: function(value){ - return value.map(Number); - } - }, - - Number: { - parse: parseFloat, - compute: Fx.compute, - serve: function(value, unit){ - return (unit) ? value + unit : value; - } - }, - - String: { - parse: Function.from(false), - compute: function(zero, one){ - return one; - }, - serve: function(zero){ - return zero; - } - } - -}; - - - - -/* ---- - -name: Fx.Tween - -description: Formerly Fx.Style, effect to transition any CSS property for an element. - -license: MIT-style license. - -requires: Fx.CSS - -provides: [Fx.Tween, Element.fade, Element.highlight] - -... -*/ - -Fx.Tween = new Class({ - - Extends: Fx.CSS, - - initialize: function(element, options){ - this.element = this.subject = document.id(element); - this.parent(options); - }, - - set: function(property, now){ - if (arguments.length == 1){ - now = property; - property = this.property || this.options.property; - } - this.render(this.element, property, now, this.options.unit); - return this; - }, - - start: function(property, from, to){ - if (!this.check(property, from, to)) return this; - var args = Array.flatten(arguments); - this.property = this.options.property || args.shift(); - var parsed = this.prepare(this.element, this.property, args); - return this.parent(parsed.from, parsed.to); - } - -}); - -Element.Properties.tween = { - - set: function(options){ - this.get('tween').cancel().setOptions(options); - return this; - }, - - get: function(){ - var tween = this.retrieve('tween'); - if (!tween){ - tween = new Fx.Tween(this, {link: 'cancel'}); - this.store('tween', tween); - } - return tween; - } - -}; - -Element.implement({ - - tween: function(property, from, to){ - this.get('tween').start(property, from, to); - return this; - }, - - fade: function(how){ - var fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle; - if (args[1] == null) args[1] = 'toggle'; - switch (args[1]){ - case 'in': method = 'start'; args[1] = 1; break; - case 'out': method = 'start'; args[1] = 0; break; - case 'show': method = 'set'; args[1] = 1; break; - case 'hide': method = 'set'; args[1] = 0; break; - case 'toggle': - var flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1); - method = 'start'; - args[1] = flag ? 0 : 1; - this.store('fade:flag', !flag); - toggle = true; - break; - default: method = 'start'; - } - if (!toggle) this.eliminate('fade:flag'); - fade[method].apply(fade, args); - var to = args[args.length - 1]; - if (method == 'set' || to != 0) this.setStyle('visibility', to == 0 ? 'hidden' : 'visible'); - else fade.chain(function(){ - this.element.setStyle('visibility', 'hidden'); - this.callChain(); - }); - return this; - }, - - highlight: function(start, end){ - if (!end){ - end = this.retrieve('highlight:original', this.getStyle('background-color')); - end = (end == 'transparent') ? '#fff' : end; - } - var tween = this.get('tween'); - tween.start('background-color', start || '#ffff88', end).chain(function(){ - this.setStyle('background-color', this.retrieve('highlight:original')); - tween.callChain(); - }.bind(this)); - return this; - } - -}); - - -/* ---- - -name: Fx.Morph - -description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules. - -license: MIT-style license. - -requires: Fx.CSS - -provides: Fx.Morph - -... -*/ - -Fx.Morph = new Class({ - - Extends: Fx.CSS, - - initialize: function(element, options){ - this.element = this.subject = document.id(element); - this.parent(options); - }, - - set: function(now){ - if (typeof now == 'string') now = this.search(now); - for (var p in now) this.render(this.element, p, now[p], this.options.unit); - return this; - }, - - compute: function(from, to, delta){ - var now = {}; - for (var p in from) now[p] = this.parent(from[p], to[p], delta); - return now; - }, - - start: function(properties){ - if (!this.check(properties)) return this; - if (typeof properties == 'string') properties = this.search(properties); - var from = {}, to = {}; - for (var p in properties){ - var parsed = this.prepare(this.element, p, properties[p]); - from[p] = parsed.from; - to[p] = parsed.to; - } - return this.parent(from, to); - } - -}); - -Element.Properties.morph = { - - set: function(options){ - this.get('morph').cancel().setOptions(options); - return this; - }, - - get: function(){ - var morph = this.retrieve('morph'); - if (!morph){ - morph = new Fx.Morph(this, {link: 'cancel'}); - this.store('morph', morph); - } - return morph; - } - -}; - -Element.implement({ - - morph: function(props){ - this.get('morph').start(props); - return this; - } - -}); - - -/* ---- - -name: Fx.Transitions - -description: Contains a set of advanced transitions to be used with any of the Fx Classes. - -license: MIT-style license. - -credits: - - Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. - -requires: Fx - -provides: Fx.Transitions - -... -*/ - -Fx.implement({ - - getTransition: function(){ - var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; - if (typeof trans == 'string'){ - var data = trans.split(':'); - trans = Fx.Transitions; - trans = trans[data[0]] || trans[data[0].capitalize()]; - if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; - } - return trans; - } - -}); - -Fx.Transition = function(transition, params){ - params = Array.from(params); - var easeIn = function(pos){ - return transition(pos, params); - }; - return Object.append(easeIn, { - easeIn: easeIn, - easeOut: function(pos){ - return 1 - transition(1 - pos, params); - }, - easeInOut: function(pos){ - return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2; - } - }); -}; - -Fx.Transitions = { - - linear: function(zero){ - return zero; - } - -}; - - - -Fx.Transitions.extend = function(transitions){ - for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); -}; - -Fx.Transitions.extend({ - - Pow: function(p, x){ - return Math.pow(p, x && x[0] || 6); - }, - - Expo: function(p){ - return Math.pow(2, 8 * (p - 1)); - }, - - Circ: function(p){ - return 1 - Math.sin(Math.acos(p)); - }, - - Sine: function(p){ - return 1 - Math.cos(p * Math.PI / 2); - }, - - Back: function(p, x){ - x = x && x[0] || 1.618; - return Math.pow(p, 2) * ((x + 1) * p - x); - }, - - Bounce: function(p){ - var value; - for (var a = 0, b = 1; 1; a += b, b /= 2){ - if (p >= (7 - 4 * a) / 11){ - value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); - break; - } - } - return value; - }, - - Elastic: function(p, x){ - return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3); - } - -}); - -['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ - Fx.Transitions[transition] = new Fx.Transition(function(p){ - return Math.pow(p, i + 2); - }); -}); - - -/* ---- - -name: Request - -description: Powerful all purpose Request Class. Uses XMLHTTPRequest. - -license: MIT-style license. - -requires: [Object, Element, Chain, Events, Options, Browser] - -provides: Request - -... -*/ - -(function(){ - -var empty = function(){}, - progressSupport = ('onprogress' in new Browser.Request); - -var Request = this.Request = new Class({ - - Implements: [Chain, Events, Options], - - options: {/* - onRequest: function(){}, - onLoadstart: function(event, xhr){}, - onProgress: function(event, xhr){}, - onComplete: function(){}, - onCancel: function(){}, - onSuccess: function(responseText, responseXML){}, - onFailure: function(xhr){}, - onException: function(headerName, value){}, - onTimeout: function(){}, - user: '', - password: '',*/ - url: '', - data: '', - headers: { - 'X-Requested-With': 'XMLHttpRequest', - 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' - }, - async: true, - format: false, - method: 'post', - link: 'ignore', - isSuccess: null, - emulation: true, - urlEncoded: true, - encoding: 'utf-8', - evalScripts: false, - evalResponse: false, - timeout: 0, - noCache: false - }, - - initialize: function(options){ - this.xhr = new Browser.Request(); - this.setOptions(options); - this.headers = this.options.headers; - }, - - onStateChange: function(){ - var xhr = this.xhr; - if (xhr.readyState != 4 || !this.running) return; - this.running = false; - this.status = 0; - Function.attempt(function(){ - var status = xhr.status; - this.status = (status == 1223) ? 204 : status; - }.bind(this)); - xhr.onreadystatechange = empty; - if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; - clearTimeout(this.timer); - - this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML}; - if (this.options.isSuccess.call(this, this.status)) - this.success(this.response.text, this.response.xml); - else - this.failure(); - }, - - isSuccess: function(){ - var status = this.status; - return (status >= 200 && status < 300); - }, - - isRunning: function(){ - return !!this.running; - }, - - processScripts: function(text){ - if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text); - return text.stripScripts(this.options.evalScripts); - }, - - success: function(text, xml){ - this.onSuccess(this.processScripts(text), xml); - }, - - onSuccess: function(){ - this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); - }, - - failure: function(){ - this.onFailure(); - }, - - onFailure: function(){ - this.fireEvent('complete').fireEvent('failure', this.xhr); - }, - - loadstart: function(event){ - this.fireEvent('loadstart', [event, this.xhr]); - }, - - progress: function(event){ - this.fireEvent('progress', [event, this.xhr]); - }, - - timeout: function(){ - this.fireEvent('timeout', this.xhr); - }, - - setHeader: function(name, value){ - this.headers[name] = value; - return this; - }, - - getHeader: function(name){ - return Function.attempt(function(){ - return this.xhr.getResponseHeader(name); - }.bind(this)); - }, - - check: function(){ - if (!this.running) return true; - switch (this.options.link){ - case 'cancel': this.cancel(); return true; - case 'chain': this.chain(this.caller.pass(arguments, this)); return false; - } - return false; - }, - - send: function(options){ - if (!this.check(options)) return this; - - this.options.isSuccess = this.options.isSuccess || this.isSuccess; - this.running = true; - - var type = typeOf(options); - if (type == 'string' || type == 'element') options = {data: options}; - - var old = this.options; - options = Object.append({data: old.data, url: old.url, method: old.method}, options); - var data = options.data, url = String(options.url), method = options.method.toLowerCase(); - - switch (typeOf(data)){ - case 'element': data = document.id(data).toQueryString(); break; - case 'object': case 'hash': data = Object.toQueryString(data); - } - - if (this.options.format){ - var format = 'format=' + this.options.format; - data = (data) ? format + '&' + data : format; - } - - if (this.options.emulation && !['get', 'post'].contains(method)){ - var _method = '_method=' + method; - data = (data) ? _method + '&' + data : _method; - method = 'post'; - } - - if (this.options.urlEncoded && ['post', 'put'].contains(method)){ - var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; - this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding; - } - - if (!url) url = document.location.pathname; - - var trimPosition = url.lastIndexOf('/'); - if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition); - - if (this.options.noCache) - url += (url.indexOf('?') > -1 ? '&' : '?') + String.uniqueID(); - - if (data && (method == 'get' || method == 'delete')){ - url += (url.indexOf('?') > -1 ? '&' : '?') + data; - data = null; - } - - var xhr = this.xhr; - if (progressSupport){ - xhr.onloadstart = this.loadstart.bind(this); - xhr.onprogress = this.progress.bind(this); - } - - xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password); - if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true; - - xhr.onreadystatechange = this.onStateChange.bind(this); - - Object.each(this.headers, function(value, key){ - try { - xhr.setRequestHeader(key, value); - } catch (e){ - this.fireEvent('exception', [key, value]); - } - }, this); - - this.fireEvent('request'); - xhr.send(data); - if (!this.options.async) this.onStateChange(); - else if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this); - return this; - }, - - cancel: function(){ - if (!this.running) return this; - this.running = false; - var xhr = this.xhr; - xhr.abort(); - clearTimeout(this.timer); - xhr.onreadystatechange = empty; - if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; - this.xhr = new Browser.Request(); - this.fireEvent('cancel'); - return this; - } - -}); - -var methods = {}; -['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ - methods[method] = function(data){ - var object = { - method: method - }; - if (data != null) object.data = data; - return this.send(object); - }; -}); - -Request.implement(methods); - -Element.Properties.send = { - - set: function(options){ - var send = this.get('send').cancel(); - send.setOptions(options); - return this; - }, - - get: function(){ - var send = this.retrieve('send'); - if (!send){ - send = new Request({ - data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') - }); - this.store('send', send); - } - return send; - } - -}; - -Element.implement({ - - send: function(url){ - var sender = this.get('send'); - sender.send({data: this, url: url || sender.options.url}); - return this; - } - -}); - -})(); - - -/* ---- - -name: Request.HTML - -description: Extends the basic Request Class with additional methods for interacting with HTML responses. - -license: MIT-style license. - -requires: [Element, Request] - -provides: Request.HTML - -... -*/ - -Request.HTML = new Class({ - - Extends: Request, - - options: { - update: false, - append: false, - evalScripts: true, - filter: false, - headers: { - Accept: 'text/html, application/xml, text/xml, */*' - } - }, - - success: function(text){ - var options = this.options, response = this.response; - - response.html = text.stripScripts(function(script){ - response.javascript = script; - }); - - var match = response.html.match(/]*>([\s\S]*?)<\/body>/i); - if (match) response.html = match[1]; - var temp = new Element('div').set('html', response.html); - - response.tree = temp.childNodes; - response.elements = temp.getElements(options.filter || '*'); - - if (options.filter) response.tree = response.elements; - if (options.update){ - var update = document.id(options.update).empty(); - if (options.filter) update.adopt(response.elements); - else update.set('html', response.html); - } else if (options.append){ - var append = document.id(options.append); - if (options.filter) response.elements.reverse().inject(append); - else append.adopt(temp.getChildren()); - } - if (options.evalScripts) Browser.exec(response.javascript); - - this.onSuccess(response.tree, response.elements, response.html, response.javascript); - } - -}); - -Element.Properties.load = { - - set: function(options){ - var load = this.get('load').cancel(); - load.setOptions(options); - return this; - }, - - get: function(){ - var load = this.retrieve('load'); - if (!load){ - load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'}); - this.store('load', load); - } - return load; - } - -}; - -Element.implement({ - - load: function(){ - this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString})); - return this; - } - -}); - - -/* ---- - -name: JSON - -description: JSON encoder and decoder. - -license: MIT-style license. - -SeeAlso: - -requires: [Array, String, Number, Function] - -provides: JSON - -... -*/ - -if (typeof JSON == 'undefined') this.JSON = {}; - - - -(function(){ - -var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}; - -var escape = function(chr){ - return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4); -}; - -JSON.validate = function(string){ - string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). - replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). - replace(/(?:^|:|,)(?:\s*\[)+/g, ''); - - return (/^[\],:{}\s]*$/).test(string); -}; - -JSON.encode = JSON.stringify ? function(obj){ - return JSON.stringify(obj); -} : function(obj){ - if (obj && obj.toJSON) obj = obj.toJSON(); - - switch (typeOf(obj)){ - case 'string': - return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"'; - case 'array': - return '[' + obj.map(JSON.encode).clean() + ']'; - case 'object': case 'hash': - var string = []; - Object.each(obj, function(value, key){ - var json = JSON.encode(value); - if (json) string.push(JSON.encode(key) + ':' + json); - }); - return '{' + string + '}'; - case 'number': case 'boolean': return '' + obj; - case 'null': return 'null'; - } - - return null; -}; - -JSON.secure = true; - - -JSON.decode = function(string, secure){ - if (!string || typeOf(string) != 'string') return null; - - if (secure == null) secure = JSON.secure; - if (secure){ - if (JSON.parse) return JSON.parse(string); - if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.'); - } - - return eval('(' + string + ')'); -}; - -})(); - - -/* ---- - -name: Request.JSON - -description: Extends the basic Request Class with additional methods for sending and receiving JSON data. - -license: MIT-style license. - -requires: [Request, JSON] - -provides: Request.JSON - -... -*/ - -Request.JSON = new Class({ - - Extends: Request, - - options: { - /*onError: function(text, error){},*/ - secure: true - }, - - initialize: function(options){ - this.parent(options); - Object.append(this.headers, { - 'Accept': 'application/json', - 'X-Request': 'JSON' - }); - }, - - success: function(text){ - var json; - try { - json = this.response.json = JSON.decode(text, this.options.secure); - } catch (error){ - this.fireEvent('error', [text, error]); - return; - } - if (json == null) this.onFailure(); - else this.onSuccess(json, text); - } - -}); - - -/* ---- - -name: Cookie - -description: Class for creating, reading, and deleting browser Cookies. - -license: MIT-style license. - -credits: - - Based on the functions by Peter-Paul Koch (http://quirksmode.org). - -requires: [Options, Browser] - -provides: Cookie - -... -*/ - -var Cookie = new Class({ - - Implements: Options, - - options: { - path: '/', - domain: false, - duration: false, - secure: false, - document: document, - encode: true - }, - - initialize: function(key, options){ - this.key = key; - this.setOptions(options); - }, - - write: function(value){ - if (this.options.encode) value = encodeURIComponent(value); - if (this.options.domain) value += '; domain=' + this.options.domain; - if (this.options.path) value += '; path=' + this.options.path; - if (this.options.duration){ - var date = new Date(); - date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); - value += '; expires=' + date.toGMTString(); - } - if (this.options.secure) value += '; secure'; - this.options.document.cookie = this.key + '=' + value; - return this; - }, - - read: function(){ - var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); - return (value) ? decodeURIComponent(value[1]) : null; - }, - - dispose: function(){ - new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write(''); - return this; - } - -}); - -Cookie.write = function(key, value, options){ - return new Cookie(key, options).write(value); -}; - -Cookie.read = function(key){ - return new Cookie(key).read(); -}; - -Cookie.dispose = function(key, options){ - return new Cookie(key, options).dispose(); -}; - - -/* ---- - -name: DOMReady - -description: Contains the custom event domready. - -license: MIT-style license. - -requires: [Browser, Element, Element.Event] - -provides: [DOMReady, DomReady] - -... -*/ - -(function(window, document){ - -var ready, - loaded, - checks = [], - shouldPoll, - timer, - testElement = document.createElement('div'); - -var domready = function(){ - clearTimeout(timer); - if (ready) return; - Browser.loaded = ready = true; - document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check); - - document.fireEvent('domready'); - window.fireEvent('domready'); -}; - -var check = function(){ - for (var i = checks.length; i--;) if (checks[i]()){ - domready(); - return true; - } - return false; -}; - -var poll = function(){ - clearTimeout(timer); - if (!check()) timer = setTimeout(poll, 10); -}; - -document.addListener('DOMContentLoaded', domready); - -/**/ -// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/ -// testElement.doScroll() throws when the DOM is not ready, only in the top window -var doScrollWorks = function(){ - try { - testElement.doScroll(); - return true; - } catch (e){} - return false; -}; -// If doScroll works already, it can't be used to determine domready -// e.g. in an iframe -if (testElement.doScroll && !doScrollWorks()){ - checks.push(doScrollWorks); - shouldPoll = true; -} -/**/ - -if (document.readyState) checks.push(function(){ - var state = document.readyState; - return (state == 'loaded' || state == 'complete'); -}); - -if ('onreadystatechange' in document) document.addListener('readystatechange', check); -else shouldPoll = true; - -if (shouldPoll) poll(); - -Element.Events.domready = { - onAdd: function(fn){ - if (ready) fn.call(this); - } -}; - -// Make sure that domready fires before load -Element.Events.load = { - base: 'load', - onAdd: function(fn){ - if (loaded && this == window) fn.call(this); - }, - condition: function(){ - if (this == window){ - domready(); - delete Element.Events.load; - } - return true; - } -}; - -// This is based on the custom load event -window.addEvent('load', function(){ - loaded = true; -}); - -})(window, document); - diff --git a/module/webui/themes/default/js/static/mootools-core.min.js b/module/webui/themes/default/js/static/mootools-core.min.js deleted file mode 100644 index 354f94196..000000000 --- a/module/webui/themes/default/js/static/mootools-core.min.js +++ /dev/null @@ -1,491 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/core/8423c12ffd6a6bfcde9ea22554aec795 - -packager build: - - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady - -copyrights: - - [MooTools](http://mootools.net) - -licenses: - - [MIT License](http://mootools.net/license.txt) -... -*/ - -(function(){this.MooTools={version:"1.5.0",build:"0f7b690afee9349b15909f33016a25d2e4d9f4e3"};var o=this.typeOf=function(i){if(i==null){return"null";}if(i.$family!=null){return i.$family(); -}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if("callee" in i){return"arguments"; -}if("item" in i){return"collection";}}}return typeof i;};var j=this.instanceOf=function(t,i){if(t==null){return false;}var s=t.$constructor||t.constructor; -while(s){if(s===i){return true;}s=s.parent;}if(!t.hasOwnProperty){return false;}return t instanceof i;};var f=this.Function;var p=true;for(var k in {toString:1}){p=null; -}if(p){p=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];}f.prototype.overloadSetter=function(s){var i=this; -return function(u,t){if(u==null){return this;}if(s||typeof u!="string"){for(var v in u){i.call(this,v,u[v]);}if(p){for(var w=p.length;w--;){v=p[w];if(u.hasOwnProperty(v)){i.call(this,v,u[v]); -}}}}else{i.call(this,u,t);}return this;};};f.prototype.overloadGetter=function(s){var i=this;return function(u){var v,t;if(typeof u!="string"){v=u;}else{if(arguments.length>1){v=arguments; -}else{if(s){v=[u];}}}if(v){t={};for(var w=0;w>>0; -b>>0;b>>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a>>0,b=Array(d);for(var a=0;a>>0; -b-1;},test:function(a,b){return((typeOf(a)=="regexp")?a:new RegExp(""+a,b)).test(this); -},trim:function(){return String(this).replace(/^\s+|\s+$/g,"");},clean:function(){return String(this).replace(/\s+/g," ").trim();},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase(); -});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase(); -});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this); -},hexToRgb:function(b){var a=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g); -return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1); -}return(a[c]!=null)?a[c]:"";});}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0); -return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype; -g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this; -if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b); -},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={}; -for(var e=0,b=g.length;e]*>([\s\S]*?)<\/script>/gi,function(m,n){e+=n+"\n";return""; -});if(k===true){j.exec(e);}else{if(typeOf(k)=="function"){k(e,l);}}return l;});j.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event}); -this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,k){d[e]=k;});this.Document=f.$constructor=new Type("Document",function(){}); -f.$family=Function.from("document").hide();Document.mirror(function(e,k){f[e]=k;});f.html=f.documentElement;if(!f.head){f.head=f.getElementsByTagName("head")[0]; -}if(f.execCommand){try{f.execCommand("BackgroundImageCache",false,true);}catch(c){}}if(this.attachEvent&&!this.addEventListener){var b=function(){this.detachEvent("onunload",b); -f.head=f.html=f.window=null;};this.attachEvent("onunload",b);}var g=Array.from;try{g(f.html.childNodes);}catch(c){Array.from=function(k){if(typeof k!="string"&&Type.isEnumerable(k)&&typeOf(k)!="array"){var e=k.length,l=new Array(e); -while(e--){l[e]=k[e];}return l;}return g(k);};var h=Array.prototype,i=h.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var k=h[e]; -Array[e]=function(l){return k.apply(Array.from(l),i.call(arguments,1));};});}})();(function(){var b={};var a=this.DOMEvent=new Type("DOMEvent",function(c,g){if(!g){g=window; -}c=c||g.event;if(c.$extended){return c;}this.event=c;this.$extended=true;this.shift=c.shiftKey;this.control=c.ctrlKey;this.alt=c.altKey;this.meta=c.metaKey; -var i=this.type=c.type;var h=c.target||c.srcElement;while(h&&h.nodeType==3){h=h.parentNode;}this.target=document.id(h);if(i.indexOf("key")==0){var d=this.code=(c.which||c.keyCode); -this.key=b[d];if(i=="keydown"||i=="keyup"){if(d>111&&d<124){this.key="f"+(d-111);}else{if(d>95&&d<106){this.key=d-96;}}}if(this.key==null){this.key=String.fromCharCode(d).toLowerCase(); -}}else{if(i=="click"||i=="dblclick"||i=="contextmenu"||i=="DOMMouseScroll"||i.indexOf("mouse")==0){var j=g.document;j=(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body; -this.page={x:(c.pageX!=null)?c.pageX:c.clientX+j.scrollLeft,y:(c.pageY!=null)?c.pageY:c.clientY+j.scrollTop};this.client={x:(c.pageX!=null)?c.pageX-g.pageXOffset:c.clientX,y:(c.pageY!=null)?c.pageY-g.pageYOffset:c.clientY}; -if(i=="DOMMouseScroll"||i=="mousewheel"){this.wheel=(c.wheelDelta)?c.wheelDelta/120:-(c.detail||0)/3;}this.rightClick=(c.which==3||c.button==2);if(i=="mouseover"||i=="mouseout"){var k=c.relatedTarget||c[(i=="mouseover"?"from":"to")+"Element"]; -while(k&&k.nodeType==3){k=k.parentNode;}this.relatedTarget=document.id(k);}}else{if(i.indexOf("touch")==0||i.indexOf("gesture")==0){this.rotation=c.rotation; -this.scale=c.scale;this.targetTouches=c.targetTouches;this.changedTouches=c.changedTouches;var f=this.touches=c.touches;if(f&&f[0]){var e=f[0];this.page={x:e.pageX,y:e.pageY}; -this.client={x:e.clientX,y:e.clientY};}}}}if(!this.client){this.client={};}if(!this.page){this.page={};}});a.implement({stop:function(){return this.preventDefault().stopPropagation(); -},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); -}else{this.event.returnValue=false;}return this;}});a.defineKey=function(d,c){b[d]=c;return this;};a.defineKeys=a.defineKey.overloadSetter(true);a.defineKeys({"38":"up","40":"down","37":"left","39":"right","27":"esc","32":"space","8":"backspace","9":"tab","46":"delete","13":"enter"}); -})();(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h};}var g=function(){e(this);if(g.$prototyping){return this; -}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;return i;}.extend(this).implement(h); -g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.'); -}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments); -};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone(); -break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.'); -}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h}); -return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this; -}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping; -return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j; -for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments)); -return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty(); -return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d); -this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; -},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c); -}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this; -},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue; -}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments)); -if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})(); -(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p; -var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length; -return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o; -}}}};var h=function(u){var r=u.expressions;for(var p=0;p+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(//,"["+f(">+~`!@$%^&={}\\;/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(//g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")); -function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n]; -if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,""); -}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")}); -}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"}); -}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)"); -break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break; -case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I); -};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o); -};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var k={},m={},d=Object.prototype.toString; -k.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};k.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(d.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML"); -};k.setDocument=function(w){var p=w.nodeType;if(p==9){}else{if(p){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return; -}this.document=w;var A=w.documentElement,o=this.getUIDXML(A),s=m[o],r;if(s){for(r in s){this[r]=s[r];}return;}s=m[o]={};s.root=A;s.isXMLDocument=this.isXML(w); -s.brokenStarGEBTN=s.starSelectsClosedQSA=s.idGetsName=s.brokenMixedCaseQSA=s.brokenGEBCN=s.brokenCheckedQSA=s.brokenEmptyAttributeQSA=s.isHTMLDocument=s.nativeMatchesSelector=false; -var q,u,y,z,t;var x,v="slick_uniqueid";var c=w.createElement("div");var n=w.body||w.getElementsByTagName("body")[0]||A;n.appendChild(c);try{c.innerHTML=''; -s.isHTMLDocument=!!w.getElementById(v);}catch(C){}if(s.isHTMLDocument){c.style.display="none";c.appendChild(w.createComment(""));u=(c.getElementsByTagName("*").length>1); -try{c.innerHTML="foo";x=c.getElementsByTagName("*");q=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");}catch(C){}s.brokenStarGEBTN=u||q;try{c.innerHTML=''; -s.idGetsName=w.getElementById(v)===c.firstChild;}catch(C){}if(c.getElementsByClassName){try{c.innerHTML='';c.getElementsByClassName("b").length; -c.firstChild.className="b";z=(c.getElementsByClassName("b").length!=2);}catch(C){}try{c.innerHTML='';y=(c.getElementsByClassName("a").length!=2); -}catch(C){}s.brokenGEBCN=z||y;}if(c.querySelectorAll){try{c.innerHTML="foo";x=c.querySelectorAll("*");s.starSelectsClosedQSA=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/"); -}catch(C){}try{c.innerHTML='';s.brokenMixedCaseQSA=!c.querySelectorAll(".MiX").length;}catch(C){}try{c.innerHTML=''; -s.brokenCheckedQSA=(c.querySelectorAll(":checked").length==0);}catch(C){}try{c.innerHTML='';s.brokenEmptyAttributeQSA=(c.querySelectorAll('[class*=""]').length!=0); -}catch(C){}}try{c.innerHTML='
      ';t=(c.firstChild.getAttribute("action")!="s");}catch(C){}s.nativeMatchesSelector=A.matches||A.mozMatchesSelector||A.webkitMatchesSelector; -if(s.nativeMatchesSelector){try{s.nativeMatchesSelector.call(A,":slick");s.nativeMatchesSelector=null;}catch(C){}}}try{A.slick_expando=1;delete A.slick_expando; -s.getUID=this.getUIDHTML;}catch(C){s.getUID=this.getUIDXML;}n.removeChild(c);c=x=n=null;s.getAttribute=(s.isHTMLDocument&&t)?function(G,E){var H=this.attributeGetters[E]; -if(H){return H.call(G);}var F=G.getAttributeNode(E);return(F)?F.nodeValue:null;}:function(F,E){var G=this.attributeGetters[E];return(G)?G.call(F):F.getAttribute(E); -};s.hasAttribute=(A&&this.isNativeCode(A.hasAttribute))?function(F,E){return F.hasAttribute(E);}:function(F,E){F=F.getAttributeNode(E);return !!(F&&(F.specified||F.nodeValue)); -};var D=A&&this.isNativeCode(A.contains),B=w&&this.isNativeCode(w.contains);s.contains=(D&&B)?function(E,F){return E.contains(F);}:(D&&!B)?function(E,F){return E===F||((E===w)?w.documentElement:E).contains(F); -}:(A&&A.compareDocumentPosition)?function(E,F){return E===F||!!(E.compareDocumentPosition(F)&16);}:function(E,F){if(F){do{if(F===E){return true;}}while((F=F.parentNode)); -}return false;};s.documentSorter=(A.compareDocumentPosition)?function(F,E){if(!F.compareDocumentPosition||!E.compareDocumentPosition){return 0;}return F.compareDocumentPosition(E)&4?-1:F===E?0:1; -}:("sourceIndex" in A)?function(F,E){if(!F.sourceIndex||!E.sourceIndex){return 0;}return F.sourceIndex-E.sourceIndex;}:(w.createRange)?function(H,F){if(!H.ownerDocument||!F.ownerDocument){return 0; -}var G=H.ownerDocument.createRange(),E=F.ownerDocument.createRange();G.setStart(H,0);G.setEnd(H,0);E.setStart(F,0);E.setEnd(F,0);return G.compareBoundaryPoints(Range.START_TO_END,E); -}:null;A=null;for(r in s){this[r]=s[r];}};var f=/^([#.]?)((?:[\w-]+|\*))$/,h=/\[.+[*$^]=(?:""|'')?\]/,g={};k.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]); -if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U); -}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(f);simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors; -}E=U.getElementsByTagName(v);if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors; -}A=U.getElementById(v);if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A); -}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v); -if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+e.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*"); -for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p); -}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||g[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&h.test(z))||(!y&&z.indexOf(",")>-1)||e.disableQSA){break querySelector; -}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null; -}else{E=U.querySelectorAll(S);}}catch(Q){g[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0; -A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p); -}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z; -return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID; -if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator; -if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1)); -this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search; -}}else{if(s&&w){for(L=0,K=N.length;L1)){this.sort(p);}return(s)?(p[0]||null):p;};k.uidx=1;k.uidk="slick-uniqueid";k.getUIDXML=function(n){var c=n.getAttribute(this.uidk); -if(!c){c=this.uidx++;n.setAttribute(this.uidk,c);}return c;};k.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};k.sort=function(c){if(!this.documentSorter){return c; -}c.sort(this.documentSorter);return c;};k.cacheNTH={};k.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;k.parseNTHArgument=function(q){var o=q.match(this.matchNTH); -if(!o){return false;}var p=o[2]||false;var n=o[1]||1;if(n=="-"){n=-1;}var c=+o[3]||0;o=(p=="n")?{a:n,b:c}:(p=="odd")?{a:2,b:1}:(p=="even")?{a:2,b:0}:{a:0,b:n}; -return(this.cacheNTH[q]=o);};k.createNTHPseudo=function(p,n,c,o){return function(s,q){var u=this.getUID(s);if(!this[c][u]){var A=s.parentNode;if(!A){return false; -}var r=A[p],t=1;if(o){var z=s.nodeName;do{if(r.nodeName!=z){continue;}this[c][this.getUID(r)]=t++;}while((r=r[n]));}else{do{if(r.nodeType!=1){continue; -}this[c][this.getUID(r)]=t++;}while((r=r[n]));}}q=q||"n";var v=this.cacheNTH[q]||this.parseNTHArgument(q);if(!v){return false;}var y=v.a,x=v.b,w=this[c][u]; -if(y==0){return x==w;}if(y>0){if(w":function(p,c,r,o,n,q){if((p=p.firstChild)){do{if(p.nodeType==1){this.push(p,c,r,o,n,q); -}}while((p=p.nextSibling));}},"+":function(p,c,r,o,n,q){while((p=p.nextSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);break;}}},"^":function(p,c,r,o,n,q){p=p.firstChild; -if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:+"](p,c,r,o,n,q);}}},"~":function(q,c,s,p,n,r){while((q=q.nextSibling)){if(q.nodeType!=1){continue; -}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}},"++":function(p,c,r,o,n,q){this["combinator:+"](p,c,r,o,n,q); -this["combinator:!+"](p,c,r,o,n,q);},"~~":function(p,c,r,o,n,q){this["combinator:~"](p,c,r,o,n,q);this["combinator:!~"](p,c,r,o,n,q);},"!":function(p,c,r,o,n,q){while((p=p.parentNode)){if(p!==this.document){this.push(p,c,r,o,n,q); -}}},"!>":function(p,c,r,o,n,q){p=p.parentNode;if(p!==this.document){this.push(p,c,r,o,n,q);}},"!+":function(p,c,r,o,n,q){while((p=p.previousSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q); -break;}}},"!^":function(p,c,r,o,n,q){p=p.lastChild;if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:!+"](p,c,r,o,n,q);}}},"!~":function(q,c,s,p,n,r){while((q=q.previousSibling)){if(q.nodeType!=1){continue; -}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}}};for(var i in j){k["combinator:"+i]=j[i];}var l={empty:function(c){var n=c.firstChild; -return !(n&&n.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,n){return !this.matchNode(c,n);},contains:function(c,n){return(c.innerText||c.textContent||"").indexOf(n)>-1; -},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false; -}}return true;},"only-child":function(o){var n=o;while((n=n.previousSibling)){if(n.nodeType==1){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeType==1){return false; -}}return true;},"nth-child":k.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":k.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":k.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":k.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(n,c){return this["pseudo:nth-child"](n,""+(c+1)); -},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var n=c.nodeName; -while((c=c.previousSibling)){if(c.nodeName==n){return false;}}return true;},"last-of-type":function(c){var n=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==n){return false; -}}return true;},"only-of-type":function(o){var n=o,p=o.nodeName;while((n=n.previousSibling)){if(n.nodeName==p){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeName==p){return false; -}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex")); -},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var b in l){k["pseudo:"+b]=l[b];}var a=k.attributeGetters={"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for"); -},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style"); -},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;},type:function(){return this.getAttribute("type"); -},maxlength:function(){var c=this.getAttributeNode("maxLength");return(c&&c.specified)?c.nodeValue:null;}};a.MAXLENGTH=a.maxLength=a.maxlength;var e=k.Slick=(this.Slick||{}); -e.version="1.1.7";e.search=function(n,o,c){return k.search(n,o,c);};e.find=function(c,n){return k.search(c,n,null,true);};e.contains=function(c,n){k.setDocument(c); -return k.contains(c,n);};e.getAttribute=function(n,c){k.setDocument(n);return k.getAttribute(n,c);};e.hasAttribute=function(n,c){k.setDocument(n);return k.hasAttribute(n,c); -};e.match=function(n,c){if(!(n&&c)){return false;}if(!c||c===n){return true;}k.setDocument(n);return k.matchNode(n,c);};e.defineAttributeGetter=function(c,n){k.attributeGetters[c]=n; -return this;};e.lookupAttributeGetter=function(c){return k.attributeGetters[c];};e.definePseudo=function(c,n){k["pseudo:"+c]=function(p,o){return n.call(p,o); -};return this;};e.lookupPseudo=function(c){var n=k["pseudo:"+c];if(n){return function(o){return n.call(this,o);};}return null;};e.override=function(n,c){k.override(n,c); -return this;};e.isXML=k.isXML;e.uidOf=function(c){return k.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this); -var Element=this.Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={}; -}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0];b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var a,f=0,c=d.length; -f=this.length){delete this[g--]; -}return e;}.protect());}Array.forEachMethod(function(g,e){Elements.implement(e,g);});Array.mirror(Elements);var d;try{d=(document.createElement("").name=="x"); -}catch(b){}var c=function(e){return(""+e).replace(/&/g,"&").replace(/"/g,""");};Document.implement({newElement:function(e,g){if(g&&g.checked!=null){g.defaultChecked=g.checked; -}if(d&&g){e="<"+e;if(g.name){e+=' name="'+c(g.name)+'"';}if(g.type){e+=' type="'+c(g.type)+'"';}e+=">";delete g.name;delete g.type;}return this.id(this.createElement(e)).set(g); -}});})();(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(e){return this.createTextNode(e);},getDocument:function(){return this; -},getWindow:function(){return this.window;},id:(function(){var e={string:function(L,K,l){L=Slick.find(l,"#"+L.replace(/(\W)/g,"\\$1"));return(L)?e.element(L,K):null; -},element:function(K,L){Slick.uidOf(K);if(!L&&!K.$family&&!(/^(?:object|embed)$/i).test(K.tagName)){var l=K.fireEvent;K._fireEvent=function(M,N){return l(M,N); -};Object.append(K,Element.Prototype);}return K;},object:function(K,L,l){if(K.toElement){return e.element(K.toElement(l),L);}return null;}};e.textnode=e.whitespace=e.window=e.document=function(l){return l; -};return function(K,M,L){if(K&&K.$family&&K.uniqueNumber){return K;}var l=typeOf(K);return(e[l])?e[l](K,M,L||document):null;};})()});if(window.$==null){Window.implement("$",function(e,l){return document.id(e,l,this.document); -});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(e){return Slick.search(this,e,new Elements); -},getElement:function(e){return document.id(Slick.find(this,e));}});var p={contains:function(e){return Slick.contains(this,e);}};if(!document.contains){Document.implement(p); -}if(!document.createElement("div").contains){Element.implement(p);}var v=function(L,K){if(!L){return K;}L=Object.clone(Slick.parse(L));var l=L.expressions; -for(var e=l.length;e--;){l[e][0].combinator=K;}return L;};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(e,l){Element.implement(l,function(K){return this.getElement(v(K,e)); -});});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(e,l){Element.implement(l,function(K){return this.getElements(v(K,e)); -});});Element.implement({getFirst:function(e){return document.id(Slick.search(this,v(e,">"))[0]);},getLast:function(e){return document.id(Slick.search(this,v(e,">")).getLast()); -},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(e){return document.id(Slick.find(this,"#"+(""+e).replace(/(\W)/g,"\\$1"))); -},match:function(e){return !e||Slick.match(this,e);}});if(window.$$==null){Window.implement("$$",function(e){if(arguments.length==1){if(typeof e=="string"){return Slick.search(this.document,e,new Elements); -}else{if(Type.isEnumerable(e)){return new Elements(e);}}}return new Elements(arguments);});}var A={before:function(l,e){var K=e.parentNode;if(K){K.insertBefore(l,e); -}},after:function(l,e){var K=e.parentNode;if(K){K.insertBefore(l,e.nextSibling);}},bottom:function(l,e){e.appendChild(l);},top:function(l,e){e.insertBefore(l,e.firstChild); -}};A.inside=A.bottom;var n={},d={};var o={};Array.forEach(["type","value","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","rowSpan","tabIndex","useMap"],function(e){o[e.toLowerCase()]=e; -});o.html="innerHTML";o.text=(document.createElement("div").textContent==null)?"innerText":"textContent";Object.forEach(o,function(l,e){d[e]=function(K,L){K[l]=L; -};n[e]=function(K){return K[l];};});var B=["compact","nowrap","ismap","declare","noshade","checked","disabled","readOnly","multiple","selected","noresize","defer","defaultChecked","autofocus","controls","autoplay","loop"]; -var k={};Array.forEach(B,function(e){var l=e.toLowerCase();k[l]=e;d[l]=function(K,L){K[e]=!!L;};n[l]=function(K){return !!K[e];};});Object.append(d,{"class":function(e,l){("className" in e)?e.className=(l||""):e.setAttribute("class",l); -},"for":function(e,l){("htmlFor" in e)?e.htmlFor=l:e.setAttribute("for",l);},style:function(e,l){(e.style)?e.style.cssText=l:e.setAttribute("style",l); -},value:function(e,l){e.value=(l!=null)?l:"";}});n["class"]=function(e){return("className" in e)?e.className||null:e.getAttribute("class");};var f=document.createElement("button"); -try{f.type="button";}catch(E){}if(f.type!="button"){d.type=function(e,l){e.setAttribute("type",l);};}f=null;var s=document.createElement("input");s.value="t"; -s.type="submit";if(s.value!="t"){d.type=function(l,e){var K=l.value;l.type=e;l.value=K;};}s=null;var u=(function(e){e.random="attribute";return(e.getAttribute("random")=="attribute"); -})(document.createElement("div"));var i=(function(e){e.innerHTML='';return e.cloneNode(true).firstChild.childNodes.length!=1; -})(document.createElement("div"));var j=!!document.createElement("div").classList;var F=function(e){var l=(e||"").clean().split(" "),K={};return l.filter(function(L){if(L!==""&&!K[L]){return K[L]=L; -}});};var t=function(e){this.classList.add(e);};var g=function(e){this.classList.remove(e);};Element.implement({setProperty:function(l,K){var L=d[l.toLowerCase()]; -if(L){L(this,K);}else{var e;if(u){e=this.retrieve("$attributeWhiteList",{});}if(K==null){this.removeAttribute(l);if(u){delete e[l];}}else{this.setAttribute(l,""+K); -if(u){e[l]=true;}}}return this;},setProperties:function(e){for(var l in e){this.setProperty(l,e[l]);}return this;},getProperty:function(M){var K=n[M.toLowerCase()]; -if(K){return K(this);}if(u){var l=this.getAttributeNode(M),L=this.retrieve("$attributeWhiteList",{});if(!l){return null;}if(l.expando&&!L[M]){var N=this.outerHTML; -if(N.substr(0,N.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(M)<0){return null;}L[M]=true;}}var e=Slick.getAttribute(this,M);return(!e&&!Slick.hasAttribute(this,M))?null:e; -},getProperties:function(){var e=Array.from(arguments);return e.map(this.getProperty,this).associate(e);},removeProperty:function(e){return this.setProperty(e,null); -},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;},set:function(K,l){var e=Element.Properties[K];(e&&e.set)?e.set.call(this,l):this.setProperty(K,l); -}.overloadSetter(),get:function(l){var e=Element.Properties[l];return(e&&e.get)?e.get.apply(this):this.getProperty(l);}.overloadGetter(),erase:function(l){var e=Element.Properties[l]; -(e&&e.erase)?e.erase.apply(this):this.removeProperty(l);return this;},hasClass:j?function(e){return this.classList.contains(e);}:function(e){return this.className.clean().contains(e," "); -},addClass:j?function(e){F(e).forEach(t,this);return this;}:function(e){this.className=F(e+" "+this.className).join(" ");return this;},removeClass:j?function(e){F(e).forEach(g,this); -return this;}:function(e){var l=F(this.className);F(e).forEach(l.erase,l);this.className=l.join(" ");return this;},toggleClass:function(e,l){if(l==null){l=!this.hasClass(e); -}return(l)?this.addClass(e):this.removeClass(e);},adopt:function(){var L=this,e,N=Array.flatten(arguments),M=N.length;if(M>1){L=e=document.createDocumentFragment(); -}for(var K=0;K1){L=document.createDocumentFragment(); -for(var N=0,e=O.length;N";a=(x.childNodes.length==1);if(!a){var w="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),b=document.createDocumentFragment(),y=w.length; -while(y--){b.createElement(w[y]);}}x=null;h=Function.attempt(function(){var e=document.createElement("table");e.innerHTML="";return true; -});var c=document.createElement("tr"),r="";c.innerHTML=r;C=(c.innerHTML==r);c=null;if(!h||!C||!a){Element.Properties.html.set=(function(l){var e={table:[1,"","
      "],select:[1,""],tbody:[2,"","
      "],tr:[3,"","
      "]}; -e.thead=e.tfoot=e.tbody;return function(K){var L=e[this.get("tag")];if(!L&&!a){L=[0,"",""];}if(!L){return l.call(this,K);}var O=L[0],N=document.createElement("div"),M=N; -if(!a){b.appendChild(N);}N.innerHTML=[L[1],K,L[2]].flatten().join("");while(O--){M=M.firstChild;}this.empty().adopt(M.childNodes);if(!a){b.removeChild(N); -}N=null;};})(Element.Properties.html.set);}var q=document.createElement("form");q.innerHTML="";if(q.firstChild.value!="s"){Element.Properties.value={set:function(N){var l=this.get("tag"); -if(l!="select"){return this.setProperty("value",N);}var K=this.getElements("option");N=String(N);for(var L=0;L0||r==null?"visible":"hidden";};var p=function(r,v,u){var t=r.style,s=t.filter||r.getComputedStyle("filter")||"";t.filter=(v.test(s)?s.replace(v,u):s+" "+u).trim(); -if(!t.filter){t.removeAttribute("filter");}};var h=(j?function(s,r){s.style.opacity=r;}:(g?function(s,r){if(!s.currentStyle||!s.currentStyle.hasLayout){s.style.zoom=1; -}if(r==null||r==1){p(s,q,"");if(r==1&&i(s)!=1){p(s,q,"alpha(opacity=100)");}}else{p(s,q,"alpha(opacity="+(r*100).limit(0,100).round()+")");}}:b));var i=(j?function(s){var r=s.style.opacity||s.getComputedStyle("opacity"); -return(r=="")?1:r.toFloat();}:(g?function(s){var t=(s.style.filter||s.getComputedStyle("filter")),r;if(t){r=t.match(q);}return(r==null||t==null)?1:(r[1]/100); -}:function(s){var r=s.retrieve("$opacity");if(r==null){r=(s.style.visibility=="hidden"?0:1);}return r;}));var d=(l.style.cssFloat==null)?"styleFloat":"cssFloat",a={left:"0%",top:"0%",center:"50%",right:"100%",bottom:"100%"},c=(l.style.backgroundPositionX!=null); -var m=function(r,s){if(s=="backgroundPosition"){r.removeAttribute(s+"X");s+="Y";}r.removeAttribute(s);};Element.implement({getComputedStyle:function(t){if(!n&&this.currentStyle){return this.currentStyle[t.camelCase()]; -}var s=Element.getDocument(this).defaultView,r=s?s.getComputedStyle(this,null):null;return(r)?r.getPropertyValue((t==d)?"float":t.hyphenate()):"";},setStyle:function(s,r){if(s=="opacity"){if(r!=null){r=parseFloat(r); -}h(this,r);return this;}s=(s=="float"?d:s).camelCase();if(typeOf(r)!="string"){var t=(Element.Styles[s]||"@").split(" ");r=Array.from(r).map(function(v,u){if(!t[u]){return""; -}return(typeOf(v)=="number")?t[u].replace("@",Math.round(v)):v;}).join(" ");}else{if(r==String(Number(r))){r=Math.round(r);}}this.style[s]=r;if((r==""||r==null)&&e&&this.style.removeAttribute){m(this.style,s); -}return this;},getStyle:function(x){if(x=="opacity"){return i(this);}x=(x=="float"?d:x).camelCase();var r=this.style[x];if(!r||x=="zIndex"){if(Element.ShortStyles.hasOwnProperty(x)){r=[]; -for(var w in Element.ShortStyles[x]){r.push(this.getStyle(w));}return r.join(" ");}r=this.getComputedStyle(x);}if(c&&/^backgroundPosition[XY]?$/.test(x)){return r.replace(/(top|right|bottom|left)/g,function(s){return a[s]; -})||"0px";}if(!r&&x=="backgroundPosition"){return"0px 0px";}if(r){r=String(r);var u=r.match(/rgba?\([\d\s,]+\)/);if(u){r=r.replace(u[0],u[0].rgbToHex()); -}}if(!n&&!this.style[x]){if((/^(height|width)$/).test(x)&&!(/px$/.test(r))){var t=(x=="width")?["left","right"]:["top","bottom"],v=0;t.each(function(s){v+=this.getStyle("border-"+s+"-width").toInt()+this.getStyle("padding-"+s).toInt(); -},this);return this["offset"+x.capitalize()]-v+"px";}if((/^border(.+)Width|margin|padding/).test(x)&&isNaN(parseFloat(r))){return"0px";}}if(o&&/^border(Top|Right|Bottom|Left)?$/.test(x)&&/^#/.test(r)){return r.replace(/^(.+)\s(.+)\s(.+)$/,"$2 $3 $1"); -}return r;},setStyles:function(s){for(var r in s){this.setStyle(r,s[r]);}return this;},getStyles:function(){var r={};Array.flatten(arguments).each(function(s){r[s]=this.getStyle(s); -},this);return r;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundSize:"@px",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}; -Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(x){var w=Element.ShortStyles; -var s=Element.Styles;["margin","padding"].each(function(y){var z=y+x;w[y][z]=s[z]="@px";});var v="border"+x;w.border[v]=s[v]="@px @ rgb(@, @, @)";var u=v+"Width",r=v+"Style",t=v+"Color"; -w[v]={};w.borderWidth[u]=w[v][u]=s[u]="@px";w.borderStyle[r]=w[v][r]=s[r]="@";w.borderColor[t]=w[v][t]=s[t]="rgb(@, @, @)";});if(c){Element.ShortStyles.backgroundPosition={backgroundPositionX:"@",backgroundPositionY:"@"}; -}})();(function(){Element.Properties.events={set:function(b){this.addEvents(b);}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{}); -if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h,f); -}if(b.condition){d=function(k){if(b.condition.call(this,k,f)){return h.call(this,k);}return true;};}if(b.base){g=Function.from(b.base).call(this,f);}}var e=function(){return h.call(j); -};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new DOMEvent(k,j.getWindow());if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]); -}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events");if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d); -if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];if(f){if(f.onRemove){f.onRemove.call(this,d,e);}if(f.base){e=Function.from(f.base).call(this,e); -}}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; -},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);}return this;}var c=this.retrieve("events");if(!c){return this; -}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);},this);delete c[b]; -}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c); -}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b); -}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,hashchange:1,popstate:2,error:1,abort:1,scroll:1}; -Element.Events={mousewheel:{base:"onwheel" in document?"wheel":"onmousewheel" in document?"mousewheel":"DOMMouseScroll"}};var a=function(b){var c=b.relatedTarget; -if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c));};if("onmouseenter" in document.documentElement){Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2; -Element.MouseenterCheck=a;}else{Element.Events.mouseenter={base:"mouseover",condition:a};Element.Events.mouseleave={base:"mouseout",condition:a};}if(!window.addEventListener){Element.NativeEvents.propertychange=2; -Element.Events.change={base:function(){var b=this.type;return(this.get("tag")=="input"&&(b=="radio"||b=="checkbox"))?"propertychange":"change";},condition:function(b){return b.type!="propertychange"||b.event.propertyName=="checked"; -}};}})();(function(){var c=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2;var k=function(l,m,n,o,p){while(p&&p!=l){if(m(p,o)){return n.call(p,o,p); -}p=document.id(p.parentNode);}};var a={mouseenter:{base:"mouseover",condition:Element.MouseenterCheck},mouseleave:{base:"mouseout",condition:Element.MouseenterCheck},focus:{base:"focus"+(c?"":"in"),capture:true},blur:{base:c?"blur":"focusout",capture:true}}; -var b="$delegation:";var i=function(l){return{base:"focusin",remove:function(m,o){var p=m.retrieve(b+l+"listeners",{})[o];if(p&&p.forms){for(var n=p.forms.length; -n--;){p.forms[n].removeEvent(l,p.fns[n]);}}},listen:function(x,r,v,n,t,s){var o=(t.get("tag")=="form")?t:n.target.getParent("form");if(!o){return;}var u=x.retrieve(b+l+"listeners",{}),p=u[s]||{forms:[],fns:[]},m=p.forms,w=p.fns; -if(m.indexOf(o)!=-1){return;}m.push(o);var q=function(y){k(x,r,v,y,t);};o.addEvent(l,q);w.push(q);u[s]=p;x.store(b+l+"listeners",u);}};};var d=function(l){return{base:"focusin",listen:function(m,n,p,q,r){var o={blur:function(){this.removeEvents(o); -}};o[l]=function(s){k(m,n,p,s,r);};q.target.addEvents(o);}};};if(!c){Object.append(a,{submit:i("submit"),reset:i("reset"),change:d("change"),select:d("select")}); -}var h=Element.prototype,f=h.addEvent,j=h.removeEvent;var e=function(l,m){return function(r,q,n){if(r.indexOf(":relay")==-1){return l.call(this,r,q,n); -}var o=Slick.parse(r).expressions[0][0];if(o.pseudos[0].key!="relay"){return l.call(this,r,q,n);}var p=o.tag;o.pseudos.slice(1).each(function(s){p+=":"+s.key+(s.value?"("+s.value+")":""); -});l.call(this,r,q);return m.call(this,p,o.pseudos[0].value,q);};};var g={addEvent:function(v,q,x){var t=this.retrieve("$delegates",{}),r=t[v];if(r){for(var y in r){if(r[y].fn==x&&r[y].match==q){return this; -}}}var p=v,u=q,o=x,n=a[v]||{};v=n.base||p;q=function(B){return Slick.match(B,u);};var w=Element.Events[p];if(n.condition||w&&w.condition){var l=q,m=n.condition||w.condition; -q=function(C,B){return l(C,B)&&m.call(C,B,v);};}var z=this,s=String.uniqueID();var A=n.listen?function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){n.listen(z,q,x,B,C,s); -}}:function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){k(z,q,x,B,C);}};if(!r){r={};}r[s]={match:u,fn:o,delegator:A};t[p]=r;return f.call(this,v,A,n.capture); -},removeEvent:function(r,n,t,u){var q=this.retrieve("$delegates",{}),p=q[r];if(!p){return this;}if(u){var m=r,w=p[u].delegator,l=a[r]||{};r=l.base||m;if(l.remove){l.remove(this,u); -}delete p[u];q[m]=p;return j.call(this,r,w,l.capture);}var o,v;if(t){for(o in p){v=p[o];if(v.match==n&&v.fn==t){return g.removeEvent.call(this,r,n,t,o); -}}}else{for(o in p){v=p[o];if(v.match==n){g.removeEvent.call(this,r,n,v.fn,o);}}}return this;}};[Element,Window,Document].invoke("implement",{addEvent:e(f,g.addEvent),removeEvent:e(j,g.removeEvent)}); -})();(function(){var h=document.createElement("div"),e=document.createElement("div");h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null; -var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName);};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n); -}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight}; -},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(a(this)){return this.getWindow().getScroll(); -}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0};while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop; -n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}var n=(k(m,"position")=="static")?i:l; -while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}try{return m.offsetParent; -}catch(n){}return null;},getOffsets:function(){var n=this.getBoundingClientRect;if(n){var r=this.getBoundingClientRect(),p=document.id(this.getDocument().documentElement),q=p.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed"); -return{x:r.left.toInt()+t.x+((s)?0:q.x)-p.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-p.clientTop};}var o=this,m={x:0,y:0};if(a(this)){return m;}while(o&&!a(o)){m.x+=o.offsetLeft; -m.y+=o.offsetTop;o=o.offsetParent;}return m;},getPosition:function(p){var q=this.getOffsets(),n=this.getScrolls();var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition(); -return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates();}var m=this.getPosition(o),n=this.getSize(); -var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")}; -},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight}; -},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body; -return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize(); -return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box"; -}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName); -}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y; -},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x; -},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y; -},getLeft:function(){return this.getPosition().x;}});(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this; -this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval; -this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame-1&&e.indexOf(document.domain)==-1){return;}var h=g.rules||g.cssRules; -b(h);});return Fx.CSS.Cache[a]=d;}});Fx.CSS.Cache={};Fx.CSS.Parsers={Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true); -}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a)); -});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:Function.from(false),compute:function(b,a){return a; -},serve:function(a){return a;}}};Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);},set:function(b,a){if(arguments.length==1){a=b; -b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit);return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this; -}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);return this.parent(a.from,a.to); -}});Element.Properties.tween={set:function(a){this.get("tween").cancel().setOptions(a);return this;},get:function(){var a=this.retrieve("tween");if(!a){a=new Fx.Tween(this,{link:"cancel"}); -this.store("tween",a);}return a;}};Element.implement({tween:function(a,c,b){this.get("tween").start(a,c,b);return this;},fade:function(d){var e=this.get("tween"),g,c=["opacity"].append(arguments),a; -if(c[1]==null){c[1]="toggle";}switch(c[1]){case"in":g="start";c[1]=1;break;case"out":g="start";c[1]=0;break;case"show":g="set";c[1]=1;break;case"hide":g="set"; -c[1]=0;break;case"toggle":var b=this.retrieve("fade:flag",this.getStyle("opacity")==1);g="start";c[1]=b?0:1;this.store("fade:flag",!b);a=true;break;default:g="start"; -}if(!a){this.eliminate("fade:flag");}e[g].apply(e,c);var f=c[c.length-1];if(g=="set"||f!=0){this.setStyle("visibility",f==0?"hidden":"visible");}else{e.chain(function(){this.element.setStyle("visibility","hidden"); -this.callChain();});}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));a=(a=="transparent")?"#fff":a; -}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original")); -b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a); -},set:function(a){if(typeof a=="string"){a=this.search(a);}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={}; -for(var b in e){a[b]=this.parent(e[b],d[b],c);}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={}; -for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){this.get("morph").cancel().setOptions(a); -return this;},get:function(){var a=this.retrieve("morph");if(!a){a=new Fx.Morph(this,{link:"cancel"});this.store("morph",a);}return a;}};Element.implement({morph:function(a){this.get("morph").start(a); -return this;}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof a=="string"){var b=a.split(":"); -a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")];}}return a;}});Fx.Transition=function(c,b){b=Array.from(b); -var a=function(d){return c(d,b);};return Object.append(a,{easeIn:a,easeOut:function(d){return 1-c(1-d,b);},easeInOut:function(d){return(d<=0.5?c(2*d,b):(2-c(2*(1-d),b)))/2; -}});};Fx.Transitions={linear:function(a){return a;}};Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b]);}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a&&a[0]||6); -},Expo:function(a){return Math.pow(2,8*(a-1));},Circ:function(a){return 1-Math.sin(Math.acos(a));},Sine:function(a){return 1-Math.cos(a*Math.PI/2);},Back:function(b,a){a=a&&a[0]||1.618; -return Math.pow(b,2)*((a+1)*b-a);},Bounce:function(f){var e;for(var d=0,c=1;1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e; -},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,a+2); -});});(function(){var d=function(){},a=("onprogress" in new Browser.Request);var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(e){this.xhr=new Browser.Request(); -this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false; -this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d; -}clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml); -}else{this.failure();}},isSuccess:function(){var e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e); -}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); -},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(e){this.fireEvent("loadstart",[e,this.xhr]); -},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f; -return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.bind(this));},check:function(){if(!this.running){return true; -}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(o){if(!this.check(o)){return this; -}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options; -o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString(); -break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e; -j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g; -}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.indexOf("?")>-1?"&":"?")+String.uniqueID(); -}if(j&&(e=="get"||e=="delete")){f+=(f.indexOf("?")>-1?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this); -}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true; -}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]); -}},this);this.fireEvent("request");n.send(j);if(!this.options.async){this.onStateChange();}else{if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this); -}}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d; -if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e}; -if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e); -return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")}); -this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.options.url});return this;}});})(); -Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(f){var e=this.options,c=this.response; -c.html=f.stripScripts(function(h){c.javascript=h;});var d=c.html.match(/]*>([\s\S]*?)<\/body>/i);if(d){c.html=d[1];}var b=new Element("div").set("html",c.html); -c.tree=b.childNodes;c.elements=b.getElements(e.filter||"*");if(e.filter){c.tree=c.elements;}if(e.update){var g=document.id(e.update).empty();if(e.filter){g.adopt(c.elements); -}else{g.set("html",c.html);}}else{if(e.append){var a=document.id(e.append);if(e.filter){c.elements.reverse().inject(a);}else{a.adopt(b.getChildren());}}}if(e.evalScripts){Browser.exec(c.javascript); -}this.onSuccess(c.tree,c.elements,c.html,c.javascript);}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this; -},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",a);}return a; -}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return this;}});if(typeof JSON=="undefined"){this.JSON={}; -}(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4); -};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""); -return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON(); -}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[]; -Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj; -case"null":return"null";}return null;};JSON.secure=true;JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null;}if(secure==null){secure=JSON.secure; -}if(secure){if(JSON.parse){return JSON.parse(string);}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure."); -}}return eval("("+string+")");};})();Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"}); -},success:function(c){var b;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure(); -}else{this.onSuccess(b,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b; -this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path; -}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure"; -}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); -return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}}); -Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose(); -};(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a); -k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b); -if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h); -c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a); -}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this); -}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document); \ No newline at end of file diff --git a/module/webui/themes/default/js/static/mootools-more.js b/module/webui/themes/default/js/static/mootools-more.js deleted file mode 100644 index c7f4a1a0e..000000000 --- a/module/webui/themes/default/js/static/mootools-more.js +++ /dev/null @@ -1,2856 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/more/c1cc18c2fff04bcc58921b4dff80a6f1 - -packager build: - - packager build More/Form.Request More/Fx.Reveal More/Sortables More/Request.Periodical More/Color - -... -*/ - -/* ---- - -script: More.js - -name: More - -description: MooTools More - -license: MIT-style license - -authors: - - Guillermo Rauch - - Thomas Aylott - - Scott Kyle - - Arian Stolwijk - - Tim Wienk - - Christoph Pojer - - Aaron Newton - - Jacob Thornton - -requires: - - Core/MooTools - -provides: [MooTools.More] - -... -*/ - -MooTools.More = { - version: '1.5.0', - build: '73db5e24e6e9c5c87b3a27aebef2248053f7db37' -}; - - -/* ---- - -script: Class.Binds.js - -name: Class.Binds - -description: Automagically binds specified methods in a class to the instance of the class. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Class - - MooTools.More - -provides: [Class.Binds] - -... -*/ - -Class.Mutators.Binds = function(binds){ - if (!this.prototype.initialize) this.implement('initialize', function(){}); - return Array.from(binds).concat(this.prototype.Binds || []); -}; - -Class.Mutators.initialize = function(initialize){ - return function(){ - Array.from(this.Binds).each(function(name){ - var original = this[name]; - if (original) this[name] = original.bind(this); - }, this); - return initialize.apply(this, arguments); - }; -}; - - -/* ---- - -script: Class.Occlude.js - -name: Class.Occlude - -description: Prevents a class from being applied to a DOM element twice. - -license: MIT-style license. - -authors: - - Aaron Newton - -requires: - - Core/Class - - Core/Element - - MooTools.More - -provides: [Class.Occlude] - -... -*/ - -Class.Occlude = new Class({ - - occlude: function(property, element){ - element = document.id(element || this.element); - var instance = element.retrieve(property || this.property); - if (instance && !this.occluded) - return (this.occluded = instance); - - this.occluded = false; - element.store(property || this.property, this); - return this.occluded; - } - -}); - - -/* ---- - -script: Class.Refactor.js - -name: Class.Refactor - -description: Extends a class onto itself with new property, preserving any items attached to the class's namespace. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Class - - MooTools.More - -# Some modules declare themselves dependent on Class.Refactor -provides: [Class.refactor, Class.Refactor] - -... -*/ - -Class.refactor = function(original, refactors){ - - Object.each(refactors, function(item, name){ - var origin = original.prototype[name]; - origin = (origin && origin.$origin) || origin || function(){}; - original.implement(name, (typeof item == 'function') ? function(){ - var old = this.previous; - this.previous = origin; - var value = item.apply(this, arguments); - this.previous = old; - return value; - } : item); - }); - - return original; - -}; - - -/* ---- - -script: Element.Measure.js - -name: Element.Measure - -description: Extends the Element native object to include methods useful in measuring dimensions. - -credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz" - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Element.Style - - Core/Element.Dimensions - - MooTools.More - -provides: [Element.Measure] - -... -*/ - -(function(){ - -var getStylesList = function(styles, planes){ - var list = []; - Object.each(planes, function(directions){ - Object.each(directions, function(edge){ - styles.each(function(style){ - list.push(style + '-' + edge + (style == 'border' ? '-width' : '')); - }); - }); - }); - return list; -}; - -var calculateEdgeSize = function(edge, styles){ - var total = 0; - Object.each(styles, function(value, style){ - if (style.test(edge)) total = total + value.toInt(); - }); - return total; -}; - -var isVisible = function(el){ - return !!(!el || el.offsetHeight || el.offsetWidth); -}; - - -Element.implement({ - - measure: function(fn){ - if (isVisible(this)) return fn.call(this); - var parent = this.getParent(), - toMeasure = []; - while (!isVisible(parent) && parent != document.body){ - toMeasure.push(parent.expose()); - parent = parent.getParent(); - } - var restore = this.expose(), - result = fn.call(this); - restore(); - toMeasure.each(function(restore){ - restore(); - }); - return result; - }, - - expose: function(){ - if (this.getStyle('display') != 'none') return function(){}; - var before = this.style.cssText; - this.setStyles({ - display: 'block', - position: 'absolute', - visibility: 'hidden' - }); - return function(){ - this.style.cssText = before; - }.bind(this); - }, - - getDimensions: function(options){ - options = Object.merge({computeSize: false}, options); - var dim = {x: 0, y: 0}; - - var getSize = function(el, options){ - return (options.computeSize) ? el.getComputedSize(options) : el.getSize(); - }; - - var parent = this.getParent('body'); - - if (parent && this.getStyle('display') == 'none'){ - dim = this.measure(function(){ - return getSize(this, options); - }); - } else if (parent){ - try { //safari sometimes crashes here, so catch it - dim = getSize(this, options); - }catch(e){} - } - - return Object.append(dim, (dim.x || dim.x === 0) ? { - width: dim.x, - height: dim.y - } : { - x: dim.width, - y: dim.height - } - ); - }, - - getComputedSize: function(options){ - - - options = Object.merge({ - styles: ['padding','border'], - planes: { - height: ['top','bottom'], - width: ['left','right'] - }, - mode: 'both' - }, options); - - var styles = {}, - size = {width: 0, height: 0}, - dimensions; - - if (options.mode == 'vertical'){ - delete size.width; - delete options.planes.width; - } else if (options.mode == 'horizontal'){ - delete size.height; - delete options.planes.height; - } - - getStylesList(options.styles, options.planes).each(function(style){ - styles[style] = this.getStyle(style).toInt(); - }, this); - - Object.each(options.planes, function(edges, plane){ - - var capitalized = plane.capitalize(), - style = this.getStyle(plane); - - if (style == 'auto' && !dimensions) dimensions = this.getDimensions(); - - style = styles[plane] = (style == 'auto') ? dimensions[plane] : style.toInt(); - size['total' + capitalized] = style; - - edges.each(function(edge){ - var edgesize = calculateEdgeSize(edge, styles); - size['computed' + edge.capitalize()] = edgesize; - size['total' + capitalized] += edgesize; - }); - - }, this); - - return Object.append(size, styles); - } - -}); - -})(); - - -/* ---- - -script: Element.Position.js - -name: Element.Position - -description: Extends the Element native object to include methods useful positioning elements relative to others. - -license: MIT-style license - -authors: - - Aaron Newton - - Jacob Thornton - -requires: - - Core/Options - - Core/Element.Dimensions - - Element.Measure - -provides: [Element.Position] - -... -*/ - -(function(original){ - -var local = Element.Position = { - - options: {/* - edge: false, - returnPos: false, - minimum: {x: 0, y: 0}, - maximum: {x: 0, y: 0}, - relFixedPosition: false, - ignoreMargins: false, - ignoreScroll: false, - allowNegative: false,*/ - relativeTo: document.body, - position: { - x: 'center', //left, center, right - y: 'center' //top, center, bottom - }, - offset: {x: 0, y: 0} - }, - - getOptions: function(element, options){ - options = Object.merge({}, local.options, options); - local.setPositionOption(options); - local.setEdgeOption(options); - local.setOffsetOption(element, options); - local.setDimensionsOption(element, options); - return options; - }, - - setPositionOption: function(options){ - options.position = local.getCoordinateFromValue(options.position); - }, - - setEdgeOption: function(options){ - var edgeOption = local.getCoordinateFromValue(options.edge); - options.edge = edgeOption ? edgeOption : - (options.position.x == 'center' && options.position.y == 'center') ? {x: 'center', y: 'center'} : - {x: 'left', y: 'top'}; - }, - - setOffsetOption: function(element, options){ - var parentOffset = {x: 0, y: 0}; - var parentScroll = {x: 0, y: 0}; - var offsetParent = element.measure(function(){ - return document.id(this.getOffsetParent()); - }); - - if (!offsetParent || offsetParent == element.getDocument().body) return; - - parentScroll = offsetParent.getScroll(); - parentOffset = offsetParent.measure(function(){ - var position = this.getPosition(); - if (this.getStyle('position') == 'fixed'){ - var scroll = window.getScroll(); - position.x += scroll.x; - position.y += scroll.y; - } - return position; - }); - - options.offset = { - parentPositioned: offsetParent != document.id(options.relativeTo), - x: options.offset.x - parentOffset.x + parentScroll.x, - y: options.offset.y - parentOffset.y + parentScroll.y - }; - }, - - setDimensionsOption: function(element, options){ - options.dimensions = element.getDimensions({ - computeSize: true, - styles: ['padding', 'border', 'margin'] - }); - }, - - getPosition: function(element, options){ - var position = {}; - options = local.getOptions(element, options); - var relativeTo = document.id(options.relativeTo) || document.body; - - local.setPositionCoordinates(options, position, relativeTo); - if (options.edge) local.toEdge(position, options); - - var offset = options.offset; - position.left = ((position.x >= 0 || offset.parentPositioned || options.allowNegative) ? position.x : 0).toInt(); - position.top = ((position.y >= 0 || offset.parentPositioned || options.allowNegative) ? position.y : 0).toInt(); - - local.toMinMax(position, options); - - if (options.relFixedPosition || relativeTo.getStyle('position') == 'fixed') local.toRelFixedPosition(relativeTo, position); - if (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position); - if (options.ignoreMargins) local.toIgnoreMargins(position, options); - - position.left = Math.ceil(position.left); - position.top = Math.ceil(position.top); - delete position.x; - delete position.y; - - return position; - }, - - setPositionCoordinates: function(options, position, relativeTo){ - var offsetY = options.offset.y, - offsetX = options.offset.x, - calc = (relativeTo == document.body) ? window.getScroll() : relativeTo.getPosition(), - top = calc.y, - left = calc.x, - winSize = window.getSize(); - - switch(options.position.x){ - case 'left': position.x = left + offsetX; break; - case 'right': position.x = left + offsetX + relativeTo.offsetWidth; break; - default: position.x = left + ((relativeTo == document.body ? winSize.x : relativeTo.offsetWidth) / 2) + offsetX; break; - } - - switch(options.position.y){ - case 'top': position.y = top + offsetY; break; - case 'bottom': position.y = top + offsetY + relativeTo.offsetHeight; break; - default: position.y = top + ((relativeTo == document.body ? winSize.y : relativeTo.offsetHeight) / 2) + offsetY; break; - } - }, - - toMinMax: function(position, options){ - var xy = {left: 'x', top: 'y'}, value; - ['minimum', 'maximum'].each(function(minmax){ - ['left', 'top'].each(function(lr){ - value = options[minmax] ? options[minmax][xy[lr]] : null; - if (value != null && ((minmax == 'minimum') ? position[lr] < value : position[lr] > value)) position[lr] = value; - }); - }); - }, - - toRelFixedPosition: function(relativeTo, position){ - var winScroll = window.getScroll(); - position.top += winScroll.y; - position.left += winScroll.x; - }, - - toIgnoreScroll: function(relativeTo, position){ - var relScroll = relativeTo.getScroll(); - position.top -= relScroll.y; - position.left -= relScroll.x; - }, - - toIgnoreMargins: function(position, options){ - position.left += options.edge.x == 'right' - ? options.dimensions['margin-right'] - : (options.edge.x != 'center' - ? -options.dimensions['margin-left'] - : -options.dimensions['margin-left'] + ((options.dimensions['margin-right'] + options.dimensions['margin-left']) / 2)); - - position.top += options.edge.y == 'bottom' - ? options.dimensions['margin-bottom'] - : (options.edge.y != 'center' - ? -options.dimensions['margin-top'] - : -options.dimensions['margin-top'] + ((options.dimensions['margin-bottom'] + options.dimensions['margin-top']) / 2)); - }, - - toEdge: function(position, options){ - var edgeOffset = {}, - dimensions = options.dimensions, - edge = options.edge; - - switch(edge.x){ - case 'left': edgeOffset.x = 0; break; - case 'right': edgeOffset.x = -dimensions.x - dimensions.computedRight - dimensions.computedLeft; break; - // center - default: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break; - } - - switch(edge.y){ - case 'top': edgeOffset.y = 0; break; - case 'bottom': edgeOffset.y = -dimensions.y - dimensions.computedTop - dimensions.computedBottom; break; - // center - default: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2)); break; - } - - position.x += edgeOffset.x; - position.y += edgeOffset.y; - }, - - getCoordinateFromValue: function(option){ - if (typeOf(option) != 'string') return option; - option = option.toLowerCase(); - - return { - x: option.test('left') ? 'left' - : (option.test('right') ? 'right' : 'center'), - y: option.test(/upper|top/) ? 'top' - : (option.test('bottom') ? 'bottom' : 'center') - }; - } - -}; - -Element.implement({ - - position: function(options){ - if (options && (options.x != null || options.y != null)){ - return (original ? original.apply(this, arguments) : this); - } - var position = this.setStyle('position', 'absolute').calculatePosition(options); - return (options && options.returnPos) ? position : this.setStyles(position); - }, - - calculatePosition: function(options){ - return local.getPosition(this, options); - } - -}); - -})(Element.prototype.position); - - -/* ---- - -script: IframeShim.js - -name: IframeShim - -description: Defines IframeShim, a class for obscuring select lists and flash objects in IE. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Element.Event - - Core/Element.Style - - Core/Options - - Core/Events - - Element.Position - - Class.Occlude - -provides: [IframeShim] - -... -*/ - -(function(){ - -var browsers = false; - - -this.IframeShim = new Class({ - - Implements: [Options, Events, Class.Occlude], - - options: { - className: 'iframeShim', - src: 'javascript:false;document.write("");', - display: false, - zIndex: null, - margin: 0, - offset: {x: 0, y: 0}, - browsers: browsers - }, - - property: 'IframeShim', - - initialize: function(element, options){ - this.element = document.id(element); - if (this.occlude()) return this.occluded; - this.setOptions(options); - this.makeShim(); - return this; - }, - - makeShim: function(){ - if (this.options.browsers){ - var zIndex = this.element.getStyle('zIndex').toInt(); - - if (!zIndex){ - zIndex = 1; - var pos = this.element.getStyle('position'); - if (pos == 'static' || !pos) this.element.setStyle('position', 'relative'); - this.element.setStyle('zIndex', zIndex); - } - zIndex = ((this.options.zIndex != null || this.options.zIndex === 0) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1; - if (zIndex < 0) zIndex = 1; - this.shim = new Element('iframe', { - src: this.options.src, - scrolling: 'no', - frameborder: 0, - styles: { - zIndex: zIndex, - position: 'absolute', - border: 'none', - filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)' - }, - 'class': this.options.className - }).store('IframeShim', this); - var inject = (function(){ - this.shim.inject(this.element, 'after'); - this[this.options.display ? 'show' : 'hide'](); - this.fireEvent('inject'); - }).bind(this); - if (!IframeShim.ready) window.addEvent('load', inject); - else inject(); - } else { - this.position = this.hide = this.show = this.dispose = Function.from(this); - } - }, - - position: function(){ - if (!IframeShim.ready || !this.shim) return this; - var size = this.element.measure(function(){ - return this.getSize(); - }); - if (this.options.margin != undefined){ - size.x = size.x - (this.options.margin * 2); - size.y = size.y - (this.options.margin * 2); - this.options.offset.x += this.options.margin; - this.options.offset.y += this.options.margin; - } - this.shim.set({width: size.x, height: size.y}).position({ - relativeTo: this.element, - offset: this.options.offset - }); - return this; - }, - - hide: function(){ - if (this.shim) this.shim.setStyle('display', 'none'); - return this; - }, - - show: function(){ - if (this.shim) this.shim.setStyle('display', 'block'); - return this.position(); - }, - - dispose: function(){ - if (this.shim) this.shim.dispose(); - return this; - }, - - destroy: function(){ - if (this.shim) this.shim.destroy(); - return this; - } - -}); - -})(); - -window.addEvent('load', function(){ - IframeShim.ready = true; -}); - - -/* ---- - -script: Mask.js - -name: Mask - -description: Creates a mask element to cover another. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Options - - Core/Events - - Core/Element.Event - - Class.Binds - - Element.Position - - IframeShim - -provides: [Mask] - -... -*/ - -var Mask = new Class({ - - Implements: [Options, Events], - - Binds: ['position'], - - options: {/* - onShow: function(){}, - onHide: function(){}, - onDestroy: function(){}, - onClick: function(event){}, - inject: { - where: 'after', - target: null, - }, - hideOnClick: false, - id: null, - destroyOnHide: false,*/ - style: {}, - 'class': 'mask', - maskMargins: false, - useIframeShim: true, - iframeShimOptions: {} - }, - - initialize: function(target, options){ - this.target = document.id(target) || document.id(document.body); - this.target.store('mask', this); - this.setOptions(options); - this.render(); - this.inject(); - }, - - render: function(){ - this.element = new Element('div', { - 'class': this.options['class'], - id: this.options.id || 'mask-' + String.uniqueID(), - styles: Object.merge({}, this.options.style, { - display: 'none' - }), - events: { - click: function(event){ - this.fireEvent('click', event); - if (this.options.hideOnClick) this.hide(); - }.bind(this) - } - }); - - this.hidden = true; - }, - - toElement: function(){ - return this.element; - }, - - inject: function(target, where){ - where = where || (this.options.inject ? this.options.inject.where : '') || (this.target == document.body ? 'inside' : 'after'); - target = target || (this.options.inject && this.options.inject.target) || this.target; - - this.element.inject(target, where); - - if (this.options.useIframeShim){ - this.shim = new IframeShim(this.element, this.options.iframeShimOptions); - - this.addEvents({ - show: this.shim.show.bind(this.shim), - hide: this.shim.hide.bind(this.shim), - destroy: this.shim.destroy.bind(this.shim) - }); - } - }, - - position: function(){ - this.resize(this.options.width, this.options.height); - - this.element.position({ - relativeTo: this.target, - position: 'topLeft', - ignoreMargins: !this.options.maskMargins, - ignoreScroll: this.target == document.body - }); - - return this; - }, - - resize: function(x, y){ - var opt = { - styles: ['padding', 'border'] - }; - if (this.options.maskMargins) opt.styles.push('margin'); - - var dim = this.target.getComputedSize(opt); - if (this.target == document.body){ - this.element.setStyles({width: 0, height: 0}); - var win = window.getScrollSize(); - if (dim.totalHeight < win.y) dim.totalHeight = win.y; - if (dim.totalWidth < win.x) dim.totalWidth = win.x; - } - this.element.setStyles({ - width: Array.pick([x, dim.totalWidth, dim.x]), - height: Array.pick([y, dim.totalHeight, dim.y]) - }); - - return this; - }, - - show: function(){ - if (!this.hidden) return this; - - window.addEvent('resize', this.position); - this.position(); - this.showMask.apply(this, arguments); - - return this; - }, - - showMask: function(){ - this.element.setStyle('display', 'block'); - this.hidden = false; - this.fireEvent('show'); - }, - - hide: function(){ - if (this.hidden) return this; - - window.removeEvent('resize', this.position); - this.hideMask.apply(this, arguments); - if (this.options.destroyOnHide) return this.destroy(); - - return this; - }, - - hideMask: function(){ - this.element.setStyle('display', 'none'); - this.hidden = true; - this.fireEvent('hide'); - }, - - toggle: function(){ - this[this.hidden ? 'show' : 'hide'](); - }, - - destroy: function(){ - this.hide(); - this.element.destroy(); - this.fireEvent('destroy'); - this.target.eliminate('mask'); - } - -}); - -Element.Properties.mask = { - - set: function(options){ - var mask = this.retrieve('mask'); - if (mask) mask.destroy(); - return this.eliminate('mask').store('mask:options', options); - }, - - get: function(){ - var mask = this.retrieve('mask'); - if (!mask){ - mask = new Mask(this, this.retrieve('mask:options')); - this.store('mask', mask); - } - return mask; - } - -}; - -Element.implement({ - - mask: function(options){ - if (options) this.set('mask', options); - this.get('mask').show(); - return this; - }, - - unmask: function(){ - this.get('mask').hide(); - return this; - } - -}); - - -/* ---- - -script: Spinner.js - -name: Spinner - -description: Adds a semi-transparent overlay over a dom element with a spinnin ajax icon. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Fx.Tween - - Core/Request - - Class.refactor - - Mask - -provides: [Spinner] - -... -*/ - -var Spinner = new Class({ - - Extends: Mask, - - Implements: Chain, - - options: {/* - message: false,*/ - 'class': 'spinner', - containerPosition: {}, - content: { - 'class': 'spinner-content' - }, - messageContainer: { - 'class': 'spinner-msg' - }, - img: { - 'class': 'spinner-img' - }, - fxOptions: { - link: 'chain' - } - }, - - initialize: function(target, options){ - this.target = document.id(target) || document.id(document.body); - this.target.store('spinner', this); - this.setOptions(options); - this.render(); - this.inject(); - - // Add this to events for when noFx is true; parent methods handle hide/show. - var deactivate = function(){ this.active = false; }.bind(this); - this.addEvents({ - hide: deactivate, - show: deactivate - }); - }, - - render: function(){ - this.parent(); - - this.element.set('id', this.options.id || 'spinner-' + String.uniqueID()); - - this.content = document.id(this.options.content) || new Element('div', this.options.content); - this.content.inject(this.element); - - if (this.options.message){ - this.msg = document.id(this.options.message) || new Element('p', this.options.messageContainer).appendText(this.options.message); - this.msg.inject(this.content); - } - - if (this.options.img){ - this.img = document.id(this.options.img) || new Element('div', this.options.img); - this.img.inject(this.content); - } - - this.element.set('tween', this.options.fxOptions); - }, - - show: function(noFx){ - if (this.active) return this.chain(this.show.bind(this)); - if (!this.hidden){ - this.callChain.delay(20, this); - return this; - } - - this.target.set('aria-busy', 'true'); - this.active = true; - - return this.parent(noFx); - }, - - showMask: function(noFx){ - var pos = function(){ - this.content.position(Object.merge({ - relativeTo: this.element - }, this.options.containerPosition)); - }.bind(this); - - if (noFx){ - this.parent(); - pos(); - } else { - if (!this.options.style.opacity) this.options.style.opacity = this.element.getStyle('opacity').toFloat(); - this.element.setStyles({ - display: 'block', - opacity: 0 - }).tween('opacity', this.options.style.opacity); - pos(); - this.hidden = false; - this.fireEvent('show'); - this.callChain(); - } - }, - - hide: function(noFx){ - if (this.active) return this.chain(this.hide.bind(this)); - if (this.hidden){ - this.callChain.delay(20, this); - return this; - } - - this.target.set('aria-busy', 'false'); - this.active = true; - - return this.parent(noFx); - }, - - hideMask: function(noFx){ - if (noFx) return this.parent(); - this.element.tween('opacity', 0).get('tween').chain(function(){ - this.element.setStyle('display', 'none'); - this.hidden = true; - this.fireEvent('hide'); - this.callChain(); - }.bind(this)); - }, - - destroy: function(){ - this.content.destroy(); - this.parent(); - this.target.eliminate('spinner'); - } - -}); - -Request = Class.refactor(Request, { - - options: { - useSpinner: false, - spinnerOptions: {}, - spinnerTarget: false - }, - - initialize: function(options){ - this._send = this.send; - this.send = function(options){ - var spinner = this.getSpinner(); - if (spinner) spinner.chain(this._send.pass(options, this)).show(); - else this._send(options); - return this; - }; - this.previous(options); - }, - - getSpinner: function(){ - if (!this.spinner){ - var update = document.id(this.options.spinnerTarget) || document.id(this.options.update); - if (this.options.useSpinner && update){ - update.set('spinner', this.options.spinnerOptions); - var spinner = this.spinner = update.get('spinner'); - ['complete', 'exception', 'cancel'].each(function(event){ - this.addEvent(event, spinner.hide.bind(spinner)); - }, this); - } - } - return this.spinner; - } - -}); - -Element.Properties.spinner = { - - set: function(options){ - var spinner = this.retrieve('spinner'); - if (spinner) spinner.destroy(); - return this.eliminate('spinner').store('spinner:options', options); - }, - - get: function(){ - var spinner = this.retrieve('spinner'); - if (!spinner){ - spinner = new Spinner(this, this.retrieve('spinner:options')); - this.store('spinner', spinner); - } - return spinner; - } - -}; - -Element.implement({ - - spin: function(options){ - if (options) this.set('spinner', options); - this.get('spinner').show(); - return this; - }, - - unspin: function(){ - this.get('spinner').hide(); - return this; - } - -}); - - -/* ---- - -script: String.QueryString.js - -name: String.QueryString - -description: Methods for dealing with URI query strings. - -license: MIT-style license - -authors: - - Sebastian Markbåge - - Aaron Newton - - Lennart Pilon - - Valerio Proietti - -requires: - - Core/Array - - Core/String - - MooTools.More - -provides: [String.QueryString] - -... -*/ - -String.implement({ - - parseQueryString: function(decodeKeys, decodeValues){ - if (decodeKeys == null) decodeKeys = true; - if (decodeValues == null) decodeValues = true; - - var vars = this.split(/[&;]/), - object = {}; - if (!vars.length) return object; - - vars.each(function(val){ - var index = val.indexOf('=') + 1, - value = index ? val.substr(index) : '', - keys = index ? val.substr(0, index - 1).match(/([^\]\[]+|(\B)(?=\]))/g) : [val], - obj = object; - if (!keys) return; - if (decodeValues) value = decodeURIComponent(value); - keys.each(function(key, i){ - if (decodeKeys) key = decodeURIComponent(key); - var current = obj[key]; - - if (i < keys.length - 1) obj = obj[key] = current || {}; - else if (typeOf(current) == 'array') current.push(value); - else obj[key] = current != null ? [current, value] : value; - }); - }); - - return object; - }, - - cleanQueryString: function(method){ - return this.split('&').filter(function(val){ - var index = val.indexOf('='), - key = index < 0 ? '' : val.substr(0, index), - value = val.substr(index + 1); - - return method ? method.call(null, key, value) : (value || value === 0); - }).join('&'); - } - -}); - - -/* ---- - -name: Events.Pseudos - -description: Adds the functionality to add pseudo events - -license: MIT-style license - -authors: - - Arian Stolwijk - -requires: [Core/Class.Extras, Core/Slick.Parser, MooTools.More] - -provides: [Events.Pseudos] - -... -*/ - -(function(){ - -Events.Pseudos = function(pseudos, addEvent, removeEvent){ - - var storeKey = '_monitorEvents:'; - - var storageOf = function(object){ - return { - store: object.store ? function(key, value){ - object.store(storeKey + key, value); - } : function(key, value){ - (object._monitorEvents || (object._monitorEvents = {}))[key] = value; - }, - retrieve: object.retrieve ? function(key, dflt){ - return object.retrieve(storeKey + key, dflt); - } : function(key, dflt){ - if (!object._monitorEvents) return dflt; - return object._monitorEvents[key] || dflt; - } - }; - }; - - var splitType = function(type){ - if (type.indexOf(':') == -1 || !pseudos) return null; - - var parsed = Slick.parse(type).expressions[0][0], - parsedPseudos = parsed.pseudos, - l = parsedPseudos.length, - splits = []; - - while (l--){ - var pseudo = parsedPseudos[l].key, - listener = pseudos[pseudo]; - if (listener != null) splits.push({ - event: parsed.tag, - value: parsedPseudos[l].value, - pseudo: pseudo, - original: type, - listener: listener - }); - } - return splits.length ? splits : null; - }; - - return { - - addEvent: function(type, fn, internal){ - var split = splitType(type); - if (!split) return addEvent.call(this, type, fn, internal); - - var storage = storageOf(this), - events = storage.retrieve(type, []), - eventType = split[0].event, - args = Array.slice(arguments, 2), - stack = fn, - self = this; - - split.each(function(item){ - var listener = item.listener, - stackFn = stack; - if (listener == false) eventType += ':' + item.pseudo + '(' + item.value + ')'; - else stack = function(){ - listener.call(self, item, stackFn, arguments, stack); - }; - }); - - events.include({type: eventType, event: fn, monitor: stack}); - storage.store(type, events); - - if (type != eventType) addEvent.apply(this, [type, fn].concat(args)); - return addEvent.apply(this, [eventType, stack].concat(args)); - }, - - removeEvent: function(type, fn){ - var split = splitType(type); - if (!split) return removeEvent.call(this, type, fn); - - var storage = storageOf(this), - events = storage.retrieve(type); - if (!events) return this; - - var args = Array.slice(arguments, 2); - - removeEvent.apply(this, [type, fn].concat(args)); - events.each(function(monitor, i){ - if (!fn || monitor.event == fn) removeEvent.apply(this, [monitor.type, monitor.monitor].concat(args)); - delete events[i]; - }, this); - - storage.store(type, events); - return this; - } - - }; - -}; - -var pseudos = { - - once: function(split, fn, args, monitor){ - fn.apply(this, args); - this.removeEvent(split.event, monitor) - .removeEvent(split.original, fn); - }, - - throttle: function(split, fn, args){ - if (!fn._throttled){ - fn.apply(this, args); - fn._throttled = setTimeout(function(){ - fn._throttled = false; - }, split.value || 250); - } - }, - - pause: function(split, fn, args){ - clearTimeout(fn._pause); - fn._pause = fn.delay(split.value || 250, this, args); - } - -}; - -Events.definePseudo = function(key, listener){ - pseudos[key] = listener; - return this; -}; - -Events.lookupPseudo = function(key){ - return pseudos[key]; -}; - -var proto = Events.prototype; -Events.implement(Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent)); - -['Request', 'Fx'].each(function(klass){ - if (this[klass]) this[klass].implement(Events.prototype); -}); - -})(); - - -/* ---- - -name: Element.Event.Pseudos - -description: Adds the functionality to add pseudo events for Elements - -license: MIT-style license - -authors: - - Arian Stolwijk - -requires: [Core/Element.Event, Core/Element.Delegation, Events.Pseudos] - -provides: [Element.Event.Pseudos, Element.Delegation.Pseudo] - -... -*/ - -(function(){ - -var pseudos = {relay: false}, - copyFromEvents = ['once', 'throttle', 'pause'], - count = copyFromEvents.length; - -while (count--) pseudos[copyFromEvents[count]] = Events.lookupPseudo(copyFromEvents[count]); - -DOMEvent.definePseudo = function(key, listener){ - pseudos[key] = listener; - return this; -}; - -var proto = Element.prototype; -[Element, Window, Document].invoke('implement', Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent)); - -})(); - - -/* ---- - -script: Form.Request.js - -name: Form.Request - -description: Handles the basic functionality of submitting a form and updating a dom element with the result. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Request.HTML - - Class.Binds - - Class.Occlude - - Spinner - - String.QueryString - - Element.Delegation.Pseudo - -provides: [Form.Request] - -... -*/ - -if (!window.Form) window.Form = {}; - -(function(){ - - Form.Request = new Class({ - - Binds: ['onSubmit', 'onFormValidate'], - - Implements: [Options, Events, Class.Occlude], - - options: {/* - onFailure: function(){}, - onSuccess: function(){}, // aliased to onComplete, - onSend: function(){}*/ - requestOptions: { - evalScripts: true, - useSpinner: true, - emulation: false, - link: 'ignore' - }, - sendButtonClicked: true, - extraData: {}, - resetForm: true - }, - - property: 'form.request', - - initialize: function(form, target, options){ - this.element = document.id(form); - if (this.occlude()) return this.occluded; - this.setOptions(options) - .setTarget(target) - .attach(); - }, - - setTarget: function(target){ - this.target = document.id(target); - if (!this.request){ - this.makeRequest(); - } else { - this.request.setOptions({ - update: this.target - }); - } - return this; - }, - - toElement: function(){ - return this.element; - }, - - makeRequest: function(){ - var self = this; - this.request = new Request.HTML(Object.merge({ - update: this.target, - emulation: false, - spinnerTarget: this.element, - method: this.element.get('method') || 'post' - }, this.options.requestOptions)).addEvents({ - success: function(tree, elements, html, javascript){ - ['complete', 'success'].each(function(evt){ - self.fireEvent(evt, [self.target, tree, elements, html, javascript]); - }); - }, - failure: function(){ - self.fireEvent('complete', arguments).fireEvent('failure', arguments); - }, - exception: function(){ - self.fireEvent('failure', arguments); - } - }); - return this.attachReset(); - }, - - attachReset: function(){ - if (!this.options.resetForm) return this; - this.request.addEvent('success', function(){ - Function.attempt(function(){ - this.element.reset(); - }.bind(this)); - if (window.OverText) OverText.update(); - }.bind(this)); - return this; - }, - - attach: function(attach){ - var method = (attach != false) ? 'addEvent' : 'removeEvent'; - this.element[method]('click:relay(button, input[type=submit])', this.saveClickedButton.bind(this)); - - var fv = this.element.retrieve('validator'); - if (fv) fv[method]('onFormValidate', this.onFormValidate); - else this.element[method]('submit', this.onSubmit); - - return this; - }, - - detach: function(){ - return this.attach(false); - }, - - //public method - enable: function(){ - return this.attach(); - }, - - //public method - disable: function(){ - return this.detach(); - }, - - onFormValidate: function(valid, form, event){ - //if there's no event, then this wasn't a submit event - if (!event) return; - var fv = this.element.retrieve('validator'); - if (valid || (fv && !fv.options.stopOnFailure)){ - event.stop(); - this.send(); - } - }, - - onSubmit: function(event){ - var fv = this.element.retrieve('validator'); - if (fv){ - //form validator was created after Form.Request - this.element.removeEvent('submit', this.onSubmit); - fv.addEvent('onFormValidate', this.onFormValidate); - fv.validate(event); - return; - } - if (event) event.stop(); - this.send(); - }, - - saveClickedButton: function(event, target){ - var targetName = target.get('name'); - if (!targetName || !this.options.sendButtonClicked) return; - this.options.extraData[targetName] = target.get('value') || true; - this.clickedCleaner = function(){ - delete this.options.extraData[targetName]; - this.clickedCleaner = function(){}; - }.bind(this); - }, - - clickedCleaner: function(){}, - - send: function(){ - var str = this.element.toQueryString().trim(), - data = Object.toQueryString(this.options.extraData); - - if (str) str += "&" + data; - else str = data; - - this.fireEvent('send', [this.element, str.parseQueryString()]); - this.request.send({ - data: str, - url: this.options.requestOptions.url || this.element.get('action') - }); - this.clickedCleaner(); - return this; - } - - }); - - Element.implement('formUpdate', function(update, options){ - var fq = this.retrieve('form.request'); - if (!fq){ - fq = new Form.Request(this, update, options); - } else { - if (update) fq.setTarget(update); - if (options) fq.setOptions(options).makeRequest(); - } - fq.send(); - return this; - }); - -})(); - - -/* ---- - -script: Element.Shortcuts.js - -name: Element.Shortcuts - -description: Extends the Element native object to include some shortcut methods. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Element.Style - - MooTools.More - -provides: [Element.Shortcuts] - -... -*/ - -Element.implement({ - - isDisplayed: function(){ - return this.getStyle('display') != 'none'; - }, - - isVisible: function(){ - var w = this.offsetWidth, - h = this.offsetHeight; - return (w == 0 && h == 0) ? false : (w > 0 && h > 0) ? true : this.style.display != 'none'; - }, - - toggle: function(){ - return this[this.isDisplayed() ? 'hide' : 'show'](); - }, - - hide: function(){ - var d; - try { - //IE fails here if the element is not in the dom - d = this.getStyle('display'); - } catch(e){} - if (d == 'none') return this; - return this.store('element:_originalDisplay', d || '').setStyle('display', 'none'); - }, - - show: function(display){ - if (!display && this.isDisplayed()) return this; - display = display || this.retrieve('element:_originalDisplay') || 'block'; - return this.setStyle('display', (display == 'none') ? 'block' : display); - }, - - swapClass: function(remove, add){ - return this.removeClass(remove).addClass(add); - } - -}); - -Document.implement({ - - clearSelection: function(){ - if (window.getSelection){ - var selection = window.getSelection(); - if (selection && selection.removeAllRanges) selection.removeAllRanges(); - } else if (document.selection && document.selection.empty){ - try { - //IE fails here if selected element is not in dom - document.selection.empty(); - } catch(e){} - } - } - -}); - - -/* ---- - -script: Fx.Reveal.js - -name: Fx.Reveal - -description: Defines Fx.Reveal, a class that shows and hides elements with a transition. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Fx.Morph - - Element.Shortcuts - - Element.Measure - -provides: [Fx.Reveal] - -... -*/ - -(function(){ - - -var hideTheseOf = function(object){ - var hideThese = object.options.hideInputs; - if (window.OverText){ - var otClasses = [null]; - OverText.each(function(ot){ - otClasses.include('.' + ot.options.labelClass); - }); - if (otClasses) hideThese += otClasses.join(', '); - } - return (hideThese) ? object.element.getElements(hideThese) : null; -}; - - -Fx.Reveal = new Class({ - - Extends: Fx.Morph, - - options: {/* - onShow: function(thisElement){}, - onHide: function(thisElement){}, - onComplete: function(thisElement){}, - heightOverride: null, - widthOverride: null,*/ - link: 'cancel', - styles: ['padding', 'border', 'margin'], - transitionOpacity: 'opacity' in document.documentElement, - mode: 'vertical', - display: function(){ - return this.element.get('tag') != 'tr' ? 'block' : 'table-row'; - }, - opacity: 1, - hideInputs: !('opacity' in document.documentElement) ? 'select, input, textarea, object, embed' : null - }, - - dissolve: function(){ - if (!this.hiding && !this.showing){ - if (this.element.getStyle('display') != 'none'){ - this.hiding = true; - this.showing = false; - this.hidden = true; - this.cssText = this.element.style.cssText; - - var startStyles = this.element.getComputedSize({ - styles: this.options.styles, - mode: this.options.mode - }); - if (this.options.transitionOpacity) startStyles.opacity = this.options.opacity; - - var zero = {}; - Object.each(startStyles, function(style, name){ - zero[name] = [style, 0]; - }); - - this.element.setStyles({ - display: Function.from(this.options.display).call(this), - overflow: 'hidden' - }); - - var hideThese = hideTheseOf(this); - if (hideThese) hideThese.setStyle('visibility', 'hidden'); - - this.$chain.unshift(function(){ - if (this.hidden){ - this.hiding = false; - this.element.style.cssText = this.cssText; - this.element.setStyle('display', 'none'); - if (hideThese) hideThese.setStyle('visibility', 'visible'); - } - this.fireEvent('hide', this.element); - this.callChain(); - }.bind(this)); - - this.start(zero); - } else { - this.callChain.delay(10, this); - this.fireEvent('complete', this.element); - this.fireEvent('hide', this.element); - } - } else if (this.options.link == 'chain'){ - this.chain(this.dissolve.bind(this)); - } else if (this.options.link == 'cancel' && !this.hiding){ - this.cancel(); - this.dissolve(); - } - return this; - }, - - reveal: function(){ - if (!this.showing && !this.hiding){ - if (this.element.getStyle('display') == 'none'){ - this.hiding = false; - this.showing = true; - this.hidden = false; - this.cssText = this.element.style.cssText; - - var startStyles; - this.element.measure(function(){ - startStyles = this.element.getComputedSize({ - styles: this.options.styles, - mode: this.options.mode - }); - }.bind(this)); - if (this.options.heightOverride != null) startStyles.height = this.options.heightOverride.toInt(); - if (this.options.widthOverride != null) startStyles.width = this.options.widthOverride.toInt(); - if (this.options.transitionOpacity){ - this.element.setStyle('opacity', 0); - startStyles.opacity = this.options.opacity; - } - - var zero = { - height: 0, - display: Function.from(this.options.display).call(this) - }; - Object.each(startStyles, function(style, name){ - zero[name] = 0; - }); - zero.overflow = 'hidden'; - - this.element.setStyles(zero); - - var hideThese = hideTheseOf(this); - if (hideThese) hideThese.setStyle('visibility', 'hidden'); - - this.$chain.unshift(function(){ - this.element.style.cssText = this.cssText; - this.element.setStyle('display', Function.from(this.options.display).call(this)); - if (!this.hidden) this.showing = false; - if (hideThese) hideThese.setStyle('visibility', 'visible'); - this.callChain(); - this.fireEvent('show', this.element); - }.bind(this)); - - this.start(startStyles); - } else { - this.callChain(); - this.fireEvent('complete', this.element); - this.fireEvent('show', this.element); - } - } else if (this.options.link == 'chain'){ - this.chain(this.reveal.bind(this)); - } else if (this.options.link == 'cancel' && !this.showing){ - this.cancel(); - this.reveal(); - } - return this; - }, - - toggle: function(){ - if (this.element.getStyle('display') == 'none'){ - this.reveal(); - } else { - this.dissolve(); - } - return this; - }, - - cancel: function(){ - this.parent.apply(this, arguments); - if (this.cssText != null) this.element.style.cssText = this.cssText; - this.hiding = false; - this.showing = false; - return this; - } - -}); - -Element.Properties.reveal = { - - set: function(options){ - this.get('reveal').cancel().setOptions(options); - return this; - }, - - get: function(){ - var reveal = this.retrieve('reveal'); - if (!reveal){ - reveal = new Fx.Reveal(this); - this.store('reveal', reveal); - } - return reveal; - } - -}; - -Element.Properties.dissolve = Element.Properties.reveal; - -Element.implement({ - - reveal: function(options){ - this.get('reveal').setOptions(options).reveal(); - return this; - }, - - dissolve: function(options){ - this.get('reveal').setOptions(options).dissolve(); - return this; - }, - - nix: function(options){ - var params = Array.link(arguments, {destroy: Type.isBoolean, options: Type.isObject}); - this.get('reveal').setOptions(options).dissolve().chain(function(){ - this[params.destroy ? 'destroy' : 'dispose'](); - }.bind(this)); - return this; - }, - - wink: function(){ - var params = Array.link(arguments, {duration: Type.isNumber, options: Type.isObject}); - var reveal = this.get('reveal').setOptions(params.options); - reveal.reveal().chain(function(){ - (function(){ - reveal.dissolve(); - }).delay(params.duration || 2000); - }); - } - -}); - -})(); - - -/* ---- - -script: Drag.js - -name: Drag - -description: The base Drag Class. Can be used to drag and resize Elements using mouse events. - -license: MIT-style license - -authors: - - Valerio Proietti - - Tom Occhinno - - Jan Kassens - -requires: - - Core/Events - - Core/Options - - Core/Element.Event - - Core/Element.Style - - Core/Element.Dimensions - - MooTools.More - -provides: [Drag] -... - -*/ - -var Drag = new Class({ - - Implements: [Events, Options], - - options: {/* - onBeforeStart: function(thisElement){}, - onStart: function(thisElement, event){}, - onSnap: function(thisElement){}, - onDrag: function(thisElement, event){}, - onCancel: function(thisElement){}, - onComplete: function(thisElement, event){},*/ - snap: 6, - unit: 'px', - grid: false, - style: true, - limit: false, - handle: false, - invert: false, - preventDefault: false, - stopPropagation: false, - modifiers: {x: 'left', y: 'top'} - }, - - initialize: function(){ - var params = Array.link(arguments, { - 'options': Type.isObject, - 'element': function(obj){ - return obj != null; - } - }); - - this.element = document.id(params.element); - this.document = this.element.getDocument(); - this.setOptions(params.options || {}); - var htype = typeOf(this.options.handle); - this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element; - this.mouse = {'now': {}, 'pos': {}}; - this.value = {'start': {}, 'now': {}}; - - this.selection = 'selectstart' in document ? 'selectstart' : 'mousedown'; - - - if ('ondragstart' in document && !('FileReader' in window) && !Drag.ondragstartFixed){ - document.ondragstart = Function.from(false); - Drag.ondragstartFixed = true; - } - - this.bound = { - start: this.start.bind(this), - check: this.check.bind(this), - drag: this.drag.bind(this), - stop: this.stop.bind(this), - cancel: this.cancel.bind(this), - eventStop: Function.from(false) - }; - this.attach(); - }, - - attach: function(){ - this.handles.addEvent('mousedown', this.bound.start); - return this; - }, - - detach: function(){ - this.handles.removeEvent('mousedown', this.bound.start); - return this; - }, - - start: function(event){ - var options = this.options; - - if (event.rightClick) return; - - if (options.preventDefault) event.preventDefault(); - if (options.stopPropagation) event.stopPropagation(); - this.mouse.start = event.page; - - this.fireEvent('beforeStart', this.element); - - var limit = options.limit; - this.limit = {x: [], y: []}; - - var z, coordinates; - for (z in options.modifiers){ - if (!options.modifiers[z]) continue; - - var style = this.element.getStyle(options.modifiers[z]); - - // Some browsers (IE and Opera) don't always return pixels. - if (style && !style.match(/px$/)){ - if (!coordinates) coordinates = this.element.getCoordinates(this.element.getOffsetParent()); - style = coordinates[options.modifiers[z]]; - } - - if (options.style) this.value.now[z] = (style || 0).toInt(); - else this.value.now[z] = this.element[options.modifiers[z]]; - - if (options.invert) this.value.now[z] *= -1; - - this.mouse.pos[z] = event.page[z] - this.value.now[z]; - - if (limit && limit[z]){ - var i = 2; - while (i--){ - var limitZI = limit[z][i]; - if (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI == 'function') ? limitZI() : limitZI; - } - } - } - - if (typeOf(this.options.grid) == 'number') this.options.grid = { - x: this.options.grid, - y: this.options.grid - }; - - var events = { - mousemove: this.bound.check, - mouseup: this.bound.cancel - }; - events[this.selection] = this.bound.eventStop; - this.document.addEvents(events); - }, - - check: function(event){ - if (this.options.preventDefault) event.preventDefault(); - var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2))); - if (distance > this.options.snap){ - this.cancel(); - this.document.addEvents({ - mousemove: this.bound.drag, - mouseup: this.bound.stop - }); - this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element); - } - }, - - drag: function(event){ - var options = this.options; - - if (options.preventDefault) event.preventDefault(); - this.mouse.now = event.page; - - for (var z in options.modifiers){ - if (!options.modifiers[z]) continue; - this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z]; - - if (options.invert) this.value.now[z] *= -1; - - if (options.limit && this.limit[z]){ - if ((this.limit[z][1] || this.limit[z][1] === 0) && (this.value.now[z] > this.limit[z][1])){ - this.value.now[z] = this.limit[z][1]; - } else if ((this.limit[z][0] || this.limit[z][0] === 0) && (this.value.now[z] < this.limit[z][0])){ - this.value.now[z] = this.limit[z][0]; - } - } - - if (options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % options.grid[z]); - - if (options.style) this.element.setStyle(options.modifiers[z], this.value.now[z] + options.unit); - else this.element[options.modifiers[z]] = this.value.now[z]; - } - - this.fireEvent('drag', [this.element, event]); - }, - - cancel: function(event){ - this.document.removeEvents({ - mousemove: this.bound.check, - mouseup: this.bound.cancel - }); - if (event){ - this.document.removeEvent(this.selection, this.bound.eventStop); - this.fireEvent('cancel', this.element); - } - }, - - stop: function(event){ - var events = { - mousemove: this.bound.drag, - mouseup: this.bound.stop - }; - events[this.selection] = this.bound.eventStop; - this.document.removeEvents(events); - if (event) this.fireEvent('complete', [this.element, event]); - } - -}); - -Element.implement({ - - makeResizable: function(options){ - var drag = new Drag(this, Object.merge({ - modifiers: { - x: 'width', - y: 'height' - } - }, options)); - - this.store('resizer', drag); - return drag.addEvent('drag', function(){ - this.fireEvent('resize', drag); - }.bind(this)); - } - -}); - - -/* ---- - -script: Drag.Move.js - -name: Drag.Move - -description: A Drag extension that provides support for the constraining of draggables to containers and droppables. - -license: MIT-style license - -authors: - - Valerio Proietti - - Tom Occhinno - - Jan Kassens - - Aaron Newton - - Scott Kyle - -requires: - - Core/Element.Dimensions - - Drag - -provides: [Drag.Move] - -... -*/ - -Drag.Move = new Class({ - - Extends: Drag, - - options: {/* - onEnter: function(thisElement, overed){}, - onLeave: function(thisElement, overed){}, - onDrop: function(thisElement, overed, event){},*/ - droppables: [], - container: false, - precalculate: false, - includeMargins: true, - checkDroppables: true - }, - - initialize: function(element, options){ - this.parent(element, options); - element = this.element; - - this.droppables = $$(this.options.droppables); - this.setContainer(this.options.container); - - if (this.options.style){ - if (this.options.modifiers.x == 'left' && this.options.modifiers.y == 'top'){ - var parent = element.getOffsetParent(), - styles = element.getStyles('left', 'top'); - if (parent && (styles.left == 'auto' || styles.top == 'auto')){ - element.setPosition(element.getPosition(parent)); - } - } - - if (element.getStyle('position') == 'static') element.setStyle('position', 'absolute'); - } - - this.addEvent('start', this.checkDroppables, true); - this.overed = null; - }, - - setContainer: function(container) { - this.container = document.id(container); - if (this.container && typeOf(this.container) != 'element'){ - this.container = document.id(this.container.getDocument().body); - } - }, - - start: function(event){ - if (this.container) this.options.limit = this.calculateLimit(); - - if (this.options.precalculate){ - this.positions = this.droppables.map(function(el){ - return el.getCoordinates(); - }); - } - - this.parent(event); - }, - - calculateLimit: function(){ - var element = this.element, - container = this.container, - - offsetParent = document.id(element.getOffsetParent()) || document.body, - containerCoordinates = container.getCoordinates(offsetParent), - elementMargin = {}, - elementBorder = {}, - containerMargin = {}, - containerBorder = {}, - offsetParentPadding = {}; - - ['top', 'right', 'bottom', 'left'].each(function(pad){ - elementMargin[pad] = element.getStyle('margin-' + pad).toInt(); - elementBorder[pad] = element.getStyle('border-' + pad).toInt(); - containerMargin[pad] = container.getStyle('margin-' + pad).toInt(); - containerBorder[pad] = container.getStyle('border-' + pad).toInt(); - offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt(); - }, this); - - var width = element.offsetWidth + elementMargin.left + elementMargin.right, - height = element.offsetHeight + elementMargin.top + elementMargin.bottom, - left = 0, - top = 0, - right = containerCoordinates.right - containerBorder.right - width, - bottom = containerCoordinates.bottom - containerBorder.bottom - height; - - if (this.options.includeMargins){ - left += elementMargin.left; - top += elementMargin.top; - } else { - right += elementMargin.right; - bottom += elementMargin.bottom; - } - - if (element.getStyle('position') == 'relative'){ - var coords = element.getCoordinates(offsetParent); - coords.left -= element.getStyle('left').toInt(); - coords.top -= element.getStyle('top').toInt(); - - left -= coords.left; - top -= coords.top; - if (container.getStyle('position') != 'relative'){ - left += containerBorder.left; - top += containerBorder.top; - } - right += elementMargin.left - coords.left; - bottom += elementMargin.top - coords.top; - - if (container != offsetParent){ - left += containerMargin.left + offsetParentPadding.left; - if (!offsetParentPadding.left && left < 0) left = 0; - top += offsetParent == document.body ? 0 : containerMargin.top + offsetParentPadding.top; - if (!offsetParentPadding.top && top < 0) top = 0; - } - } else { - left -= elementMargin.left; - top -= elementMargin.top; - if (container != offsetParent){ - left += containerCoordinates.left + containerBorder.left; - top += containerCoordinates.top + containerBorder.top; - } - } - - return { - x: [left, right], - y: [top, bottom] - }; - }, - - getDroppableCoordinates: function(element){ - var position = element.getCoordinates(); - if (element.getStyle('position') == 'fixed'){ - var scroll = window.getScroll(); - position.left += scroll.x; - position.right += scroll.x; - position.top += scroll.y; - position.bottom += scroll.y; - } - return position; - }, - - checkDroppables: function(){ - var overed = this.droppables.filter(function(el, i){ - el = this.positions ? this.positions[i] : this.getDroppableCoordinates(el); - var now = this.mouse.now; - return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top); - }, this).getLast(); - - if (this.overed != overed){ - if (this.overed) this.fireEvent('leave', [this.element, this.overed]); - if (overed) this.fireEvent('enter', [this.element, overed]); - this.overed = overed; - } - }, - - drag: function(event){ - this.parent(event); - if (this.options.checkDroppables && this.droppables.length) this.checkDroppables(); - }, - - stop: function(event){ - this.checkDroppables(); - this.fireEvent('drop', [this.element, this.overed, event]); - this.overed = null; - return this.parent(event); - } - -}); - -Element.implement({ - - makeDraggable: function(options){ - var drag = new Drag.Move(this, options); - this.store('dragger', drag); - return drag; - } - -}); - - -/* ---- - -script: Sortables.js - -name: Sortables - -description: Class for creating a drag and drop sorting interface for lists of items. - -license: MIT-style license - -authors: - - Tom Occhino - -requires: - - Core/Fx.Morph - - Drag.Move - -provides: [Sortables] - -... -*/ - -var Sortables = new Class({ - - Implements: [Events, Options], - - options: {/* - onSort: function(element, clone){}, - onStart: function(element, clone){}, - onComplete: function(element){},*/ - opacity: 1, - clone: false, - revert: false, - handle: false, - dragOptions: {}, - unDraggableTags: ['button', 'input', 'a', 'textarea', 'select', 'option'] - }, - - initialize: function(lists, options){ - this.setOptions(options); - - this.elements = []; - this.lists = []; - this.idle = true; - - this.addLists($$(document.id(lists) || lists)); - - if (!this.options.clone) this.options.revert = false; - if (this.options.revert) this.effect = new Fx.Morph(null, Object.merge({ - duration: 250, - link: 'cancel' - }, this.options.revert)); - }, - - attach: function(){ - this.addLists(this.lists); - return this; - }, - - detach: function(){ - this.lists = this.removeLists(this.lists); - return this; - }, - - addItems: function(){ - Array.flatten(arguments).each(function(element){ - this.elements.push(element); - var start = element.retrieve('sortables:start', function(event){ - this.start.call(this, event, element); - }.bind(this)); - (this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start); - }, this); - return this; - }, - - addLists: function(){ - Array.flatten(arguments).each(function(list){ - this.lists.include(list); - this.addItems(list.getChildren()); - }, this); - return this; - }, - - removeItems: function(){ - return $$(Array.flatten(arguments).map(function(element){ - this.elements.erase(element); - var start = element.retrieve('sortables:start'); - (this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start); - - return element; - }, this)); - }, - - removeLists: function(){ - return $$(Array.flatten(arguments).map(function(list){ - this.lists.erase(list); - this.removeItems(list.getChildren()); - - return list; - }, this)); - }, - - getDroppableCoordinates: function (element){ - var offsetParent = element.getOffsetParent(); - var position = element.getPosition(offsetParent); - var scroll = { - w: window.getScroll(), - offsetParent: offsetParent.getScroll() - }; - position.x += scroll.offsetParent.x; - position.y += scroll.offsetParent.y; - - if (offsetParent.getStyle('position') == 'fixed'){ - position.x -= scroll.w.x; - position.y -= scroll.w.y; - } - - return position; - }, - - getClone: function(event, element){ - if (!this.options.clone) return new Element(element.tagName).inject(document.body); - if (typeOf(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list); - var clone = element.clone(true).setStyles({ - margin: 0, - position: 'absolute', - visibility: 'hidden', - width: element.getStyle('width') - }).addEvent('mousedown', function(event){ - element.fireEvent('mousedown', event); - }); - //prevent the duplicated radio inputs from unchecking the real one - if (clone.get('html').test('radio')){ - clone.getElements('input[type=radio]').each(function(input, i){ - input.set('name', 'clone_' + i); - if (input.get('checked')) element.getElements('input[type=radio]')[i].set('checked', true); - }); - } - - return clone.inject(this.list).setPosition(this.getDroppableCoordinates(this.element)); - }, - - getDroppables: function(){ - var droppables = this.list.getChildren().erase(this.clone).erase(this.element); - if (!this.options.constrain) droppables.append(this.lists).erase(this.list); - return droppables; - }, - - insert: function(dragging, element){ - var where = 'inside'; - if (this.lists.contains(element)){ - this.list = element; - this.drag.droppables = this.getDroppables(); - } else { - where = this.element.getAllPrevious().contains(element) ? 'before' : 'after'; - } - this.element.inject(element, where); - this.fireEvent('sort', [this.element, this.clone]); - }, - - start: function(event, element){ - if ( - !this.idle || - event.rightClick || - (!this.options.handle && this.options.unDraggableTags.contains(event.target.get('tag'))) - ) return; - - this.idle = false; - this.element = element; - this.opacity = element.getStyle('opacity'); - this.list = element.getParent(); - this.clone = this.getClone(event, element); - - this.drag = new Drag.Move(this.clone, Object.merge({ - - droppables: this.getDroppables() - }, this.options.dragOptions)).addEvents({ - onSnap: function(){ - event.stop(); - this.clone.setStyle('visibility', 'visible'); - this.element.setStyle('opacity', this.options.opacity || 0); - this.fireEvent('start', [this.element, this.clone]); - }.bind(this), - onEnter: this.insert.bind(this), - onCancel: this.end.bind(this), - onComplete: this.end.bind(this) - }); - - this.clone.inject(this.element, 'before'); - this.drag.start(event); - }, - - end: function(){ - this.drag.detach(); - this.element.setStyle('opacity', this.opacity); - var self = this; - if (this.effect){ - var dim = this.element.getStyles('width', 'height'), - clone = this.clone, - pos = clone.computePosition(this.getDroppableCoordinates(clone)); - - var destroy = function(){ - this.removeEvent('cancel', destroy); - clone.destroy(); - self.reset(); - }; - - this.effect.element = clone; - this.effect.start({ - top: pos.top, - left: pos.left, - width: dim.width, - height: dim.height, - opacity: 0.25 - }).addEvent('cancel', destroy).chain(destroy); - } else { - this.clone.destroy(); - self.reset(); - } - - }, - - reset: function(){ - this.idle = true; - this.fireEvent('complete', this.element); - }, - - serialize: function(){ - var params = Array.link(arguments, { - modifier: Type.isFunction, - index: function(obj){ - return obj != null; - } - }); - var serial = this.lists.map(function(list){ - return list.getChildren().map(params.modifier || function(element){ - return element.get('id'); - }, this); - }, this); - - var index = params.index; - if (this.lists.length == 1) index = 0; - return (index || index === 0) && index >= 0 && index < this.lists.length ? serial[index] : serial; - } - -}); - - -/* ---- - -script: Request.Periodical.js - -name: Request.Periodical - -description: Requests the same URL to pull data from a server but increases the intervals if no data is returned to reduce the load - -license: MIT-style license - -authors: - - Christoph Pojer - -requires: - - Core/Request - - MooTools.More - -provides: [Request.Periodical] - -... -*/ - -Request.implement({ - - options: { - initialDelay: 5000, - delay: 5000, - limit: 60000 - }, - - startTimer: function(data){ - var fn = function(){ - if (!this.running) this.send({data: data}); - }; - this.lastDelay = this.options.initialDelay; - this.timer = fn.delay(this.lastDelay, this); - this.completeCheck = function(response){ - clearTimeout(this.timer); - this.lastDelay = (response) ? this.options.delay : (this.lastDelay + this.options.delay).min(this.options.limit); - this.timer = fn.delay(this.lastDelay, this); - }; - return this.addEvent('complete', this.completeCheck); - }, - - stopTimer: function(){ - clearTimeout(this.timer); - return this.removeEvent('complete', this.completeCheck); - } - -}); - - -/* ---- - -script: Color.js - -name: Color - -description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa. - -license: MIT-style license - -authors: - - Valerio Proietti - -requires: - - Core/Array - - Core/String - - Core/Number - - Core/Hash - - Core/Function - - MooTools.More - -provides: [Color] - -... -*/ - -(function(){ - -var Color = this.Color = new Type('Color', function(color, type){ - if (arguments.length >= 3){ - type = 'rgb'; color = Array.slice(arguments, 0, 3); - } else if (typeof color == 'string'){ - if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true); - else if (color.match(/hsb/)) color = color.hsbToRgb(); - else color = color.hexToRgb(true); - } - type = type || 'rgb'; - switch (type){ - case 'hsb': - var old = color; - color = color.hsbToRgb(); - color.hsb = old; - break; - case 'hex': color = color.hexToRgb(true); break; - } - color.rgb = color.slice(0, 3); - color.hsb = color.hsb || color.rgbToHsb(); - color.hex = color.rgbToHex(); - return Object.append(color, this); -}); - -Color.implement({ - - mix: function(){ - var colors = Array.slice(arguments); - var alpha = (typeOf(colors.getLast()) == 'number') ? colors.pop() : 50; - var rgb = this.slice(); - colors.each(function(color){ - color = new Color(color); - for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha)); - }); - return new Color(rgb, 'rgb'); - }, - - invert: function(){ - return new Color(this.map(function(value){ - return 255 - value; - })); - }, - - setHue: function(value){ - return new Color([value, this.hsb[1], this.hsb[2]], 'hsb'); - }, - - setSaturation: function(percent){ - return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb'); - }, - - setBrightness: function(percent){ - return new Color([this.hsb[0], this.hsb[1], percent], 'hsb'); - } - -}); - -this.$RGB = function(r, g, b){ - return new Color([r, g, b], 'rgb'); -}; - -this.$HSB = function(h, s, b){ - return new Color([h, s, b], 'hsb'); -}; - -this.$HEX = function(hex){ - return new Color(hex, 'hex'); -}; - -Array.implement({ - - rgbToHsb: function(){ - var red = this[0], - green = this[1], - blue = this[2], - hue = 0; - var max = Math.max(red, green, blue), - min = Math.min(red, green, blue); - var delta = max - min; - var brightness = max / 255, - saturation = (max != 0) ? delta / max : 0; - if (saturation != 0){ - var rr = (max - red) / delta; - var gr = (max - green) / delta; - var br = (max - blue) / delta; - if (red == max) hue = br - gr; - else if (green == max) hue = 2 + rr - br; - else hue = 4 + gr - rr; - hue /= 6; - if (hue < 0) hue++; - } - return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)]; - }, - - hsbToRgb: function(){ - var br = Math.round(this[2] / 100 * 255); - if (this[1] == 0){ - return [br, br, br]; - } else { - var hue = this[0] % 360; - var f = hue % 60; - var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255); - var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255); - var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255); - switch (Math.floor(hue / 60)){ - case 0: return [br, t, p]; - case 1: return [q, br, p]; - case 2: return [p, br, t]; - case 3: return [p, q, br]; - case 4: return [t, p, br]; - case 5: return [br, p, q]; - } - } - return false; - } - -}); - -String.implement({ - - rgbToHsb: function(){ - var rgb = this.match(/\d{1,3}/g); - return (rgb) ? rgb.rgbToHsb() : null; - }, - - hsbToRgb: function(){ - var hsb = this.match(/\d{1,3}/g); - return (hsb) ? hsb.hsbToRgb() : null; - } - -}); - -})(); - - diff --git a/module/webui/themes/default/js/static/mootools-more.min.js b/module/webui/themes/default/js/static/mootools-more.min.js deleted file mode 100644 index ce03a60fd..000000000 --- a/module/webui/themes/default/js/static/mootools-more.min.js +++ /dev/null @@ -1,226 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/more/c1cc18c2fff04bcc58921b4dff80a6f1 - -packager build: - - packager build More/Form.Request More/Fx.Reveal More/Sortables More/Request.Periodical More/Color - -copyrights: - - [MooTools](http://mootools.net) - -licenses: - - [MIT License](http://mootools.net/license.txt) -... -*/ - -MooTools.More={version:"1.5.0",build:"73db5e24e6e9c5c87b3a27aebef2248053f7db37"};Class.Mutators.Binds=function(a){if(!this.prototype.initialize){this.implement("initialize",function(){}); -}return Array.from(a).concat(this.prototype.Binds||[]);};Class.Mutators.initialize=function(a){return function(){Array.from(this.Binds).each(function(b){var c=this[b]; -if(c){this[b]=c.bind(this);}},this);return a.apply(this,arguments);};};Class.Occlude=new Class({occlude:function(c,b){b=document.id(b||this.element);var a=b.retrieve(c||this.property); -if(a&&!this.occluded){return(this.occluded=a);}this.occluded=false;b.store(c||this.property,this);return this.occluded;}});Class.refactor=function(b,a){Object.each(a,function(e,d){var c=b.prototype[d]; -c=(c&&c.$origin)||c||function(){};b.implement(d,(typeof e=="function")?function(){var f=this.previous;this.previous=c;var g=e.apply(this,arguments);this.previous=f; -return g;}:e);});return b;};(function(){var b=function(e,d){var f=[];Object.each(d,function(g){Object.each(g,function(h){e.each(function(i){f.push(i+"-"+h+(i=="border"?"-width":"")); -});});});return f;};var c=function(f,e){var d=0;Object.each(e,function(h,g){if(g.test(f)){d=d+h.toInt();}});return d;};var a=function(d){return !!(!d||d.offsetHeight||d.offsetWidth); -};Element.implement({measure:function(h){if(a(this)){return h.call(this);}var g=this.getParent(),e=[];while(!a(g)&&g!=document.body){e.push(g.expose()); -g=g.getParent();}var f=this.expose(),d=h.call(this);f();e.each(function(i){i();});return d;},expose:function(){if(this.getStyle("display")!="none"){return function(){}; -}var d=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=d;}.bind(this); -},getDimensions:function(d){d=Object.merge({computeSize:false},d);var i={x:0,y:0};var h=function(j,e){return(e.computeSize)?j.getComputedSize(e):j.getSize(); -};var f=this.getParent("body");if(f&&this.getStyle("display")=="none"){i=this.measure(function(){return h(this,d);});}else{if(f){try{i=h(this,d);}catch(g){}}}return Object.append(i,(i.x||i.x===0)?{width:i.x,height:i.y}:{x:i.width,y:i.height}); -},getComputedSize:function(d){d=Object.merge({styles:["padding","border"],planes:{height:["top","bottom"],width:["left","right"]},mode:"both"},d);var g={},e={width:0,height:0},f; -if(d.mode=="vertical"){delete e.width;delete d.planes.width;}else{if(d.mode=="horizontal"){delete e.height;delete d.planes.height;}}b(d.styles,d.planes).each(function(h){g[h]=this.getStyle(h).toInt(); -},this);Object.each(d.planes,function(i,h){var k=h.capitalize(),j=this.getStyle(h);if(j=="auto"&&!f){f=this.getDimensions();}j=g[h]=(j=="auto")?f[h]:j.toInt(); -e["total"+k]=j;i.each(function(m){var l=c(m,g);e["computed"+m.capitalize()]=l;e["total"+k]+=l;});},this);return Object.append(e,g);}});})();(function(b){var a=Element.Position={options:{relativeTo:document.body,position:{x:"center",y:"center"},offset:{x:0,y:0}},getOptions:function(d,c){c=Object.merge({},a.options,c); -a.setPositionOption(c);a.setEdgeOption(c);a.setOffsetOption(d,c);a.setDimensionsOption(d,c);return c;},setPositionOption:function(c){c.position=a.getCoordinateFromValue(c.position); -},setEdgeOption:function(d){var c=a.getCoordinateFromValue(d.edge);d.edge=c?c:(d.position.x=="center"&&d.position.y=="center")?{x:"center",y:"center"}:{x:"left",y:"top"}; -},setOffsetOption:function(f,d){var c={x:0,y:0};var e={x:0,y:0};var g=f.measure(function(){return document.id(this.getOffsetParent());});if(!g||g==f.getDocument().body){return; -}e=g.getScroll();c=g.measure(function(){var i=this.getPosition();if(this.getStyle("position")=="fixed"){var h=window.getScroll();i.x+=h.x;i.y+=h.y;}return i; -});d.offset={parentPositioned:g!=document.id(d.relativeTo),x:d.offset.x-c.x+e.x,y:d.offset.y-c.y+e.y};},setDimensionsOption:function(d,c){c.dimensions=d.getDimensions({computeSize:true,styles:["padding","border","margin"]}); -},getPosition:function(e,d){var c={};d=a.getOptions(e,d);var f=document.id(d.relativeTo)||document.body;a.setPositionCoordinates(d,c,f);if(d.edge){a.toEdge(c,d); -}var g=d.offset;c.left=((c.x>=0||g.parentPositioned||d.allowNegative)?c.x:0).toInt();c.top=((c.y>=0||g.parentPositioned||d.allowNegative)?c.y:0).toInt(); -a.toMinMax(c,d);if(d.relFixedPosition||f.getStyle("position")=="fixed"){a.toRelFixedPosition(f,c);}if(d.ignoreScroll){a.toIgnoreScroll(f,c);}if(d.ignoreMargins){a.toIgnoreMargins(c,d); -}c.left=Math.ceil(c.left);c.top=Math.ceil(c.top);delete c.x;delete c.y;return c;},setPositionCoordinates:function(k,g,d){var f=k.offset.y,h=k.offset.x,e=(d==document.body)?window.getScroll():d.getPosition(),j=e.y,c=e.x,i=window.getSize(); -switch(k.position.x){case"left":g.x=c+h;break;case"right":g.x=c+h+d.offsetWidth;break;default:g.x=c+((d==document.body?i.x:d.offsetWidth)/2)+h;break;}switch(k.position.y){case"top":g.y=j+f; -break;case"bottom":g.y=j+f+d.offsetHeight;break;default:g.y=j+((d==document.body?i.y:d.offsetHeight)/2)+f;break;}},toMinMax:function(c,d){var f={left:"x",top:"y"},e; -["minimum","maximum"].each(function(g){["left","top"].each(function(h){e=d[g]?d[g][f[h]]:null;if(e!=null&&((g=="minimum")?c[h]e)){c[h]=e;}});}); -},toRelFixedPosition:function(e,c){var d=window.getScroll();c.top+=d.y;c.left+=d.x;},toIgnoreScroll:function(e,d){var c=e.getScroll();d.top-=c.y;d.left-=c.x; -},toIgnoreMargins:function(c,d){c.left+=d.edge.x=="right"?d.dimensions["margin-right"]:(d.edge.x!="center"?-d.dimensions["margin-left"]:-d.dimensions["margin-left"]+((d.dimensions["margin-right"]+d.dimensions["margin-left"])/2)); -c.top+=d.edge.y=="bottom"?d.dimensions["margin-bottom"]:(d.edge.y!="center"?-d.dimensions["margin-top"]:-d.dimensions["margin-top"]+((d.dimensions["margin-bottom"]+d.dimensions["margin-top"])/2)); -},toEdge:function(c,d){var e={},g=d.dimensions,f=d.edge;switch(f.x){case"left":e.x=0;break;case"right":e.x=-g.x-g.computedRight-g.computedLeft;break;default:e.x=-(Math.round(g.totalWidth/2)); -break;}switch(f.y){case"top":e.y=0;break;case"bottom":e.y=-g.y-g.computedTop-g.computedBottom;break;default:e.y=-(Math.round(g.totalHeight/2));break;}c.x+=e.x; -c.y+=e.y;},getCoordinateFromValue:function(c){if(typeOf(c)!="string"){return c;}c=c.toLowerCase();return{x:c.test("left")?"left":(c.test("right")?"right":"center"),y:c.test(/upper|top/)?"top":(c.test("bottom")?"bottom":"center")}; -}};Element.implement({position:function(d){if(d&&(d.x!=null||d.y!=null)){return(b?b.apply(this,arguments):this);}var c=this.setStyle("position","absolute").calculatePosition(d); -return(d&&d.returnPos)?c:this.setStyles(c);},calculatePosition:function(c){return a.getPosition(this,c);}});})(Element.prototype.position);(function(){var a=false; -this.IframeShim=new Class({Implements:[Options,Events,Class.Occlude],options:{className:"iframeShim",src:'javascript:false;document.write("");',display:false,zIndex:null,margin:0,offset:{x:0,y:0},browsers:a},property:"IframeShim",initialize:function(c,b){this.element=document.id(c); -if(this.occlude()){return this.occluded;}this.setOptions(b);this.makeShim();return this;},makeShim:function(){if(this.options.browsers){var d=this.element.getStyle("zIndex").toInt(); -if(!d){d=1;var c=this.element.getStyle("position");if(c=="static"||!c){this.element.setStyle("position","relative");}this.element.setStyle("zIndex",d); -}d=((this.options.zIndex!=null||this.options.zIndex===0)&&d>this.options.zIndex)?this.options.zIndex:d-1;if(d<0){d=1;}this.shim=new Element("iframe",{src:this.options.src,scrolling:"no",frameborder:0,styles:{zIndex:d,position:"absolute",border:"none",filter:"progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"},"class":this.options.className}).store("IframeShim",this); -var b=(function(){this.shim.inject(this.element,"after");this[this.options.display?"show":"hide"]();this.fireEvent("inject");}).bind(this);if(!IframeShim.ready){window.addEvent("load",b); -}else{b();}}else{this.position=this.hide=this.show=this.dispose=Function.from(this);}},position:function(){if(!IframeShim.ready||!this.shim){return this; -}var b=this.element.measure(function(){return this.getSize();});if(this.options.margin!=undefined){b.x=b.x-(this.options.margin*2);b.y=b.y-(this.options.margin*2); -this.options.offset.x+=this.options.margin;this.options.offset.y+=this.options.margin;}this.shim.set({width:b.x,height:b.y}).position({relativeTo:this.element,offset:this.options.offset}); -return this;},hide:function(){if(this.shim){this.shim.setStyle("display","none");}return this;},show:function(){if(this.shim){this.shim.setStyle("display","block"); -}return this.position();},dispose:function(){if(this.shim){this.shim.dispose();}return this;},destroy:function(){if(this.shim){this.shim.destroy();}return this; -}});})();window.addEvent("load",function(){IframeShim.ready=true;});var Mask=new Class({Implements:[Options,Events],Binds:["position"],options:{style:{},"class":"mask",maskMargins:false,useIframeShim:true,iframeShimOptions:{}},initialize:function(b,a){this.target=document.id(b)||document.id(document.body); -this.target.store("mask",this);this.setOptions(a);this.render();this.inject();},render:function(){this.element=new Element("div",{"class":this.options["class"],id:this.options.id||"mask-"+String.uniqueID(),styles:Object.merge({},this.options.style,{display:"none"}),events:{click:function(a){this.fireEvent("click",a); -if(this.options.hideOnClick){this.hide();}}.bind(this)}});this.hidden=true;},toElement:function(){return this.element;},inject:function(b,a){a=a||(this.options.inject?this.options.inject.where:"")||(this.target==document.body?"inside":"after"); -b=b||(this.options.inject&&this.options.inject.target)||this.target;this.element.inject(b,a);if(this.options.useIframeShim){this.shim=new IframeShim(this.element,this.options.iframeShimOptions); -this.addEvents({show:this.shim.show.bind(this.shim),hide:this.shim.hide.bind(this.shim),destroy:this.shim.destroy.bind(this.shim)});}},position:function(){this.resize(this.options.width,this.options.height); -this.element.position({relativeTo:this.target,position:"topLeft",ignoreMargins:!this.options.maskMargins,ignoreScroll:this.target==document.body});return this; -},resize:function(a,e){var b={styles:["padding","border"]};if(this.options.maskMargins){b.styles.push("margin");}var d=this.target.getComputedSize(b);if(this.target==document.body){this.element.setStyles({width:0,height:0}); -var c=window.getScrollSize();if(d.totalHeight0&&b>0)?true:this.style.display!="none";},toggle:function(){return this[this.isDisplayed()?"hide":"show"](); -},hide:function(){var b;try{b=this.getStyle("display");}catch(a){}if(b=="none"){return this;}return this.store("element:_originalDisplay",b||"").setStyle("display","none"); -},show:function(a){if(!a&&this.isDisplayed()){return this;}a=a||this.retrieve("element:_originalDisplay")||"block";return this.setStyle("display",(a=="none")?"block":a); -},swapClass:function(a,b){return this.removeClass(a).addClass(b);}});Document.implement({clearSelection:function(){if(window.getSelection){var a=window.getSelection(); -if(a&&a.removeAllRanges){a.removeAllRanges();}}else{if(document.selection&&document.selection.empty){try{document.selection.empty();}catch(b){}}}}});(function(){var a=function(d){var b=d.options.hideInputs; -if(window.OverText){var c=[null];OverText.each(function(e){c.include("."+e.options.labelClass);});if(c){b+=c.join(", ");}}return(b)?d.element.getElements(b):null; -};Fx.Reveal=new Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:"opacity" in document.documentElement,mode:"vertical",display:function(){return this.element.get("tag")!="tr"?"block":"table-row"; -},opacity:1,hideInputs:!("opacity" in document.documentElement)?"select, input, textarea, object, embed":null},dissolve:function(){if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true; -this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); -if(this.options.transitionOpacity){d.opacity=this.options.opacity;}var c={};Object.each(d,function(f,e){c[e]=[f,0];});this.element.setStyles({display:Function.from(this.options.display).call(this),overflow:"hidden"}); -var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){if(this.hidden){this.hiding=false;this.element.style.cssText=this.cssText; -this.element.setStyle("display","none");if(b){b.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);this.callChain();}.bind(this));this.start(c); -}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this)); -}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();this.dissolve();}}}return this;},reveal:function(){if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"){this.hiding=false; -this.showing=true;this.hidden=false;this.cssText=this.element.style.cssText;var d;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); -}.bind(this));if(this.options.heightOverride!=null){d.height=this.options.heightOverride.toInt();}if(this.options.widthOverride!=null){d.width=this.options.widthOverride.toInt(); -}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=this.options.opacity;}var c={height:0,display:Function.from(this.options.display).call(this)}; -Object.each(d,function(f,e){c[e]=0;});c.overflow="hidden";this.element.setStyles(c);var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){this.element.style.cssText=this.cssText; -this.element.setStyle("display",Function.from(this.options.display).call(this));if(!this.hidden){this.showing=false;}if(b){b.setStyle("visibility","visible"); -}this.callChain();this.fireEvent("show",this.element);}.bind(this));this.start(d);}else{this.callChain();this.fireEvent("complete",this.element);this.fireEvent("show",this.element); -}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();this.reveal(); -}}}return this;},toggle:function(){if(this.element.getStyle("display")=="none"){this.reveal();}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments); -if(this.cssText!=null){this.element.style.cssText=this.cssText;}this.hiding=false;this.showing=false;return this;}});Element.Properties.reveal={set:function(b){this.get("reveal").cancel().setOptions(b); -return this;},get:function(){var b=this.retrieve("reveal");if(!b){b=new Fx.Reveal(this);this.store("reveal",b);}return b;}};Element.Properties.dissolve=Element.Properties.reveal; -Element.implement({reveal:function(b){this.get("reveal").setOptions(b).reveal();return this;},dissolve:function(b){this.get("reveal").setOptions(b).dissolve(); -return this;},nix:function(b){var c=Array.link(arguments,{destroy:Type.isBoolean,options:Type.isObject});this.get("reveal").setOptions(b).dissolve().chain(function(){this[c.destroy?"destroy":"dispose"](); -}.bind(this));return this;},wink:function(){var c=Array.link(arguments,{duration:Type.isNumber,options:Type.isObject});var b=this.get("reveal").setOptions(c.options); -b.reveal().chain(function(){(function(){b.dissolve();}).delay(c.duration||2000);});}});})();var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var b=Array.link(arguments,{options:Type.isObject,element:function(c){return c!=null; -}});this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var a=typeOf(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element; -this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection="selectstart" in document?"selectstart":"mousedown";if("ondragstart" in document&&!("FileReader" in window)&&!Drag.ondragstartFixed){document.ondragstart=Function.from(false); -Drag.ondragstartFixed=true;}this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:Function.from(false)}; -this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start); -return this;},start:function(a){var j=this.options;if(a.rightClick){return;}if(j.preventDefault){a.preventDefault();}if(j.stopPropagation){a.stopPropagation(); -}this.mouse.start=a.page;this.fireEvent("beforeStart",this.element);var c=j.limit;this.limit={x:[],y:[]};var e,g;for(e in j.modifiers){if(!j.modifiers[e]){continue; -}var b=this.element.getStyle(j.modifiers[e]);if(b&&!b.match(/px$/)){if(!g){g=this.element.getCoordinates(this.element.getOffsetParent());}b=g[j.modifiers[e]]; -}if(j.style){this.value.now[e]=(b||0).toInt();}else{this.value.now[e]=this.element[j.modifiers[e]];}if(j.invert){this.value.now[e]*=-1;}this.mouse.pos[e]=a.page[e]-this.value.now[e]; -if(c&&c[e]){var d=2;while(d--){var f=c[e][d];if(f||f===0){this.limit[e][d]=(typeof f=="function")?f():f;}}}}if(typeOf(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid}; -}var h={mousemove:this.bound.check,mouseup:this.bound.cancel};h[this.selection]=this.bound.eventStop;this.document.addEvents(h);},check:function(a){if(this.options.preventDefault){a.preventDefault(); -}var b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop}); -this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element);}},drag:function(b){var a=this.options;if(a.preventDefault){b.preventDefault(); -}this.mouse.now=b.page;for(var c in a.modifiers){if(!a.modifiers[c]){continue;}this.value.now[c]=this.mouse.now[c]-this.mouse.pos[c];if(a.invert){this.value.now[c]*=-1; -}if(a.limit&&this.limit[c]){if((this.limit[c][1]||this.limit[c][1]===0)&&(this.value.now[c]>this.limit[c][1])){this.value.now[c]=this.limit[c][1];}else{if((this.limit[c][0]||this.limit[c][0]===0)&&(this.value.now[c]d.left&&b.xd.top);},this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed]); -}if(a){this.fireEvent("enter",[this.element,a]);}this.overed=a;}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables(); -}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return this.parent(a);}});Element.implement({makeDraggable:function(a){var b=new Drag.Move(this,a); -this.store("dragger",b);return b;}});var Sortables=new Class({Implements:[Events,Options],options:{opacity:1,clone:false,revert:false,handle:false,dragOptions:{},unDraggableTags:["button","input","a","textarea","select","option"]},initialize:function(a,b){this.setOptions(b); -this.elements=[];this.lists=[];this.idle=true;this.addLists($$(document.id(a)||a));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new Fx.Morph(null,Object.merge({duration:250,link:"cancel"},this.options.revert)); -}},attach:function(){this.addLists(this.lists);return this;},detach:function(){this.lists=this.removeLists(this.lists);return this;},addItems:function(){Array.flatten(arguments).each(function(a){this.elements.push(a); -var b=a.retrieve("sortables:start",function(c){this.start.call(this,c,a);}.bind(this));(this.options.handle?a.getElement(this.options.handle)||a:a).addEvent("mousedown",b); -},this);return this;},addLists:function(){Array.flatten(arguments).each(function(a){this.lists.include(a);this.addItems(a.getChildren());},this);return this; -},removeItems:function(){return $$(Array.flatten(arguments).map(function(a){this.elements.erase(a);var b=a.retrieve("sortables:start");(this.options.handle?a.getElement(this.options.handle)||a:a).removeEvent("mousedown",b); -return a;},this));},removeLists:function(){return $$(Array.flatten(arguments).map(function(a){this.lists.erase(a);this.removeItems(a.getChildren());return a; -},this));},getDroppableCoordinates:function(c){var d=c.getOffsetParent();var b=c.getPosition(d);var a={w:window.getScroll(),offsetParent:d.getScroll()}; -b.x+=a.offsetParent.x;b.y+=a.offsetParent.y;if(d.getStyle("position")=="fixed"){b.x-=a.w.x;b.y-=a.w.y;}return b;},getClone:function(b,a){if(!this.options.clone){return new Element(a.tagName).inject(document.body); -}if(typeOf(this.options.clone)=="function"){return this.options.clone.call(this,b,a,this.list);}var c=a.clone(true).setStyles({margin:0,position:"absolute",visibility:"hidden",width:a.getStyle("width")}).addEvent("mousedown",function(d){a.fireEvent("mousedown",d); -});if(c.get("html").test("radio")){c.getElements("input[type=radio]").each(function(d,e){d.set("name","clone_"+e);if(d.get("checked")){a.getElements("input[type=radio]")[e].set("checked",true); -}});}return c.inject(this.list).setPosition(this.getDroppableCoordinates(this.element));},getDroppables:function(){var a=this.list.getChildren().erase(this.clone).erase(this.element); -if(!this.options.constrain){a.append(this.lists).erase(this.list);}return a;},insert:function(c,b){var a="inside";if(this.lists.contains(b)){this.list=b; -this.drag.droppables=this.getDroppables();}else{a=this.element.getAllPrevious().contains(b)?"before":"after";}this.element.inject(b,a);this.fireEvent("sort",[this.element,this.clone]); -},start:function(b,a){if(!this.idle||b.rightClick||(!this.options.handle&&this.options.unDraggableTags.contains(b.target.get("tag")))){return;}this.idle=false; -this.element=a;this.opacity=a.getStyle("opacity");this.list=a.getParent();this.clone=this.getClone(b,a);this.drag=new Drag.Move(this.clone,Object.merge({droppables:this.getDroppables()},this.options.dragOptions)).addEvents({onSnap:function(){b.stop(); -this.clone.setStyle("visibility","visible");this.element.setStyle("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]); -}.bind(this),onEnter:this.insert.bind(this),onCancel:this.end.bind(this),onComplete:this.end.bind(this)});this.clone.inject(this.element,"before");this.drag.start(b); -},end:function(){this.drag.detach();this.element.setStyle("opacity",this.opacity);var a=this;if(this.effect){var c=this.element.getStyles("width","height"),e=this.clone,d=e.computePosition(this.getDroppableCoordinates(e)); -var b=function(){this.removeEvent("cancel",b);e.destroy();a.reset();};this.effect.element=e;this.effect.start({top:d.top,left:d.left,width:c.width,height:c.height,opacity:0.25}).addEvent("cancel",b).chain(b); -}else{this.clone.destroy();a.reset();}},reset:function(){this.idle=true;this.fireEvent("complete",this.element);},serialize:function(){var c=Array.link(arguments,{modifier:Type.isFunction,index:function(d){return d!=null; -}});var b=this.lists.map(function(d){return d.getChildren().map(c.modifier||function(e){return e.get("id");},this);},this);var a=c.index;if(this.lists.length==1){a=0; -}return(a||a===0)&&a>=0&&a=3){d="rgb";c=Array.slice(arguments,0,3);}else{if(typeof c=="string"){if(c.match(/rgb/)){c=c.rgbToHex().hexToRgb(true); -}else{if(c.match(/hsb/)){c=c.hsbToRgb();}else{c=c.hexToRgb(true);}}}}d=d||"rgb";switch(d){case"hsb":var b=c;c=c.hsbToRgb();c.hsb=b;break;case"hex":c=c.hexToRgb(true); -break;}c.rgb=c.slice(0,3);c.hsb=c.hsb||c.rgbToHsb();c.hex=c.rgbToHex();return Object.append(c,this);});a.implement({mix:function(){var b=Array.slice(arguments); -var d=(typeOf(b.getLast())=="number")?b.pop():50;var c=this.slice();b.each(function(e){e=new a(e);for(var f=0;f<3;f++){c[f]=Math.round((c[f]/100*(100-d))+(e[f]/100*d)); -}});return new a(c,"rgb");},invert:function(){return new a(this.map(function(b){return 255-b;}));},setHue:function(b){return new a([b,this.hsb[1],this.hsb[2]],"hsb"); -},setSaturation:function(b){return new a([this.hsb[0],b,this.hsb[2]],"hsb");},setBrightness:function(b){return new a([this.hsb[0],this.hsb[1],b],"hsb"); -}});this.$RGB=function(e,d,c){return new a([e,d,c],"rgb");};this.$HSB=function(e,d,c){return new a([e,d,c],"hsb");};this.$HEX=function(b){return new a(b,"hex"); -};Array.implement({rgbToHsb:function(){var c=this[0],d=this[1],k=this[2],h=0;var j=Math.max(c,d,k),f=Math.min(c,d,k);var l=j-f;var i=j/255,g=(j!=0)?l/j:0; -if(g!=0){var e=(j-c)/l;var b=(j-d)/l;var m=(j-k)/l;if(c==j){h=m-b;}else{if(d==j){h=2+e-m;}else{h=4+b-e;}}h/=6;if(h<0){h++;}}return[Math.round(h*360),Math.round(g*100),Math.round(i*100)]; -},hsbToRgb:function(){var d=Math.round(this[2]/100*255);if(this[1]==0){return[d,d,d];}else{var b=this[0]%360;var g=b%60;var h=Math.round((this[2]*(100-this[1]))/10000*255); -var e=Math.round((this[2]*(6000-this[1]*g))/600000*255);var c=Math.round((this[2]*(6000-this[1]*(60-g)))/600000*255);switch(Math.floor(b/60)){case 0:return[d,c,h]; -case 1:return[e,d,h];case 2:return[h,d,c];case 3:return[h,e,d];case 4:return[c,h,d];case 5:return[d,h,e];}}return false;}});String.implement({rgbToHsb:function(){var b=this.match(/\d{1,3}/g); -return(b)?b.rgbToHsb():null;},hsbToRgb:function(){var b=this.match(/\d{1,3}/g);return(b)?b.hsbToRgb():null;}});})(); \ No newline at end of file diff --git a/module/webui/themes/default/js/static/purr.js b/module/webui/themes/default/js/static/purr.js deleted file mode 100644 index 9cbc503d9..000000000 --- a/module/webui/themes/default/js/static/purr.js +++ /dev/null @@ -1,309 +0,0 @@ -/* ---- -script: purr.js - -description: Class to create growl-style popup notifications. - -license: MIT-style - -authors: [atom smith] - -requires: -- core/1.3: [Core, Browser, Array, Function, Number, String, Hash, Event, Class.Extras, Element.Event, Element.Style, Element.Dimensions, Fx.CSS, FX.Tween, Fx.Morph] - -provides: [Purr, Element.alert] -... -*/ - - -var Purr = new Class({ - - 'options': { - 'mode': 'top', - 'position': 'left', - 'elementAlertClass': 'purr-element-alert', - 'elements': { - 'wrapper': 'div', - 'alert': 'div', - 'buttonWrapper': 'div', - 'button': 'button' - }, - 'elementOptions': { - 'wrapper': { - 'styles': { - 'position': 'fixed', - 'z-index': '9999' - }, - 'class': 'purr-wrapper' - }, - 'alert': { - 'class': 'purr-alert', - 'styles': { - 'opacity': '.85' - } - }, - 'buttonWrapper': { - 'class': 'purr-button-wrapper' - }, - 'button': { - 'class': 'purr-button' - } - }, - 'alert': { - 'buttons': [], - 'clickDismiss': true, - 'hoverWait': true, - 'hideAfter': 5000, - 'fx': { - 'duration': 500 - }, - 'highlight': false, - 'highlightRepeat': false, - 'highlight': { - 'start': '#FF0', - 'end': false - } - } - }, - - 'Implements': [Options, Events, Chain], - - 'initialize': function(options){ - this.setOptions(options); - this.createWrapper(); - return this; - }, - - 'bindAlert': function(){ - return this.alert.bind(this); - }, - - 'createWrapper': function(){ - this.wrapper = new Element(this.options.elements.wrapper, this.options.elementOptions.wrapper); - if(this.options.mode == 'top') - { - this.wrapper.setStyle('top', 0); - } - else - { - this.wrapper.setStyle('bottom', 0); - } - document.id(document.body).grab(this.wrapper); - this.positionWrapper(this.options.position); - }, - - 'positionWrapper': function(position){ - if(typeOf(position) == 'object') - { - - var wrapperCoords = this.getWrapperCoords(); - - this.wrapper.setStyles({ - 'bottom': '', - 'left': position.x, - 'top': position.y - wrapperCoords.height, - 'position': 'absolute' - }); - } - else if(position == 'left') - { - this.wrapper.setStyle('left', 0); - } - else if(position == 'right') - { - this.wrapper.setStyle('right', 0); - } - else - { - this.wrapper.setStyle('left', (window.innerWidth / 2) - (this.getWrapperCoords().width / 2)); - } - return this; - }, - - 'getWrapperCoords': function(){ - this.wrapper.setStyle('visibility', 'hidden'); - var measurer = this.alert('need something in here to measure'); - var coords = this.wrapper.getCoordinates(); - measurer.destroy(); - this.wrapper.setStyle('visibility',''); - return coords; - }, - - 'alert': function(msg, options){ - - options = Object.merge({}, this.options.alert, options || {}); - - var alert = new Element(this.options.elements.alert, this.options.elementOptions.alert); - - if(typeOf(msg) == 'string') - { - alert.set('html', msg); - } - else if(typeOf(msg) == 'element') - { - alert.grab(msg); - } - else if(typeOf(msg) == 'array') - { - var alerts = []; - msg.each(function(m){ - alerts.push(this.alert(m, options)); - }, this); - return alerts; - } - - alert.store('options', options); - - if(options.buttons.length > 0) - { - options.clickDismiss = false; - options.hideAfter = false; - options.hoverWait = false; - var buttonWrapper = new Element(this.options.elements.buttonWrapper, this.options.elementOptions.buttonWrapper); - alert.grab(buttonWrapper); - options.buttons.each(function(button){ - if(button.text != undefined) - { - var callbackButton = new Element(this.options.elements.button, this.options.elementOptions.button); - callbackButton.set('html', button.text); - if(button.callback != undefined) - { - callbackButton.addEvent('click', button.callback.pass(alert)); - } - if(button.dismiss != undefined && button.dismiss) - { - callbackButton.addEvent('click', this.dismiss.pass(alert, this)); - } - buttonWrapper.grab(callbackButton); - } - }, this); - } - if(options.className != undefined) - { - alert.addClass(options.className); - } - - this.wrapper.grab(alert, (this.options.mode == 'top') ? 'bottom' : 'top'); - - var fx = Object.merge(this.options.alert.fx, options.fx); - var alertFx = new Fx.Morph(alert, fx); - alert.store('fx', alertFx); - this.fadeIn(alert); - - if(options.highlight) - { - alertFx.addEvent('complete', function(){ - alert.highlight(options.highlight.start, options.highlight.end); - if(options.highlightRepeat) - { - alert.highlight.periodical(options.highlightRepeat, alert, [options.highlight.start, options.highlight.end]); - } - }); - } - if(options.hideAfter) - { - this.dismiss(alert); - } - - if(options.clickDismiss) - { - alert.addEvent('click', function(){ - this.holdUp = false; - this.dismiss(alert, true); - }.bind(this)); - } - - if(options.hoverWait) - { - alert.addEvents({ - 'mouseenter': function(){ - this.holdUp = true; - }.bind(this), - 'mouseleave': function(){ - this.holdUp = false; - }.bind(this) - }); - } - - return alert; - }, - - 'fadeIn': function(alert){ - var alertFx = alert.retrieve('fx'); - alertFx.set({ - 'opacity': 0 - }); - alertFx.start({ - 'opacity': [this.options.elementOptions.alert.styles.opacity, .9].pick(), - }); - }, - - 'dismiss': function(alert, now){ - now = now || false; - var options = alert.retrieve('options'); - if(now) - { - this.fadeOut(alert); - } - else - { - this.fadeOut.delay(options.hideAfter, this, alert); - } - }, - - 'fadeOut': function(alert){ - if(this.holdUp) - { - this.dismiss.delay(100, this, [alert, true]) - return null; - } - var alertFx = alert.retrieve('fx'); - if(!alertFx) - { - return null; - } - var to = { - 'opacity': 0 - } - if(this.options.mode == 'top') - { - to['margin-top'] = '-'+alert.offsetHeight+'px'; - } - else - { - to['margin-bottom'] = '-'+alert.offsetHeight+'px'; - } - alertFx.start(to); - alertFx.addEvent('complete', function(){ - alert.destroy(); - }); - } -}); - -Element.implement({ - - 'alert': function(msg, options){ - var alert = this.retrieve('alert'); - if(!alert) - { - options = options || { - 'mode':'top' - }; - alert = new Purr(options) - this.store('alert', alert); - } - - var coords = this.getCoordinates(); - - alert.alert(msg, options); - - alert.wrapper.setStyles({ - 'bottom': '', - 'left': (coords.left - (alert.wrapper.getWidth() / 2)) + (this.getWidth() / 2), - 'top': coords.top - (alert.wrapper.getHeight()), - 'position': 'absolute' - }); - - } - -}); \ No newline at end of file diff --git a/module/webui/themes/default/js/static/purr.min.js b/module/webui/themes/default/js/static/purr.min.js deleted file mode 100644 index bf70e357d..000000000 --- a/module/webui/themes/default/js/static/purr.min.js +++ /dev/null @@ -1 +0,0 @@ -var Purr=new Class({options:{mode:"top",position:"left",elementAlertClass:"purr-element-alert",elements:{wrapper:"div",alert:"div",buttonWrapper:"div",button:"button"},elementOptions:{wrapper:{styles:{position:"fixed","z-index":"9999"},"class":"purr-wrapper"},alert:{"class":"purr-alert",styles:{opacity:".85"}},buttonWrapper:{"class":"purr-button-wrapper"},button:{"class":"purr-button"}},alert:{buttons:[],clickDismiss:!0,hoverWait:!0,hideAfter:5e3,fx:{duration:500},highlight:!1,highlightRepeat:!1,highlight:{start:"#FF0",end:!1}}},Implements:[Options,Events,Chain],initialize:function(t){return this.setOptions(t),this.createWrapper(),this},bindAlert:function(){return this.alert.bind(this)},createWrapper:function(){this.wrapper=new Element(this.options.elements.wrapper,this.options.elementOptions.wrapper),"top"==this.options.mode?this.wrapper.setStyle("top",0):this.wrapper.setStyle("bottom",0),document.id(document.body).grab(this.wrapper),this.positionWrapper(this.options.position)},positionWrapper:function(t){if("object"==typeOf(t)){var e=this.getWrapperCoords();this.wrapper.setStyles({bottom:"",left:t.x,top:t.y-e.height,position:"absolute"})}else"left"==t?this.wrapper.setStyle("left",0):"right"==t?this.wrapper.setStyle("right",0):this.wrapper.setStyle("left",window.innerWidth/2-this.getWrapperCoords().width/2);return this},getWrapperCoords:function(){this.wrapper.setStyle("visibility","hidden");var t=this.alert("need something in here to measure"),e=this.wrapper.getCoordinates();return t.destroy(),this.wrapper.setStyle("visibility",""),e},alert:function(t,e){e=Object.merge({},this.options.alert,e||{});var i=new Element(this.options.elements.alert,this.options.elementOptions.alert);if("string"==typeOf(t))i.set("html",t);else if("element"==typeOf(t))i.grab(t);else if("array"==typeOf(t)){var s=[];return t.each(function(t){s.push(this.alert(t,e))},this),s}if(i.store("options",e),e.buttons.length>0){e.clickDismiss=!1,e.hideAfter=!1,e.hoverWait=!1;var r=new Element(this.options.elements.buttonWrapper,this.options.elementOptions.buttonWrapper);i.grab(r),e.buttons.each(function(t){if(void 0!=t.text){var e=new Element(this.options.elements.button,this.options.elementOptions.button);e.set("html",t.text),void 0!=t.callback&&e.addEvent("click",t.callback.pass(i)),void 0!=t.dismiss&&t.dismiss&&e.addEvent("click",this.dismiss.pass(i,this)),r.grab(e)}},this)}void 0!=e.className&&i.addClass(e.className),this.wrapper.grab(i,"top"==this.options.mode?"bottom":"top");var o=Object.merge(this.options.alert.fx,e.fx),n=new Fx.Morph(i,o);return i.store("fx",n),this.fadeIn(i),e.highlight&&n.addEvent("complete",function(){i.highlight(e.highlight.start,e.highlight.end),e.highlightRepeat&&i.highlight.periodical(e.highlightRepeat,i,[e.highlight.start,e.highlight.end])}),e.hideAfter&&this.dismiss(i),e.clickDismiss&&i.addEvent("click",function(){this.holdUp=!1,this.dismiss(i,!0)}.bind(this)),e.hoverWait&&i.addEvents({mouseenter:function(){this.holdUp=!0}.bind(this),mouseleave:function(){this.holdUp=!1}.bind(this)}),i},fadeIn:function(t){var e=t.retrieve("fx");e.set({opacity:0}),e.start({opacity:[this.options.elementOptions.alert.styles.opacity,.9].pick()})},dismiss:function(t,e){e=e||!1;var i=t.retrieve("options");e?this.fadeOut(t):this.fadeOut.delay(i.hideAfter,this,t)},fadeOut:function(t){if(this.holdUp)return this.dismiss.delay(100,this,[t,!0]),null;var e=t.retrieve("fx");if(!e)return null;var i={opacity:0};"top"==this.options.mode?i["margin-top"]="-"+t.offsetHeight+"px":i["margin-bottom"]="-"+t.offsetHeight+"px",e.start(i),e.addEvent("complete",function(){t.destroy()})}});Element.implement({alert:function(t,e){var i=this.retrieve("alert");i||(e=e||{mode:"top"},i=new Purr(e),this.store("alert",i));var s=this.getCoordinates();i.alert(t,e),i.wrapper.setStyles({bottom:"",left:s.left-i.wrapper.getWidth()/2+this.getWidth()/2,top:s.top-i.wrapper.getHeight(),position:"absolute"})}}); \ No newline at end of file diff --git a/module/webui/themes/default/js/static/tinytab.js b/module/webui/themes/default/js/static/tinytab.js deleted file mode 100644 index de50279fc..000000000 --- a/module/webui/themes/default/js/static/tinytab.js +++ /dev/null @@ -1,43 +0,0 @@ -/* ---- -description: TinyTab - Tiny and simple tab handler for Mootools. - -license: MIT-style - -authors: -- Danillo César de O. Melo - -requires: -- core/1.2.4: '*' - -provides: TinyTab - -... -*/ -(function($) { - this.TinyTab = new Class({ - Implements: Events, - initialize: function(tabs, contents, opt) { - this.tabs = tabs; - this.contents = contents; - if(!opt) opt = {}; - this.css = opt.selectedClass || 'selected'; - this.select(this.tabs[0]); - tabs.each(function(el){ - el.addEvent('click',function(e){ - this.select(el); - e.stop(); - }.bind(this)); - }.bind(this)); - }, - - select: function(el) { - this.tabs.removeClass(this.css); - el.addClass(this.css); - this.contents.setStyle('display','none'); - var content = this.contents[this.tabs.indexOf(el)]; - content.setStyle('display','block'); - this.fireEvent('change',[content,el]); - } - }); -})(document.id); \ No newline at end of file diff --git a/module/webui/themes/default/js/static/tinytab.min.js b/module/webui/themes/default/js/static/tinytab.min.js deleted file mode 100644 index 2f4fa0436..000000000 --- a/module/webui/themes/default/js/static/tinytab.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){this.TinyTab=new Class({Implements:Events,initialize:function(s,t,e){this.tabs=s,this.contents=t,e||(e={}),this.css=e.selectedClass||"selected",this.select(this.tabs[0]),s.each(function(s){s.addEvent("click",function(t){this.select(s),t.stop()}.bind(this))}.bind(this))},select:function(s){this.tabs.removeClass(this.css),s.addClass(this.css),this.contents.setStyle("display","none");var t=this.contents[this.tabs.indexOf(s)];t.setStyle("display","block"),this.fireEvent("change",[t,s])}})}(document.id); \ No newline at end of file diff --git a/module/webui/themes/default/tml/admin.html b/module/webui/themes/default/tml/admin.html deleted file mode 100644 index ba94f7a74..000000000 --- a/module/webui/themes/default/tml/admin.html +++ /dev/null @@ -1,98 +0,0 @@ -{% extends '/default/tml/base.html' %} - -{% block head %} - -{% endblock %} - - -{% block title %}{{ _("Administrate") }} - {{ super() }} {% endblock %} -{% block subtitle %}{{ _("Administrate") }}{% endblock %} - -{% block content %} - - {{_("Quit pyLoad")}} | - {{_("Restart pyLoad")}} -
      -
      - - {{ _("To add user or change passwords use:") }} python pyload.py -u
      - {{ _("Important: Admin user have always all permissions!") }} - -
      - - - - - - - - - {% for name, data in users.iteritems() %} - - - - - - - {% endfor %} - - -
      - {{ _("Name") }} - - {{ _("Change Password") }} - - {{ _("Admin") }} - - {{ _("Permissions") }} -
      {{ name }}{{ _("change") }} - -
      - - -
      -{% endblock %} -{% block hidden %} -
      -
      -

      {{ _("Change Password") }}

      - -

      {{ _("Enter your current and desired Password.") }}

      - - - - - - - - - - - - - - - -
      - -
      - -
      -{% endblock %} diff --git a/module/webui/themes/default/tml/base.html b/module/webui/themes/default/tml/base.html deleted file mode 100644 index e2a62a116..000000000 --- a/module/webui/themes/default/tml/base.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - - - - - - - -{% block title %}pyLoad {{_("Webinterface")}}{% endblock %} - -{% block head %} -{% endblock %} - - - - -
      - - -
      - {% block headpanel %} - - {% if user.is_authenticated %} - - -{% if update %} - -{{_("New pyLoad version %s available!") % update}} - -{% endif %} - - -{% if plugins %} - -{{_("Plugins updated, please restart!")}} - -{% endif %} - - -Captcha: -{{_("Captcha waiting")}} - - - User:{{user.name}} - -{% else %} - {{_("Please Login!")}} -{% endif %} - - {% endblock %} -
      - - - -
      - -
      - -
      -
      - -{% if perms.STATUS %} - -{% endif %} - -{% if perms.LIST %} - -{% endif %} - -{% block pageactions %} -{% endblock %} -
      - -
      - -
      - -

      {% block subtitle %}pyLoad - {{_("Webinterface")}}{% endblock %}

      - -{% block statusbar %} -{% endblock %} - - -
      - -
      -
      - - -{% for message in messages %} -

      {{message}}

      -{% endfor %} - -
      - - {{_("loading")}} -
      - -{% block content %} -{% endblock content %} - -
      - - -
      -
      - -
      - {% include '/default/tml/window.html' %} - {% include '/default/tml/captcha.html' %} - {% block hidden %} - {% endblock %} -
      - - diff --git a/module/webui/themes/default/tml/captcha.html b/module/webui/themes/default/tml/captcha.html deleted file mode 100644 index 56892593f..000000000 --- a/module/webui/themes/default/tml/captcha.html +++ /dev/null @@ -1,42 +0,0 @@ - -
      - -
      - -

      {{_("Captcha reading")}}

      -

      {{_("Please read the text on the captcha.")}}

      - -
      - - - - - - - - - - - -
      - -
      - -
      - -
      - - - - -
      - -
      - -
      - -
      diff --git a/module/webui/themes/default/tml/downloads.html b/module/webui/themes/default/tml/downloads.html deleted file mode 100644 index ba0f77c18..000000000 --- a/module/webui/themes/default/tml/downloads.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends '/default/tml/base.html' %} - -{% block title %}Downloads - {{super()}} {% endblock %} - -{% block subtitle %} -{{_("Downloads")}} -{% endblock %} - -{% block content %} - -
        - {% for folder in files.folder %} -
      • - {{ folder.name }} -
          - {% for file in folder.files %} -
        • {{file}}
        • - {% endfor %} -
        -
      • - {% endfor %} - - {% for file in files.files %} -
      • {{ file }}
      • - {% endfor %} - -
      - -{% endblock %} diff --git a/module/webui/themes/default/tml/filemanager.html b/module/webui/themes/default/tml/filemanager.html deleted file mode 100644 index 7a370d04c..000000000 --- a/module/webui/themes/default/tml/filemanager.html +++ /dev/null @@ -1,78 +0,0 @@ -{% extends '/default/tml/base.html' %} - -{% block head %} - - - - -{% endblock %} - -{% block title %}Downloads - {{super()}} {% endblock %} - - -{% block subtitle %} -{{_("FileManager")}} -{% endblock %} - -{% macro display_file(file) %} -
    • - - - - {{ file.name }} - - -    - - - -
    • -{%- endmacro %} - -{% macro display_folder(fld, open = false) -%} -
    • - - - - {{ fld.name }} - - -    - -    - - - - {% if (fld.folders|length + fld.files|length) > 0 %} - {% if open %} -
        - {% else %} -
          - {% endif %} - {% for child in fld.folders %} - {{ display_folder(child) }} - {% endfor %} - {% for child in fld.files %} - {{ display_file(child) }} - {% endfor %} -
        - {% else %} -
        {{ _("Folder is empty") }}
        - {% endif %} - -{%- endmacro %} - -{% block content %} - -
        - -
          -{{ display_folder(root, true) }} -
        - -{% endblock %} diff --git a/module/webui/themes/default/tml/folder.html b/module/webui/themes/default/tml/folder.html deleted file mode 100644 index 227a46ba0..000000000 --- a/module/webui/themes/default/tml/folder.html +++ /dev/null @@ -1,15 +0,0 @@ -
      • - - - - {{ name }} - - -    - -    - - - -
        {{ _("Folder is empty") }}
        -
      • diff --git a/module/webui/themes/default/tml/home.html b/module/webui/themes/default/tml/home.html deleted file mode 100644 index 0fff703b5..000000000 --- a/module/webui/themes/default/tml/home.html +++ /dev/null @@ -1,266 +0,0 @@ -{% extends '/default/tml/base.html' %} -{% block head %} - - - -{% endblock %} - -{% block subtitle %} -{{_("Active Downloads")}} -{% endblock %} - -{% block menu %} -
      • - {{_("Home")}} -
      • -
      • - {{_("Queue")}} -
      • -
      • - {{_("Collector")}} -
      • -
      • - {{_("Downloads")}} -
      • -{#
      • #} -{# {{_("FileManager")}}#} -{#
      • #} -
      • - {{_("Logs")}} -
      • -
      • - {{_("Config")}} -
      • -{% endblock %} - -{% block content %} - - - - - - - - - - - - - {% for link in content %} - - - - - - - - - - - {% endfor %} - - -
        {{_("Name")}}{{_("Status")}}{{_("Information")}}{{_("Size")}}{{_("Progress")}}
        -{% endblock %} diff --git a/module/webui/themes/default/tml/info.html b/module/webui/themes/default/tml/info.html deleted file mode 100644 index 2deaa6dce..000000000 --- a/module/webui/themes/default/tml/info.html +++ /dev/null @@ -1,81 +0,0 @@ -{% extends '/default/tml/base.html' %} - -{% block head %} - -{% endblock %} - -{% block title %}{{ _("Information") }} - {{ super() }} {% endblock %} -{% block subtitle %}{{ _("Information") }}{% endblock %} - -{% block content %} -

        {{ _("News") }}

        -
        - -

        {{ _("Support") }}

        - - - -

        {{ _("System") }}

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        {{ _("Python:") }}{{ python }}
        {{ _("OS:") }}{{ os }}
        {{ _("pyLoad version:") }}{{ version }}
        {{ _("Installation Folder:") }}{{ folder }}
        {{ _("Config Folder:") }}{{ config }}
        {{ _("Download Folder:") }}{{ download }}
        {{ _("Free Space:") }}{{ freespace }}
        {{ _("Language:") }}{{ language }}
        {{ _("Webinterface Port:") }}{{ webif }}
        {{ _("Remote Interface Port:") }}{{ remote }}
        - -{% endblock %} diff --git a/module/webui/themes/default/tml/login.html b/module/webui/themes/default/tml/login.html deleted file mode 100644 index 089275219..000000000 --- a/module/webui/themes/default/tml/login.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends '/default/tml/base.html' %} - -{% block title %}{{_("Login")}} - {{super()}} {% endblock %} - -{% block content %} - -
        -
        -
        - -
        - Login - -
        - -
        - -
        -
        -
        - -{% if errors %} -

        {{_("Your username and password didn't match. Please try again.")}}

        - {{ _("To reset your login data or add an user run:") }} python pyload.py -u -{% endif %} - -
        -
        - -{% endblock %} diff --git a/module/webui/themes/default/tml/logout.html b/module/webui/themes/default/tml/logout.html deleted file mode 100644 index 196676de5..000000000 --- a/module/webui/themes/default/tml/logout.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends '/default/tml/base.html' %} - -{% block head %} - -{% endblock %} - -{% block content %} -

        {{_("You were successfully logged out.")}}

        -{% endblock %} diff --git a/module/webui/themes/default/tml/logs.html b/module/webui/themes/default/tml/logs.html deleted file mode 100644 index 1706be8a6..000000000 --- a/module/webui/themes/default/tml/logs.html +++ /dev/null @@ -1,41 +0,0 @@ -{% extends '/default/tml/base.html' %} - -{% block title %}{{_("Logs")}} - {{super()}} {% endblock %} -{% block subtitle %}{{_("Logs")}}{% endblock %} -{% block head %} - -{% endblock %} - -{% block content %} -
        - - -
        -
        - -   - - -
        -
        -
        {{warning}}
        -
        -
        - - {% for line in log %} - - {% endfor %} -
        {{line.line}}{{line.date}}{{line.level}}{{line.message}}
        -
        -
        -
        - - -
        -
        -
         
        -{% endblock %} diff --git a/module/webui/themes/default/tml/pathchooser.html b/module/webui/themes/default/tml/pathchooser.html deleted file mode 100644 index 8ce9ab072..000000000 --- a/module/webui/themes/default/tml/pathchooser.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - -
        -
        -
        - - -
        - - {% if type == 'folder' %} - {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} - {% else %} - {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} - {% endif %} -
        - - - - - - - - {% if parentdir %} - - - - {% endif %} -{% for file in files %} - - {% if type == 'folder' %} - - {% else %} - - {% endif %} - - - - - -{% endfor %} -
        {{_("name")}}{{_("size")}}{{_("type")}}{{_("last modified")}}
        - {{_("parent directory")}} -
        {% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{{ file.size|float|filesizeformat }}{% if file.type == 'dir' %}directory{% else %}{{ file.ext|default("file") }}{% endif %}{{ file.modified|date("d.m.Y - H:i:s") }}
        -
        - - diff --git a/module/webui/themes/default/tml/queue.html b/module/webui/themes/default/tml/queue.html deleted file mode 100644 index 035ee1808..000000000 --- a/module/webui/themes/default/tml/queue.html +++ /dev/null @@ -1,104 +0,0 @@ -{% extends '/default/tml/base.html' %} -{% block head %} - - - - -{% endblock %} - -{% if target %} - {% set name = _("Queue") %} -{% else %} - {% set name = _("Collector") %} -{% endif %} - -{% block title %}{{name}} - {{super()}} {% endblock %} -{% block subtitle %}{{name}}{% endblock %} - -{% block pageactions %} - -{% endblock %} - -{% block content %} -{% autoescape true %} - -
          -{% for package in content %} -
        • -
          - - -
          - - {{package.name}} -    - - -    - -    - -    - - -
          - {% set progress = (package.linksdone * 100) / package.linkstotal %} - -
          -
          - - -
          -
          - - -
          -
        • -{% endfor %} -
        -{% endautoescape %} -{% endblock %} - -{% block hidden %} -
        -
        -

        {{_("Edit Package")}}

        -

        {{_("Edit the package detais below.")}}

        - - - - - - - - - - - - -
        - -
        - -
        -{% endblock %} diff --git a/module/webui/themes/default/tml/settings.html b/module/webui/themes/default/tml/settings.html deleted file mode 100644 index fddc6e35c..000000000 --- a/module/webui/themes/default/tml/settings.html +++ /dev/null @@ -1,204 +0,0 @@ -{% extends '/default/tml/base.html' %} - -{% block title %}{{ _("Config") }} - {{ super() }} {% endblock %} -{% block subtitle %}{{ _("Config") }}{% endblock %} - -{% block head %} - - - - -{% endblock %} - -{% block content %} - - - -
        - -
        - - - - - - -
        - -
        -

           {{ _("Choose a section from the menu") }}

        -
        -
        - - -
        -
        - - - - - - -
        - - -
        -

           {{ _("Choose a section from the menu") }}

        -
        -
        - -
        - -
        - - - -
        - - - - - - - - - - - - - - - - - - - - {% for account in conf.accs %} - {% set plugin = account.type %} - - - - - - - - - - - - - - {% endfor %} -
        {{ _("Plugin") }}{{ _("Name") }}{{ _("Password") }}{{ _("Status") }}{{ _("Premium") }}{{ _("Valid until") }}{{ _("Traffic left") }}{{ _("Time") }}{{ _("Max Parallel") }}{{ _("Delete?") }}
        - {{ plugin }} - - - - {% if account.valid %} - - {{ _("valid") }} - {% else %} - - {{ _("not valid") }} - {% endif %} - - - {% if account.premium %} - - {{ _("yes") }} - {% else %} - - {{ _("no") }} - {% endif %} - - - - {{ account.validuntil }} - - - - {{ account.trafficleft }} - - - - - - - -
        - - - -
        -
        -
        -{% endblock %} -{% block hidden %} -
        -
        -

        {{_("Add Account")}}

        -

        {{_("Enter your account data to use premium features.")}}

        - - - - - - - - - - - -
        - -
        - -
        -{% endblock %} diff --git a/module/webui/themes/default/tml/settings_item.html b/module/webui/themes/default/tml/settings_item.html deleted file mode 100644 index 6642d34b4..000000000 --- a/module/webui/themes/default/tml/settings_item.html +++ /dev/null @@ -1,48 +0,0 @@ - - {% if section.outline %} - - {% endif %} - {% for okey, option in section.iteritems() %} - {% if okey not in ("desc", "outline") %} - - - - - {% endif %} - {% endfor %} -
        {{ section.outline }}
        - {% if option.type == "bool" %} - - {% elif ";" in option.type %} - - {% elif option.type == "folder" %} - - - {% elif option.type == "file" %} - - - {% elif option.type == "password" %} - - {% else %} - - {% endif %} -
        diff --git a/module/webui/themes/default/tml/window.html b/module/webui/themes/default/tml/window.html deleted file mode 100644 index e73eba2bd..000000000 --- a/module/webui/themes/default/tml/window.html +++ /dev/null @@ -1,46 +0,0 @@ - - -
        -
        -

        {{_("Add Package")}}

        -

        {{_("Paste your links or upload a container.")}}

        - - - - - - - - - - - - - - - {{_("Queue")}} - - {{_("Collector")}} - - - - - -
        - -
        - -
        diff --git a/module/webui/themes/flat/css/MooDialog.css b/module/webui/themes/flat/css/MooDialog.css deleted file mode 100644 index 3ba94cafd..000000000 --- a/module/webui/themes/flat/css/MooDialog.css +++ /dev/null @@ -1,84 +0,0 @@ -/* Created by Arian Stolwijk */ - -.MooDialog { -/* position: fixed;*/ - margin: 0 auto 0 -350px; - width:600px; - padding:14px; - left:50%; - top: 100px; - - position: absolute; - left: 50%; - z-index: 50000; - - background: #CDCDCD; - color: black; -} - -.MooDialogTitle { - padding-top: 30px; -} - -.MooDialog .title { - position: absolute; - top: 0; - left: 0; - right: 0; - padding: 3px 20px; - background: #b7c4dc; - border-bottom: 1px solid #a1aec5; - font-weight: bold; - text-shadow: 1px 1px 0 #fff; - color: black; - border-radius: 7px; - -moz-border-radius: 7px; - -webkit-border-radius: 7px; -} - -.MooDialog .close { - background: url(../img/control_cancel.png) no-repeat; - width: 16px; - height: 16px; - display: block; - cursor: pointer; - top: -5px; - left: -5px; - position: absolute; -} - -.MooDialog .buttons { - text-align: right; - margin: 0; - padding: 0; - border: 0; - background: none; -} - -.MooDialog .iframe { - width: 100%; - height: 100%; -} - -.MooDialog .textInput { - width: 200px; - float: left; -} - -.MooDialog .MooDialogAlert, -.MooDialog .MooDialogConfirm, -.MooDialog .MooDialogPrompt, -.MooDialog .MooDialogError { - background: url(../img/MooDialog/dialog-warning.png) no-repeat; - padding-left: 40px; - min-height: 40px; -} - -.MooDialog .MooDialogConfirm, -.MooDialog .MooDialogPromt { - background: url(../img/MooDialog/dialog-question.png) no-repeat; -} - -.MooDialog .MooDialogError { - background: url(../img/MooDialog/dialog-error.png) no-repeat; -} diff --git a/module/webui/themes/flat/css/flat.css b/module/webui/themes/flat/css/flat.css deleted file mode 100644 index 1a542962f..000000000 --- a/module/webui/themes/flat/css/flat.css +++ /dev/null @@ -1,863 +0,0 @@ -.hidden { - display:none; -} -.leftalign { - text-align:left; -} -.centeralign { - text-align:center; -} -.rightalign { - text-align:right; -} -.dokuwiki div.plugin_translation ul li a.wikilink1:link, .dokuwiki div.plugin_translation ul li a.wikilink1:hover, .dokuwiki div.plugin_translation ul li a.wikilink1:active, .dokuwiki div.plugin_translation ul li a.wikilink1:visited { - background-color:#000080; - border:none !important; - color:#FFFFFF !important; - margin:0.1em 0.2em; - padding:0 0.2em; - text-decoration:none; -} -.dokuwiki div.plugin_translation ul li a.wikilink2:link, .dokuwiki div.plugin_translation ul li a.wikilink2:hover, .dokuwiki div.plugin_translation ul li a.wikilink2:active, .dokuwiki div.plugin_translation ul li a.wikilink2:visited { - background-color:#808080; - border:none !important; - color:#FFFFFF !important; - margin:0.1em 0.2em; - padding:0 0.2em; - text-decoration:none; -} -.dokuwiki div.plugin_translation ul li a:hover img { - height:15px; - opacity:1; -} -body { - background-color:white; - color:black; - font-family:'Open Sans', sans-serif; - font-size:12px; - font-style:normal; - font-variant:normal; - font-weight:300; - line-height:normal; - margin:0; - padding:0; -} -hr { - border-bottom-color:#AAAAAA; - border-bottom-style:dotted; -} -img { - border:none; -} -form { - background-color:transparent; - border:none; - display:inline; - margin:0; - padding:0; -} -ul li { - margin:5px; -} -textarea { - font-family:monospace; -} -table { - border-collapse:collapse; - margin:0.5em 0; -} -td { - border:1pt solid #ADB9CC; - padding:0.25em; -} -a { - color:#3465A4; - text-decoration:none; -} -a:hover { - text-decoration:underline; -} -option { - border:0 none #FFFFFF; -} -strong.highlight { - background-color:#FFCC99; - padding:1pt; -} -#pagebottom { - clear:both; -} -hr { - background-color:#C0C0C0; - border:none; - color:#C0C0C0; - margin:0.2em 0; -} -.invisible { - border:0; - height:0; - margin:0; - padding:0; - visibility:hidden; -} -.left { - float:left !important; -} -.right { - float:right !important; -} -.center { - text-align:center; -} -div#body-wrapper { - font-size:127%; - padding:40px 40px 10px; -} -div#content { - color:black; - font-size:14px; - line-height:1.5em; - margin-top:-20px; - padding:0; -} -h1, h2, h3, h4, h5, h6 { - background-attachment:scroll; - background-color:transparent; - background-image:none; - background-position:0 0; - background-repeat:repeat repeat; - color:black; - font-family:'Open Sans', sans-serif; - font-weight:normal; - margin:0; - padding:0.5em 0 0.17em; -} -h1 { - font-family:'Open Sans', sans-serif; - font-weight:300; - line-height:1.2em; - margin-bottom:0.1em; - margin-left:-25px; - padding-bottom:0; - margin-left:-25px; -} -h2 { - font-size:150%; -} -h3, h4, h5, h6 { - border-bottom-style:none; - font-weight:bold; -} -h3 { - font-size:132%; -} -h4 { - font-size:116%; -} -h5 { - font-size:100%; -} -h6 { - font-size:80%; -} -ul#page-actions, ul#page-actions-more { - background-color:#ECECEC; - color:black; - float:right; - list-style-type:none; - margin:10px 10px 0; - padding:6px; - white-space:nowrap; -} -ul#user-actions { - background-color:#ECECEC; - color:black; - display:inline; - list-style-type:none; - margin:0; - padding:5px; -} -ul#page-actions li, ul#user-actions li, ul#page-actions-more li { - display:inline; -} -ul#page-actions a, ul#user-actions a, ul#page-actions-more a { - color:black; - display:inline; - margin:0 3px; - padding:2px 0 2px 18px; - text-decoration:none; -} -ul#page-actions a:hover, ul#page-actions a:focus, ul#user-actions a:hover, ul#user-actions a:focus { -} -ul#page-actions2 { - background-color:#ECECEC; - color:black; - float:left; - list-style-type:none; - margin:10px 10px 0; - padding:6px; -} -ul#user-actions2 { - background-color:#ECECEC; - border-bottom-left-radius:3px; - border-bottom-right-radius:3px; - border-top-left-radius:3px; - border-top-right-radius:3px; - color:black; - display:inline; - list-style-type:none; - margin:0; - padding:5px; -} -ul#page-actions2 li, ul#user-actions2 li { - display:inline; -} -ul#page-actions2 a, ul#user-actions2 a { - color:black; - display:inline; - margin:0 3px; - padding:2px 0 2px 18px; - text-decoration:none; -} -ul#page-actions2 a:hover, ul#page-actions2 a:focus, ul#user-actions2 a:hover, ul#user-actions2 a:focus, ul#page-actions-more a:hover, ul#page-actions-more a:focus { - color:#4E7BB4; -} -.hidden { - display:none; -} -a.logout { - background-color:transparent; - background-image:url(../img/user-actions-logout.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.info { - background-color:transparent; - background-image:url(../img/user-info.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.admin { - background-color:transparent; - background-image:url(../img/user-actions-admin.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.profile { - background-color:transparent; - background-image:url(../img/user-actions-profile.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.create, a.edit { - background-color:transparent; - background-image:url(../img/page-tools-edit.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.source, a.show { - background-color:transparent; - background-image:url(../img/page-tools-source.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.revisions { - background-color:transparent; - background-image:url(../img/page-tools-revisions.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.subscribe, a.unsubscribe { - background-color:transparent; - background-image:url(../img/page-tools-subscribe.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.backlink { - background-color:transparent; - background-image:url(../img/page-tools-backlinks.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.play { - background-color:transparent; - background-image:url(../img/control_play.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -.time { - background-color:transparent; - background-image:url(../img/status_None.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; - margin:0 3px; - padding:2px 0 2px 18px; -} -.reconnect { - background-color:transparent; - background-image:url(../img/reconnect.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; - margin:0 3px; - padding:2px 0 2px 18px; -} -a.play:hover { - background-color:transparent; - background-image:url(../img/control_play_blue.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.cancel { - background-color:transparent; - background-image:url(../img/control_cancel.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.cancel:hover { - background-color:transparent; - background-image:url(../img/control_cancel_blue.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.pause { - background-color:transparent; - background-image:url(../img/control_pause.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.pause:hover { - background-color:transparent; - background-image:url(../img/control_pause_blue.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; - font-weight:bold; -} -a.stop { - background-color:transparent; - background-image:url(../img/control_stop.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.stop:hover { - background-color:transparent; - background-image:url(../img/control_stop_blue.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.add { - background-color:transparent; - background-image:url(../img/control_add.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.add:hover { - background-color:transparent; - background-image:url(../img/control_add_blue.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -a.cog { - background-color:transparent; - background-image:url(../img/cog.png); - background-position:0 1px; - background-repeat:no-repeat no-repeat; -} -#head-panel { - background-color:#DDDDDD; - background-position:0 100%; - background-repeat:repeat no-repeat; -} -#head-panel h1 { - color:#EEEEEC; - display:none; - font-size:2.6em; - margin:0; - padding-left:3.3em; - padding-top:0.8em; - text-decoration:none; -} -#head-panel #head-logo { - float:left; - overflow:visible; - padding:11px 8px 0; -} -#head-menu { - float:left; - margin:0; - padding:1em 0 0; - width:100%; -} -#head-menu ul { - list-style:none; - margin:0 1em 0 2em; -} -#head-menu ul li { - float:left; - font-size:14px; - margin:0 0 4px 0.3em; -} -#head-menu ul li.selected, #head-menu ul li:hover { - margin-bottom:0; -} -#head-menu ul li a img { - height:22px; - padding-right:4px; - vertical-align:middle; - width:22px; -} -#head-menu ul li a, #head-menu ul li a:link { - background-color:#EAEAEA; - background-position:0 100%; - background-repeat:repeat no-repeat; - border-color:#CCCCCC #CCCCCC transparent; - color:#555555; - padding:7px 15px 8px; - text-decoration:none; -} -#head-menu ul li a:hover, #head-menu ul li a:focus { - border-bottom-color:transparent; - border-bottom-left-radius:0; - border-bottom-right-radius:0; - border-bottom-style:none; - border-bottom-width:0; - color:#111111; - outline:none; - padding-bottom:7px; -} -#head-menu ul li a:focus { - margin-bottom:-4px; -} -#head-menu ul li.selected a { - background-color:#FFFFFF; - border-bottom-color:transparent; - color:#3566A5; - padding:7px 15px 8px; -} -#head-menu ul li.selected a:hover, #head-menu ul li.selected a:focus { - color:#111111; -} -div#head-search-and-login { - color:white; - float:right; - margin:0 1em 0 0; - padding:7px 7px 5px 5px; - white-space:nowrap; -} -div#head-search-and-login form { - display:inline; - padding:0 3px; -} -div#head-search-and-login form input { - background-color:#EEEEEE; - border:2px solid #888888; - border-bottom-left-radius:3px; - border-bottom-right-radius:3px; - border-top-left-radius:3px; - border-top-right-radius:3px; - font-size:14px; - padding:2px; -} -div#head-search-and-login form input:focus { - background-color:#FFFFFF; -} -#head-search { - font-size:14px; -} -#head-username, #head-password { - font-size:14px; - width:80px; -} -#pageinfo { - clear:both; - color:#888888; - margin:0; - padding:0.6em 0; -} -#foot { - color:#888888; - font-style:normal; - text-align:center; -} -#foot a { - color:#AAAAFF; -} -#foot img { - vertical-align:middle; -} -div.toc { - background-color:#F0F0F0; - border:1px dotted #888888; - float:right; - font-size:95%; - margin:1em 0 1em 1em; -} -div.toc .tocheader { - font-weight:bold; - margin:0.5em 1em; -} -div.toc ol { - margin:1em 0.5em 1em 1em; - padding:0; -} -div.toc ol li { - margin:0 0 0 1em; - padding:0; -} -div.toc ol ol { - margin:0.5em 0.5em 0.5em 1em; - padding:0; -} -div.recentchanges table { - clear:both; -} -div#editor-help { - background-color:#F7F6F2; - border:1px dotted #888888; - font-size:90%; - padding:0 1ex 1ex; -} -div#preview { - margin-top:1em; -} -label.block { - display:block; - font-weight:bold; - text-align:right; -} -label.simple { - display:block; - font-weight:normal; - text-align:left; -} -label.block input.edit { - width:50%; -} -div.editor { - margin:0; -} -table { - border-collapse:collapse; - margin:0.5em 0; -} -td { - border:1pt solid #ADB9CC; - padding:0.25em; -} -td p { - margin:0; - padding:0; -} -.u { - text-decoration:underline; -} -.footnotes ul { - margin:0 0 1em; - padding:0 2em; -} -.footnotes li { - list-style:none; -} -.userpref table, .userpref td { - border:none; -} -#message { - background-color:#EEEEEE; - border-bottom-color:#CCCCCC; - border-bottom-style:solid; - border-bottom-width:2px; - clear:both; - padding:5px 10px; -} -#message p { - font-weight:bold; - margin:5px 0; - padding:0; -} -#message div.buttons { - font-weight:normal; -} -.diff { - width:99%; -} -.diff-title { - background-color:#C0C0C0; -} -.searchresult dd span { - font-weight:400; -} -.boxtext { - color:#000000; - float:none; - font-family:tahoma, arial, sans-serif; - font-size:11px; - padding:3px 0 0 10px; -} -.statusbutton { - cursor:pointer; - float:left; - height:32px; - margin-left:-32px; - margin-right:5px; - opacity:0; - width:32px; -} -.dlsize { - float:left; - padding-right:8px; -} -.dlspeed { - float:left; - padding-right:8px; -} -.package { - margin-bottom:10px; -} -.packagename { - font-weight:300; -} -.child { - margin-left:20px; -} -.child_status { - margin-right:10px; -} -.child_secrow { - font-size:10px; -} -.header, .header th { - background-color:#ECECEC; - font-weight:300; - text-align:left; -} -.progress_bar { - background-color:#00CC00; - height:5px; -} -.queue { - border:none; -} -.queue tr td { - border:none; -} -.header, .header th { - font-weight:normal; - text-align:left; -} -.clearer { - clear:both; - height:1px; -} -.left { - float:left; -} -.right { - float:right; -} -.setfield { - display:table-cell; -} -ul.tabs li a { - border:none; - border-bottom-left-radius:0; - border-bottom-right-radius:0; - border-top-left-radius:5px; - border-top-right-radius:5px; - font-weight:bold; - padding:5px 16px 4px 15px; -} -#tabs span { - display:none; -} -#tabs span.selected { - display:inline; -} -#tabsback { - background-color:#525252; - border-top-left-radius:3px; - border-top-right-radius:30px; - margin:2px 0 0; - padding:6px 4px 1px; -} -ul.tabs { - list-style-type:none; - margin:0; - padding:0 40px 0 0; -} -ul.tabs li { - display:inline; - margin-left:8px; -} -ul.tabs li a { - background-color:#EAEAEA; - border:1px none #C9C3BA; - border-bottom-left-radius:0; - border-bottom-right-radius:0; - border-top-left-radius:5px; - border-top-right-radius:5px; - color:#42454A; - font-weight:bold; - margin:0; - outline:0; - padding:5px 16px 4px 15px; - text-decoration:none; -} -ul.tabs li a.selected, ul.tabs li a:hover { - background-color:white; - border-bottom-left-radius:0; - border-bottom-right-radius:0; - color:#000000; -} -ul.tabs li a:hover { - background-color:#F1F4EE; -} -ul.tabs li a.selected { - background-color:#525252; - color:white; - font-weight:bold; - padding-bottom:5px; -} -#tabs-body { - overflow:hidden; - position:relative; -} -span.tabContent { - border:2px solid #525252; - margin:0; - padding:0 0 10px; -} -#tabs-body > span { - display:none; -} -#tabs-body > span.active { - display:block; -} -.hide { - display:none; -} -.settable { - border:none; - margin:20px; -} -.settable td { - border:none; - margin:0; - padding:5px; -} -.settable th { - padding-bottom:8px; -} -.settable.wide td, .settable.wide th { - padding-left:15px; - padding-right:15px; -} -ul.nav { - list-style:none; - margin:-30px 0 0; - padding:0; - position:absolute; -} -ul.nav li { - float:left; - padding:5px; - position:relative; -} -ul.nav > li a { - background-color:white; - border-left-color:#C9C3BA; - border-right-color:#C9C3BA; - border-style:solid solid none; - border-top-color:#C9C3BA; - border-width:1px 1px medium; - color:black; -} -ul.nav ul { - -webkit-box-shadow:#AAAAAA 1px 1px 5px; - background-color:#F1F1F1; - border:1px solid #AAAAAA; - box-shadow:#AAAAAA 1px 1px 5px; - cursor:pointer; - left:10px; - list-style:none; - margin:0; - padding:0; - position:absolute; - top:26px; -} -ul.nav .open { - display:block; -} -ul.nav .close { - display:none; -} -ul.nav ul li { - float:none; - padding:0; -} -ul.nav ul li a { - background-color:#F1F1F1; - display:block; - font-weight:normal; - padding:3px; - width:130px; -} -ul.nav ul li a:hover { - background-color:#CDCDCD; -} -ul.nav ul ul { - left:137px; - top:0; -} -.purr-wrapper { - margin:10px; -} -.purr-alert { - background-color:#000000; - border-bottom-left-radius:5px; - border-bottom-right-radius:5px; - border-top-left-radius:5px; - border-top-right-radius:5px; - color:#FFFFFF; - font-size:13px; - font-weight:bold; - margin-bottom:10px; - padding:10px; - width:300px; -} -.purr-alert.error { - background-color:#000000; - background-image:url(../img/error.png); - background-position:7px 10px; - background-repeat:no-repeat no-repeat; - color:#FF5555; - padding-left:30px; - width:280px; -} -.purr-alert.success { - background-color:#000000; - background-image:url(../img/success.png); - background-position:7px 10px; - background-repeat:no-repeat no-repeat; - color:#55FF55; - padding-left:30px; - width:280px; -} -.purr-alert.notice { - background-color:#000000; - background-image:url(../img/notice.png); - background-position:7px 10px; - background-repeat:no-repeat no-repeat; - color:#9999FF; - padding-left:30px; - width:280px; -} -table.system { - border:none; - margin-left:10px; -} -table.system td { - border:none; -} -table.system tr > td:first-child { - font-weight:bold; - padding-right:10px; -} \ No newline at end of file diff --git a/module/webui/themes/flat/css/log.css b/module/webui/themes/flat/css/log.css deleted file mode 100644 index af2ea4fe8..000000000 --- a/module/webui/themes/flat/css/log.css +++ /dev/null @@ -1,72 +0,0 @@ - -html, body, #content -{ - height: 100%; -} -#body-wrapper -{ - height: 70%; -} -.logdiv -{ - height: 90%; - width: 100%; - overflow: auto; - border: 2px solid #CCC; - outline: 1px solid #666; - background-color: #FFE; - margin-right: auto; - margin-left: auto; -} -.logform -{ - display: table; - margin: 0 auto 0 auto; - padding-top: 5px; -} -.logtable -{ - - margin: 0px; -} -.logtable td -{ - border: none; - white-space: nowrap; - - - font-family: monospace; - font-size: 16px; - margin: 0px; - padding: 0px 10px 0px 10px; - line-height: 110%; -} -td.logline -{ - background-color: #EEE; - text-align:right; - padding: 0px 5px 0px 5px; -} -td.loglevel -{ - text-align:right; -} -.logperpage -{ - float: right; - padding-bottom: 8px; -} -.logpaginator -{ - float: left; - padding-top: 5px; -} -.logpaginator a -{ - padding: 0px 8px 0px 8px; -} -.logwarn -{ - text-align: center; - color: red; -} \ No newline at end of file diff --git a/module/webui/themes/flat/css/pathchooser.css b/module/webui/themes/flat/css/pathchooser.css deleted file mode 100644 index 894cc335e..000000000 --- a/module/webui/themes/flat/css/pathchooser.css +++ /dev/null @@ -1,68 +0,0 @@ -table { - width: 90%; - border: 1px dotted #888888; - font-family: sans-serif; - font-size: 10pt; -} - -th { - background-color: #525252; - color: #E0E0E0; -} - -table, tr, td { - background-color: #F0F0F0; -} - -a, a:visited { - text-decoration: none; - font-weight: bold; -} - -#paths { - width: 90%; - text-align: left; -} - -.file_directory { - color: #c0c0c0; -} -.path_directory { - color: #3c3c3c; -} -.file_file { - color: #3c3c3c; -} -.path_file { - color: #c0c0c0; -} - -.parentdir { - color: #000000; - font-size: 10pt; -} -.name { - text-align: left; -} -.size { - text-align: right; -} -.type { - text-align: left; -} -.mtime { - text-align: center; -} - -.path_abs_rel { - color: #3c3c3c; - text-decoration: none; - font-weight: bold; - font-family: sans-serif; - font-size: 10pt; -} - -.path_abs_rel a { - color: #3c3c3c; - font-style: italic; -} diff --git a/module/webui/themes/flat/css/window.css b/module/webui/themes/flat/css/window.css deleted file mode 100644 index 12829868b..000000000 --- a/module/webui/themes/flat/css/window.css +++ /dev/null @@ -1,73 +0,0 @@ -/* ----------- stylized ----------- */ -.window_box h1{ - font-size:14px; - font-weight:bold; - margin-bottom:8px; -} -.window_box p{ - font-size:11px; - color:#666666; - margin-bottom:20px; - border-bottom:solid 1px #b7ddf2; - padding-bottom:10px; -} -.window_box label{ - display:block; - font-weight:bold; - text-align:right; - width:240px; - float:left; -} -.window_box .small{ - color:#666666; - display:block; - font-size:11px; - font-weight:normal; - text-align:right; - width:240px; -} -.window_box select, .window_box input{ - float:left; - font-size:12px; - padding:4px 2px; - border:solid 1px #aacfe4; - width:300px; - margin:2px 0 20px 10px; -} -.window_box .cont{ - float:left; - font-size:12px; - padding: 0px 10px 15px 0px; - width:300px; - margin:0px 0px 0px 10px; -} -.window_box .cont input{ - float: none; - margin: 0px 15px 0px 1px; -} -.window_box textarea{ - float:left; - font-size:12px; - padding:4px 2px; - border:solid 1px #aacfe4; - width:300px; - margin:2px 0 20px 10px; -} -.window_box button, .styled_button{ - clear:both; - margin-left:150px; - width:125px; - height:31px; - background:#666666 url(../img/button.png) no-repeat; - text-align:center; - line-height:31px; - color:#FFFFFF; - font-size:11px; - font-weight:bold; - border: 0px; -} - -.styled_button { - margin-left: 15px; - cursor: pointer; -} diff --git a/module/webui/themes/flat/img/MooDialog/dialog-close.png b/module/webui/themes/flat/img/MooDialog/dialog-close.png deleted file mode 100644 index 81ebb88b2..000000000 Binary files a/module/webui/themes/flat/img/MooDialog/dialog-close.png and /dev/null differ diff --git a/module/webui/themes/flat/img/MooDialog/dialog-error.png b/module/webui/themes/flat/img/MooDialog/dialog-error.png deleted file mode 100644 index d70328403..000000000 Binary files a/module/webui/themes/flat/img/MooDialog/dialog-error.png and /dev/null differ diff --git a/module/webui/themes/flat/img/MooDialog/dialog-question.png b/module/webui/themes/flat/img/MooDialog/dialog-question.png deleted file mode 100644 index b0af3db5b..000000000 Binary files a/module/webui/themes/flat/img/MooDialog/dialog-question.png and /dev/null differ diff --git a/module/webui/themes/flat/img/MooDialog/dialog-warning.png b/module/webui/themes/flat/img/MooDialog/dialog-warning.png deleted file mode 100644 index aad64d4be..000000000 Binary files a/module/webui/themes/flat/img/MooDialog/dialog-warning.png and /dev/null differ diff --git a/module/webui/themes/flat/img/arrow_refresh.png b/module/webui/themes/flat/img/arrow_refresh.png deleted file mode 100644 index b1b6fa4dc..000000000 Binary files a/module/webui/themes/flat/img/arrow_refresh.png and /dev/null differ diff --git a/module/webui/themes/flat/img/arrow_right.png b/module/webui/themes/flat/img/arrow_right.png deleted file mode 100644 index 68f379fc7..000000000 Binary files a/module/webui/themes/flat/img/arrow_right.png and /dev/null differ diff --git a/module/webui/themes/flat/img/button.png b/module/webui/themes/flat/img/button.png deleted file mode 100644 index bb408a7d6..000000000 Binary files a/module/webui/themes/flat/img/button.png and /dev/null differ diff --git a/module/webui/themes/flat/img/cog.png b/module/webui/themes/flat/img/cog.png deleted file mode 100644 index 833f779ac..000000000 Binary files a/module/webui/themes/flat/img/cog.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_add.png b/module/webui/themes/flat/img/control_add.png deleted file mode 100644 index e3f29fab2..000000000 Binary files a/module/webui/themes/flat/img/control_add.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_add_blue.png b/module/webui/themes/flat/img/control_add_blue.png deleted file mode 100644 index e3f29fab2..000000000 Binary files a/module/webui/themes/flat/img/control_add_blue.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_cancel.png b/module/webui/themes/flat/img/control_cancel.png deleted file mode 100644 index 07c9cad30..000000000 Binary files a/module/webui/themes/flat/img/control_cancel.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_cancel_blue.png b/module/webui/themes/flat/img/control_cancel_blue.png deleted file mode 100644 index 07c9cad30..000000000 Binary files a/module/webui/themes/flat/img/control_cancel_blue.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_pause.png b/module/webui/themes/flat/img/control_pause.png deleted file mode 100644 index 24e3705fa..000000000 Binary files a/module/webui/themes/flat/img/control_pause.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_pause_blue.png b/module/webui/themes/flat/img/control_pause_blue.png deleted file mode 100644 index 24e3705fa..000000000 Binary files a/module/webui/themes/flat/img/control_pause_blue.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_play.png b/module/webui/themes/flat/img/control_play.png deleted file mode 100644 index 15ced1e21..000000000 Binary files a/module/webui/themes/flat/img/control_play.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_play_blue.png b/module/webui/themes/flat/img/control_play_blue.png deleted file mode 100644 index 15ced1e21..000000000 Binary files a/module/webui/themes/flat/img/control_play_blue.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_stop.png b/module/webui/themes/flat/img/control_stop.png deleted file mode 100644 index 71215ef67..000000000 Binary files a/module/webui/themes/flat/img/control_stop.png and /dev/null differ diff --git a/module/webui/themes/flat/img/control_stop_blue.png b/module/webui/themes/flat/img/control_stop_blue.png deleted file mode 100644 index 71215ef67..000000000 Binary files a/module/webui/themes/flat/img/control_stop_blue.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/add_folder.png b/module/webui/themes/flat/img/default/add_folder.png deleted file mode 100644 index 8acbc411b..000000000 Binary files a/module/webui/themes/flat/img/default/add_folder.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/ajax-loader.gif b/module/webui/themes/flat/img/default/ajax-loader.gif deleted file mode 100644 index 2fd8e0737..000000000 Binary files a/module/webui/themes/flat/img/default/ajax-loader.gif and /dev/null differ diff --git a/module/webui/themes/flat/img/default/big_button.gif b/module/webui/themes/flat/img/default/big_button.gif deleted file mode 100644 index 7680490ea..000000000 Binary files a/module/webui/themes/flat/img/default/big_button.gif and /dev/null differ diff --git a/module/webui/themes/flat/img/default/big_button_over.gif b/module/webui/themes/flat/img/default/big_button_over.gif deleted file mode 100644 index 2e3ee10d2..000000000 Binary files a/module/webui/themes/flat/img/default/big_button_over.gif and /dev/null differ diff --git a/module/webui/themes/flat/img/default/body.png b/module/webui/themes/flat/img/default/body.png deleted file mode 100644 index 7ff1043e0..000000000 Binary files a/module/webui/themes/flat/img/default/body.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/closebtn.gif b/module/webui/themes/flat/img/default/closebtn.gif deleted file mode 100644 index 3e27e6030..000000000 Binary files a/module/webui/themes/flat/img/default/closebtn.gif and /dev/null differ diff --git a/module/webui/themes/flat/img/default/drag_corner.gif b/module/webui/themes/flat/img/default/drag_corner.gif deleted file mode 100644 index befb1adf1..000000000 Binary files a/module/webui/themes/flat/img/default/drag_corner.gif and /dev/null differ diff --git a/module/webui/themes/flat/img/default/full.png b/module/webui/themes/flat/img/default/full.png deleted file mode 100644 index fea52af76..000000000 Binary files a/module/webui/themes/flat/img/default/full.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/head-menu-recent.png b/module/webui/themes/flat/img/default/head-menu-recent.png deleted file mode 100644 index fc9b0497f..000000000 Binary files a/module/webui/themes/flat/img/default/head-menu-recent.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/head_bg1.png b/module/webui/themes/flat/img/default/head_bg1.png deleted file mode 100644 index f2848c3cc..000000000 Binary files a/module/webui/themes/flat/img/default/head_bg1.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/images.png b/module/webui/themes/flat/img/default/images.png deleted file mode 100644 index 184860d1e..000000000 Binary files a/module/webui/themes/flat/img/default/images.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/parseUri.png b/module/webui/themes/flat/img/default/parseUri.png deleted file mode 100644 index 937bded9d..000000000 Binary files a/module/webui/themes/flat/img/default/parseUri.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/pyload-logo.png b/module/webui/themes/flat/img/default/pyload-logo.png deleted file mode 100644 index 2443cd8b1..000000000 Binary files a/module/webui/themes/flat/img/default/pyload-logo.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/tab-background.png b/module/webui/themes/flat/img/default/tab-background.png deleted file mode 100644 index 29a5d1991..000000000 Binary files a/module/webui/themes/flat/img/default/tab-background.png and /dev/null differ diff --git a/module/webui/themes/flat/img/default/tabs-border-bottom.png b/module/webui/themes/flat/img/default/tabs-border-bottom.png deleted file mode 100644 index 02440f428..000000000 Binary files a/module/webui/themes/flat/img/default/tabs-border-bottom.png and /dev/null differ diff --git a/module/webui/themes/flat/img/delete.png b/module/webui/themes/flat/img/delete.png deleted file mode 100644 index 4539cff12..000000000 Binary files a/module/webui/themes/flat/img/delete.png and /dev/null differ diff --git a/module/webui/themes/flat/img/error.png b/module/webui/themes/flat/img/error.png deleted file mode 100644 index 6c565c99c..000000000 Binary files a/module/webui/themes/flat/img/error.png and /dev/null differ diff --git a/module/webui/themes/flat/img/folder.png b/module/webui/themes/flat/img/folder.png deleted file mode 100644 index 0b067dd3c..000000000 Binary files a/module/webui/themes/flat/img/folder.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-login.png b/module/webui/themes/flat/img/head-login.png deleted file mode 100644 index 6b57515bc..000000000 Binary files a/module/webui/themes/flat/img/head-login.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-menu-collector.png b/module/webui/themes/flat/img/head-menu-collector.png deleted file mode 100644 index bbcbe6406..000000000 Binary files a/module/webui/themes/flat/img/head-menu-collector.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-menu-config.png b/module/webui/themes/flat/img/head-menu-config.png deleted file mode 100644 index 93e8f83ac..000000000 Binary files a/module/webui/themes/flat/img/head-menu-config.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-menu-development.png b/module/webui/themes/flat/img/head-menu-development.png deleted file mode 100644 index 33d8b062f..000000000 Binary files a/module/webui/themes/flat/img/head-menu-development.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-menu-download.png b/module/webui/themes/flat/img/head-menu-download.png deleted file mode 100644 index 3691deebc..000000000 Binary files a/module/webui/themes/flat/img/head-menu-download.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-menu-home.png b/module/webui/themes/flat/img/head-menu-home.png deleted file mode 100644 index b77bef5eb..000000000 Binary files a/module/webui/themes/flat/img/head-menu-home.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-menu-index.png b/module/webui/themes/flat/img/head-menu-index.png deleted file mode 100644 index 8bc6e9604..000000000 Binary files a/module/webui/themes/flat/img/head-menu-index.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-menu-news.png b/module/webui/themes/flat/img/head-menu-news.png deleted file mode 100644 index 44e79a9a9..000000000 Binary files a/module/webui/themes/flat/img/head-menu-news.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-menu-queue.png b/module/webui/themes/flat/img/head-menu-queue.png deleted file mode 100644 index e4fa41ad8..000000000 Binary files a/module/webui/themes/flat/img/head-menu-queue.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-menu-wiki.png b/module/webui/themes/flat/img/head-menu-wiki.png deleted file mode 100644 index 61b0e54ea..000000000 Binary files a/module/webui/themes/flat/img/head-menu-wiki.png and /dev/null differ diff --git a/module/webui/themes/flat/img/head-search-noshadow.png b/module/webui/themes/flat/img/head-search-noshadow.png deleted file mode 100644 index 16d39bd06..000000000 Binary files a/module/webui/themes/flat/img/head-search-noshadow.png and /dev/null differ diff --git a/module/webui/themes/flat/img/notice.png b/module/webui/themes/flat/img/notice.png deleted file mode 100644 index a52b067cb..000000000 Binary files a/module/webui/themes/flat/img/notice.png and /dev/null differ diff --git a/module/webui/themes/flat/img/package_go.png b/module/webui/themes/flat/img/package_go.png deleted file mode 100644 index 80b2c42ee..000000000 Binary files a/module/webui/themes/flat/img/package_go.png and /dev/null differ diff --git a/module/webui/themes/flat/img/page-tools-backlinks.png b/module/webui/themes/flat/img/page-tools-backlinks.png deleted file mode 100644 index fb8f55b38..000000000 Binary files a/module/webui/themes/flat/img/page-tools-backlinks.png and /dev/null differ diff --git a/module/webui/themes/flat/img/page-tools-edit.png b/module/webui/themes/flat/img/page-tools-edit.png deleted file mode 100644 index 67177cf89..000000000 Binary files a/module/webui/themes/flat/img/page-tools-edit.png and /dev/null differ diff --git a/module/webui/themes/flat/img/page-tools-revisions.png b/module/webui/themes/flat/img/page-tools-revisions.png deleted file mode 100644 index 088fe0087..000000000 Binary files a/module/webui/themes/flat/img/page-tools-revisions.png and /dev/null differ diff --git a/module/webui/themes/flat/img/pencil.png b/module/webui/themes/flat/img/pencil.png deleted file mode 100644 index e39c93cd8..000000000 Binary files a/module/webui/themes/flat/img/pencil.png and /dev/null differ diff --git a/module/webui/themes/flat/img/reconnect.png b/module/webui/themes/flat/img/reconnect.png deleted file mode 100644 index cd35c9325..000000000 Binary files a/module/webui/themes/flat/img/reconnect.png and /dev/null differ diff --git a/module/webui/themes/flat/img/status_None.png b/module/webui/themes/flat/img/status_None.png deleted file mode 100644 index 1400d3eb3..000000000 Binary files a/module/webui/themes/flat/img/status_None.png and /dev/null differ diff --git a/module/webui/themes/flat/img/status_downloading.png b/module/webui/themes/flat/img/status_downloading.png deleted file mode 100644 index db8ad8cd6..000000000 Binary files a/module/webui/themes/flat/img/status_downloading.png and /dev/null differ diff --git a/module/webui/themes/flat/img/status_failed.png b/module/webui/themes/flat/img/status_failed.png deleted file mode 100644 index 6c565c99c..000000000 Binary files a/module/webui/themes/flat/img/status_failed.png and /dev/null differ diff --git a/module/webui/themes/flat/img/status_finished.png b/module/webui/themes/flat/img/status_finished.png deleted file mode 100644 index 2c4aca40d..000000000 Binary files a/module/webui/themes/flat/img/status_finished.png and /dev/null differ diff --git a/module/webui/themes/flat/img/status_offline.png b/module/webui/themes/flat/img/status_offline.png deleted file mode 100644 index 6c565c99c..000000000 Binary files a/module/webui/themes/flat/img/status_offline.png and /dev/null differ diff --git a/module/webui/themes/flat/img/status_proc.png b/module/webui/themes/flat/img/status_proc.png deleted file mode 100644 index 833f779ac..000000000 Binary files a/module/webui/themes/flat/img/status_proc.png and /dev/null differ diff --git a/module/webui/themes/flat/img/status_queue.png b/module/webui/themes/flat/img/status_queue.png deleted file mode 100644 index 1400d3eb3..000000000 Binary files a/module/webui/themes/flat/img/status_queue.png and /dev/null differ diff --git a/module/webui/themes/flat/img/status_waiting.png b/module/webui/themes/flat/img/status_waiting.png deleted file mode 100644 index fd038175e..000000000 Binary files a/module/webui/themes/flat/img/status_waiting.png and /dev/null differ diff --git a/module/webui/themes/flat/img/success.png b/module/webui/themes/flat/img/success.png deleted file mode 100644 index 2c4aca40d..000000000 Binary files a/module/webui/themes/flat/img/success.png and /dev/null differ diff --git a/module/webui/themes/flat/img/user-actions-logout.png b/module/webui/themes/flat/img/user-actions-logout.png deleted file mode 100644 index d4ef360e8..000000000 Binary files a/module/webui/themes/flat/img/user-actions-logout.png and /dev/null differ diff --git a/module/webui/themes/flat/img/user-actions-profile.png b/module/webui/themes/flat/img/user-actions-profile.png deleted file mode 100644 index 9ec410b13..000000000 Binary files a/module/webui/themes/flat/img/user-actions-profile.png and /dev/null differ diff --git a/module/webui/themes/flat/img/user-info.png b/module/webui/themes/flat/img/user-info.png deleted file mode 100644 index 345ed52e4..000000000 Binary files a/module/webui/themes/flat/img/user-info.png and /dev/null differ diff --git a/module/webui/themes/flat/js/render/admin.coffee b/module/webui/themes/flat/js/render/admin.coffee deleted file mode 100644 index 5afbcbb66..000000000 --- a/module/webui/themes/flat/js/render/admin.coffee +++ /dev/null @@ -1,58 +0,0 @@ -root = this - -window.addEvent "domready", -> - - root.passwordDialog = new MooDialog {destroyOnHide: false} - root.passwordDialog.setContent $ 'password_box' - - $("login_password_reset").addEvent "click", (e) -> root.passwordDialog.close() - $("login_password_button").addEvent "click", (e) -> - - newpw = $("login_new_password").get("value") - newpw2 = $("login_new_password2").get("value") - - if newpw is newpw2 - form = $("password_form") - form.set "send", { - onSuccess: (data) -> - root.notify.alert "Success", { - 'className': 'success' - } - onFailure: (data) -> - root.notify.alert "Error", { - 'className': 'error' - } - } - - form.send() - - root.passwordDialog.close() - else - alert '{{_("Passwords did not match.")}}' - - e.stop() - - for item in $$(".change_password") - id = item.get("id") - user = id.split("|")[1] - $("user_login").set("value", user) - item.addEvent "click", (e) -> root.passwordDialog.open() - - $('quit-pyload').addEvent "click", (e) -> - new MooDialog.Confirm "{{_('You are really sure you want to quit pyLoad?')}}", -> - new Request.JSON({ - url: '/api/kill' - method: 'get' - }).send() - , -> - e.stop() - - $('restart-pyload').addEvent "click", (e) -> - new MooDialog.Confirm "{{_('Are you sure you want to restart pyLoad?')}}", -> - new Request.JSON({ - url: '/api/restart' - method: 'get' - onSuccess: (data) -> alert "{{_('pyLoad restarted')}}" - }).send() - , -> - e.stop() diff --git a/module/webui/themes/flat/js/render/admin.min.js b/module/webui/themes/flat/js/render/admin.min.js deleted file mode 100644 index 94a5e494d..000000000 --- a/module/webui/themes/flat/js/render/admin.min.js +++ /dev/null @@ -1,3 +0,0 @@ -{% autoescape true %} -var root;root=this;window.addEvent("domready",function(){var f,c,b,e,a,d;root.passwordDialog=new MooDialog({destroyOnHide:false});root.passwordDialog.setContent($("password_box"));$("login_password_reset").addEvent("click",function(g){return root.passwordDialog.close()});$("login_password_button").addEvent("click",function(j){var h,i,g;i=$("login_new_password").get("value");g=$("login_new_password2").get("value");if(i===g){h=$("password_form");h.set("send",{onSuccess:function(k){return root.notify.alert("Success",{className:"success"})},onFailure:function(k){return root.notify.alert("Error",{className:"error"})}});h.send();root.passwordDialog.close()}else{alert('{{_("Passwords did not match.")}}')}return j.stop()});d=$$(".change_password");for(e=0,a=d.length;e - filesizename = new Array("B", "KiB", "MiB", "GiB", "TiB", "PiB") - loga = Math.log(size) / Math.log(1024) - i = Math.floor(loga) - a = Math.pow(1024, i) - if size is 0 then "0 B" else (Math.round(size * 100 / a) / 100 + " " + filesizename[i]) - - -parseUri = () -> - oldString = $("add_links").value - regxp = new RegExp('(ht|f)tp(s?):\/\/[a-zA-Z0-9\-\.\/\?=_&%#]+[<| |\"|\'|\r|\n|\t]{1}', 'g') - resu = oldString.match regxp - return if resu == null - res = "" - - for part in resu - if part.indexOf(" ") != -1 - res = res + part.replace(" ", " \n") - else if part.indexOf("\t") != -1 - res = res + part.replace("\t", " \n") - else if part.indexOf("\r") != -1 - res = res + part.replace("\r", " \n") - else if part.indexOf("\"") != -1 - res = res + part.replace("\"", " \n") - else if part.indexOf("<") != -1 - res = res + part.replace("<", " \n") - else if part.indexOf("'") != -1 - res = res + part.replace("'", " \n") - else - res = res + part.replace("\n", " \n") - - $("add_links").value = res - - -Array::remove = (from, to) -> - rest = this.slice((to || from) + 1 || this.length) - this.length = from < 0 ? this.length + from : from - return [] if this.length == 0 - return this.push.apply(this, rest) - - -document.addEvent "domready", -> - - # global notification - root.notify = new Purr { - 'mode': 'top' - 'position': 'center' - } - - root.captchaBox = new MooDialog {destroyOnHide: false} - root.captchaBox.setContent $ 'cap_box' - - root.addBox = new MooDialog {destroyOnHide: false} - root.addBox.setContent $ 'add_box' - - $('add_form').onsubmit = -> - $('add_form').target = 'upload_target' - if $('add_name').value is "" and $('add_file').value is "" - alert '{{_("Please Enter a packagename.")}}' - return false - else - root.addBox.close() - return true - - $('add_reset').addEvent 'click', -> root.addBox.close() - - $('action_add').addEvent 'click', -> $("add_form").reset(); root.addBox.open() - $('action_play').addEvent 'click', -> new Request({method: 'get', url: '/api/unpauseServer'}).send() - $('action_cancel').addEvent 'click', -> new Request({method: 'get', url: '/api/stopAllDownloads'}).send() - $('action_stop').addEvent 'click', -> new Request({method: 'get', url: '/api/pauseServer'}).send() - - - # captcha events - - $('cap_info').addEvent 'click', -> - load_captcha "get", "" - root.captchaBox.open() - $('cap_reset').addEvent 'click', -> root.captchaBox.close() - $('cap_form').addEvent 'submit', (e) -> - submit_captcha() - e.stop() - - $('cap_positional').addEvent 'click', on_captcha_click - - new Request.JSON({ - url: "/json/status" - onSuccess: LoadJsonToContent - secure: false - async: true - initialDelay: 0 - delay: 4000 - limit: 3000 - }).startTimer() - - -LoadJsonToContent = (data) -> - $("speed").set 'text', humanFileSize(data.speed)+"/s" - $("aktiv").set 'text', data.active - $("aktiv_from").set 'text', data.queue - $("aktiv_total").set 'text', data.total - - if data.captcha - if $("cap_info").getStyle("display") != "inline" - $("cap_info").setStyle 'display', 'inline' - root.notify.alert '{{_("New Captcha Request")}}', { - 'className': 'notify' - } - else - $("cap_info").setStyle 'display', 'none' - - - if data.download - $("time").set 'text', ' {{_("on")}}' - $("time").setStyle 'background-color', "#8ffc25" - else - $("time").set 'text', ' {{_("off")}}' - $("time").setStyle 'background-color', "#fc6e26" - - if data.reconnect - $("reconnect").set 'text', ' {{_("on")}}' - $("reconnect").setStyle 'background-color', "#8ffc25" - else - $("reconnect").set 'text', ' {{_("off")}}' - $("reconnect").setStyle 'background-color', "#fc6e26" - - return null - - -set_captcha = (data) -> - $('cap_id').set 'value', data.id - if (data.result_type is 'textual') - $('cap_textual_img').set 'src', data.src - $('cap_title').set 'text', '{{_("Please read the text on the captcha.")}}' - $('cap_submit').setStyle 'display', 'inline' - $('cap_textual').setStyle 'display', 'block' - $('cap_positional').setStyle 'display', 'none' - - else if (data.result_type == 'positional') - $('cap_positional_img').set('src', data.src) - $('cap_title').set('text', '{{_("Please click on the right captcha position.")}}') - $('cap_submit').setStyle('display', 'none') - $('cap_textual').setStyle('display', 'none') - - -load_captcha = (method, post) -> - new Request.JSON({ - url: "/json/set_captcha" - onSuccess: (data) -> set_captcha(data) if data.captcha else clear_captcha() - secure: false - async: true - method: method - }).send(post) - - -clear_captcha = -> - $('cap_textual').setStyle 'display', 'none' - $('cap_textual_img').set 'src', '' - $('cap_positional').setStyle 'display', 'none' - $('cap_positional_img').set 'src', '' - $('cap_title').set 'text', '{{_("No Captchas to read.")}}' - - -submit_captcha = -> - load_captcha("post", "cap_id=" + $('cap_id').get('value') + "&cap_result=" + $('cap_result').get('value') ) - $('cap_result').set('value', '') - - -on_captcha_click = (e) -> - position = e.target.getPosition() - x = e.page.x - position.x - y = e.page.y - position.y - $('cap_result').value = x + "," + y - submit_captcha() diff --git a/module/webui/themes/flat/js/render/base.min.js b/module/webui/themes/flat/js/render/base.min.js deleted file mode 100644 index 1ba1d73f9..000000000 --- a/module/webui/themes/flat/js/render/base.min.js +++ /dev/null @@ -1,3 +0,0 @@ -{% autoescape true %} -var LoadJsonToContent,clear_captcha,humanFileSize,load_captcha,on_captcha_click,parseUri,root,set_captcha,submit_captcha;root=this;humanFileSize=function(f){var c,d,e,b;d=new Array("B","KiB","MiB","GiB","TiB","PiB");b=Math.log(f)/Math.log(1024);e=Math.floor(b);c=Math.pow(1024,e);if(f===0){return"0 B"}else{return Math.round(f*100/c)/100+" "+d[e]}};parseUri=function(){var b,c,g,e,d,f,a;b=$("add_links").value;g=new RegExp("(ht|f)tp(s?)://[a-zA-Z0-9-./?=_&%#]+[<| |\"|'|\r|\n|\t]{1}","g");d=b.match(g);if(d===null){return}e="";for(f=0,a=d.length;f 0) { - window.location.reload() - } else { - this.packages.each(function(pack) { - pack.close(); - }); - indicateSuccess(); - } - }.bind(this), - onFailure: indicateFail - }).send(); - }, - - restartFailed: function() { - indicateLoad(); - new Request.JSON({ - method: 'get', - url: '/api/restartFailed', - onSuccess: function(data) { - this.packages.each(function(pack) { - pack.close(); - }); - indicateSuccess(); - }.bind(this), - onFailure: indicateFail - }).send(); - }, - - startSort: function(ele, copy) { - }, - - saveSort: function(ele, copy) { - var order = []; - this.sorts.serialize(function(li, pos) { - if (li == ele && ele.retrieve("order") != pos) { - order.push(ele.retrieve("pid") + "|" + pos) - } - li.store("order", pos) - }); - if (order.length > 0) { - indicateLoad(); - new Request.JSON({ - method: 'get', - url: '/json/package_order/' + order[0], - onSuccess: indicateFinish, - onFailure: indicateFail - }).send(); - } - } - -}); - -var Package = new Class({ - initialize: function(ui, id, ele, data) { - this.ui = ui; - this.id = id; - this.linksLoaded = false; - - if (!ele) { - this.createElement(data); - } else { - this.ele = ele; - this.order = ele.getElements("div.order")[0].get("html"); - this.ele.store("order", this.order); - this.ele.store("pid", this.id); - this.parseElement(); - } - - var pname = this.ele.getElements(".packagename")[0]; - this.buttons = new Fx.Tween(this.ele.getElements(".buttons")[0], {link: "cancel"}); - this.buttons.set("opacity", 0); - - pname.addEvent("mouseenter", function(e) { - this.buttons.start("opacity", 1) - }.bind(this)); - - pname.addEvent("mouseleave", function(e) { - this.buttons.start("opacity", 0) - }.bind(this)); - - - }, - - createElement: function() { - alert("create") - }, - - parseElement: function() { - var imgs = this.ele.getElements('img'); - - this.name = this.ele.getElements('.name')[0]; - this.folder = this.ele.getElements('.folder')[0]; - this.password = this.ele.getElements('.password')[0]; - - imgs[1].addEvent('click', this.deletePackage.bind(this)); - imgs[2].addEvent('click', this.restartPackage.bind(this)); - imgs[3].addEvent('click', this.editPackage.bind(this)); - imgs[4].addEvent('click', this.movePackage.bind(this)); - - this.ele.getElement('.packagename').addEvent('click', this.toggle.bind(this)); - - }, - - loadLinks: function() { - indicateLoad(); - new Request.JSON({ - method: 'get', - url: '/json/package/' + this.id, - onSuccess: this.createLinks.bind(this), - onFailure: indicateFail - }).send(); - }, - - createLinks: function(data) { - var ul = $("sort_children_{id}".substitute({'id': this.id})); - ul.set("html", ""); - data.links.each(function(link) { - link.id = link.fid; - var li = new Element("li", { - 'style': { - 'margin-left': 0 - } - }); - - var html = "\n".substitute({'icon': link.icon}); - html += "{name}
        ".substitute({'url': link.url, 'name': link.name}); - html += "{statusmsg}{error} ".substitute({'statusmsg': link.statusmsg, 'error':link.error}); - html += "{format_size}".substitute({'format_size': link.format_size}); - html += "{plugin}  ".substitute({'plugin': link.plugin}); - html += "  "; - html += "
        "; - - var div = new Element("div", { - 'id': "file_" + link.id, - 'class': "child", - 'html': html - }); - - li.store("order", link.order); - li.store("lid", link.id); - - li.adopt(div); - ul.adopt(li); - }); - this.sorts = new Sortables(ul, { - constrain: false, - clone: true, - revert: true, - opacity: 0.4, - handle: ".sorthandle", - onComplete: this.saveSort.bind(this) - }); - this.registerLinkEvents(); - this.linksLoaded = true; - indicateFinish(); - this.toggle(); - }, - - registerLinkEvents: function() { - this.ele.getElements('.child').each(function(child) { - var lid = child.get('id').match(/[0-9]+/); - var imgs = child.getElements('.child_secrow img'); - imgs[0].addEvent('click', function(e) { - new Request({ - method: 'get', - url: '/api/deleteFiles/[' + this + "]", - onSuccess: function() { - $('file_' + this).nix() - }.bind(this), - onFailure: indicateFail - }).send(); - }.bind(lid)); - - imgs[1].addEvent('click', function(e) { - new Request({ - method: 'get', - url: '/api/restartFile/' + this, - onSuccess: function() { - var ele = $('file_' + this); - var imgs = ele.getElements("img"); - imgs[0].set("src", "../img/status_queue.png"); - var spans = ele.getElements(".child_status"); - spans[1].set("html", "queued"); - indicateSuccess(); - }.bind(this), - onFailure: indicateFail - }).send(); - }.bind(lid)); - }); - }, - - toggle: function() { - var child = this.ele.getElement('.children'); - if (child.getStyle('display') == "block") { - child.dissolve(); - } else { - if (!this.linksLoaded) { - this.loadLinks(); - } else { - child.reveal(); - } - } - }, - - - deletePackage: function(event) { - indicateLoad(); - new Request({ - method: 'get', - url: '/api/deletePackages/[' + this.id + "]", - onSuccess: function() { - this.ele.nix(); - indicateFinish(); - }.bind(this), - onFailure: indicateFail - }).send(); - //hide_pack(); - event.stop(); - }, - - restartPackage: function(event) { - indicateLoad(); - new Request({ - method: 'get', - url: '/api/restartPackage/' + this.id, - onSuccess: function() { - this.close(); - indicateSuccess(); - }.bind(this), - onFailure: indicateFail - }).send(); - event.stop(); - }, - - close: function() { - var child = this.ele.getElement('.children'); - if (child.getStyle('display') == "block") { - child.dissolve(); - } - var ul = $("sort_children_{id}".substitute({'id': this.id})); - ul.erase("html"); - this.linksLoaded = false; - }, - - movePackage: function(event) { - indicateLoad(); - new Request({ - method: 'get', - url: '/json/move_package/' + ((this.ui.type + 1) % 2) + "/" + this.id, - onSuccess: function() { - this.ele.nix(); - indicateFinish(); - }.bind(this), - onFailure: indicateFail - }).send(); - event.stop(); - }, - - editPackage: function(event) { - $("pack_form").removeEvents("submit"); - $("pack_form").addEvent("submit", this.savePackage.bind(this)); - - $("pack_id").set("value", this.id); - $("pack_name").set("value", this.name.get("text")); - $("pack_folder").set("value", this.folder.get("text")); - $("pack_pws").set("value", this.password.get("text")); - - root.packageBox.open(); - event.stop(); - }, - - savePackage: function(event) { - $("pack_form").send(); - this.name.set("text", $("pack_name").get("value")); - this.folder.set("text", $("pack_folder").get("value")); - this.password.set("text", $("pack_pws").get("value")); - root.packageBox.close(); - event.stop(); - }, - - saveSort: function(ele, copy) { - var order = []; - this.sorts.serialize(function(li, pos) { - if (li == ele && ele.retrieve("order") != pos) { - order.push(ele.retrieve("lid") + "|" + pos) - } - li.store("order", pos) - }); - if (order.length > 0) { - indicateLoad(); - new Request.JSON({ - method: 'get', - url: '/json/link_order/' + order[0], - onSuccess: indicateFinish, - onFailure: indicateFail - }).send(); - } - } - -}); diff --git a/module/webui/themes/flat/js/render/settings.coffee b/module/webui/themes/flat/js/render/settings.coffee deleted file mode 100644 index d522741b9..000000000 --- a/module/webui/themes/flat/js/render/settings.coffee +++ /dev/null @@ -1,107 +0,0 @@ -root = this - -window.addEvent 'domready', -> - root.accountDialog = new MooDialog {destroyOnHide: false} - root.accountDialog.setContent $ 'account_box' - - new TinyTab $$('#toptabs li a'), $$('#tabs-body > span') - - $$('ul.nav').each (nav) -> - new MooDropMenu nav, { - onOpen: (el) -> el.fade 'in' - onClose: (el) -> el.fade 'out' - onInitialize: (el) -> el.fade('hide').set 'tween', {duration:500} - } - - new SettingsUI() - - -class SettingsUI - constructor: -> - @menu = $$ "#general-menu li" - @menu.append $$ "#plugin-menu li" - - @name = $ "tabsback" - @general = $ "general_form_content" - @plugin = $ "plugin_form_content" - - el.addEvent 'click', @menuClick.bind(this) for el in @menu - - $("general|submit").addEvent "click", @configSubmit.bind(this) - $("plugin|submit").addEvent "click", @configSubmit.bind(this) - - $("account_add").addEvent "click", (e) -> - root.accountDialog.open() - e.stop() - - $("account_reset").addEvent "click", (e) -> - root.accountDialog.close() - - $("account_add_button").addEvent "click", @addAccount.bind(this) - $("account_submit").addEvent "click", @submitAccounts.bind(this) - - - menuClick: (e) -> - [category, section] = e.target.get("id").split("|") - name = e.target.get "text" - - - target = if category is "general" then @general else @plugin - target.dissolve() - - new Request({ - "method" : "get" - "url" : "/json/load_config/#{category}/#{section}" - 'onSuccess': (data) => - target.set "html", data - target.reveal() - this.name.set "text", name - }).send() - - - configSubmit: (e) -> - category = e.target.get("id").split("|")[0] - form = $("#{category}_form") - - form.set "send", { - 'method': "post" - 'url': "/json/save_config/#{category}" - "onSuccess" : -> - root.notify.alert '{{ _("Settings saved.")}}', { - 'className': 'success' - } - 'onFailure': -> - root.notify.alert '{{ _("Error occured.")}}', { - 'className': 'error' - } - } - form.send() - e.stop() - - addAccount: (e) -> - form = $ "add_account_form" - form.set "send", { - 'method': "post" - "onSuccess" : -> window.location.reload() - 'onFailure': -> - root.notify.alert '{{_("Error occured.")}}', { - 'className': 'error' - } - } - - form.send() - e.stop() - - submitAccounts: (e) -> - form = $ "account_form" - form.set "send", { - 'method': "post", - "onSuccess" : -> window.location.reload() - 'onFailure': -> - root.notify.alert('{{ _("Error occured.") }}', { - 'className': 'error' - }) - } - - form.send() - e.stop() diff --git a/module/webui/themes/flat/js/render/settings.min.js b/module/webui/themes/flat/js/render/settings.min.js deleted file mode 100644 index 41d1cb25a..000000000 --- a/module/webui/themes/flat/js/render/settings.min.js +++ /dev/null @@ -1,3 +0,0 @@ -{% autoescape true %} -var SettingsUI,root;var __bind=function(a,b){return function(){return a.apply(b,arguments)}};root=this;window.addEvent("domready",function(){root.accountDialog=new MooDialog({destroyOnHide:false});root.accountDialog.setContent($("account_box"));new TinyTab($$("#toptabs li a"),$$("#tabs-body > span"));$$("ul.nav").each(function(a){return new MooDropMenu(a,{onOpen:function(b){return b.fade("in")},onClose:function(b){return b.fade("out")},onInitialize:function(b){return b.fade("hide").set("tween",{duration:500})}})});return new SettingsUI()});SettingsUI=(function(){function a(){var c,e,b,d;this.menu=$$("#general-menu li");this.menu.append($$("#plugin-menu li"));this.name=$("tabsback");this.general=$("general_form_content");this.plugin=$("plugin_form_content");d=this.menu;for(e=0,b=d.length;e*/// IE 6 scroll - if ((options.scroll && Browser.ie6) || options.forceScroll){ - wrapper.setStyle('position', 'absolute'); - var position = wrapper.getPosition(options.inject); - window.addEvent('scroll', function(){ - var scroll = document.getScroll(); - wrapper.setPosition({ - x: position.x + scroll.x, - y: position.y + scroll.y - }); - }); - } - /**/ - - if (options.useEscKey){ - // Add event for the esc key - document.addEvent('keydown', function(e){ - if (e.key == 'esc') this.close(); - }.bind(this)); - } - - this.addEvent('hide', function(){ - if (options.destroyOnHide) this.destroy(); - }.bind(this)); - - this.fireEvent('initialize', wrapper); - }, - - setContent: function(){ - var content = Array.from(arguments); - if (content.length == 1) content = content[0]; - - this.content.empty(); - - var type = typeOf(content); - if (['string', 'number'].contains(type)) this.content.set('text', content); - else this.content.adopt(content); - - this.fireEvent('contentChange', this.content); - - return this; - }, - - open: function(){ - this.fireEvent('beforeOpen', this.wrapper).fireEvent('open'); - this.opened = true; - return this; - }, - - close: function(){ - this.fireEvent('beforeClose', this.wrapper).fireEvent('close'); - this.opened = false; - return this; - }, - - destroy: function(){ - this.wrapper.destroy(); - }, - - toElement: function(){ - return this.wrapper; - } - -}); - - -Element.implement({ - - MooDialog: function(options){ - this.store('MooDialog', - new MooDialog(options).setContent(this).open() - ); - return this; - } - -}); diff --git a/module/webui/themes/flat/js/static/MooDialog.min.js b/module/webui/themes/flat/js/static/MooDialog.min.js deleted file mode 100644 index 90b3ae100..000000000 --- a/module/webui/themes/flat/js/static/MooDialog.min.js +++ /dev/null @@ -1 +0,0 @@ -var MooDialog=new Class({Implements:[Options,Events],options:{"class":"MooDialog",title:null,scroll:!0,forceScroll:!1,useEscKey:!0,destroyOnHide:!0,autoOpen:!0,closeButton:!0,onInitialize:function(){this.wrapper.setStyle("display","none")},onBeforeOpen:function(){this.wrapper.setStyle("display","block"),this.fireEvent("show")},onBeforeClose:function(){this.wrapper.setStyle("display","none"),this.fireEvent("hide")}},initialize:function(t){this.setOptions(t),this.options.inject=this.options.inject||document.body,t=this.options;var e=this.wrapper=new Element("div."+t["class"].replace(" ",".")).inject(t.inject);if(this.content=new Element("div.content").inject(e),t.title&&(this.title=new Element("div.title").set("text",t.title).inject(e),e.addClass("MooDialogTitle")),t.closeButton&&(this.closeButton=new Element("a.close",{events:{click:this.close.bind(this)}}).inject(e)),t.scroll&&Browser.ie6||t.forceScroll){e.setStyle("position","absolute");var n=e.getPosition(t.inject);window.addEvent("scroll",function(){var t=document.getScroll();e.setPosition({x:n.x+t.x,y:n.y+t.y})})}t.useEscKey&&document.addEvent("keydown",function(t){"esc"==t.key&&this.close()}.bind(this)),this.addEvent("hide",function(){t.destroyOnHide&&this.destroy()}.bind(this)),this.fireEvent("initialize",e)},setContent:function(){var t=Array.from(arguments);1==t.length&&(t=t[0]),this.content.empty();var e=typeOf(t);return["string","number"].contains(e)?this.content.set("text",t):this.content.adopt(t),this.fireEvent("contentChange",this.content),this},open:function(){return this.fireEvent("beforeOpen",this.wrapper).fireEvent("open"),this.opened=!0,this},close:function(){return this.fireEvent("beforeClose",this.wrapper).fireEvent("close"),this.opened=!1,this},destroy:function(){this.wrapper.destroy()},toElement:function(){return this.wrapper}});Element.implement({MooDialog:function(t){return this.store("MooDialog",new MooDialog(t).setContent(this).open()),this}}); \ No newline at end of file diff --git a/module/webui/themes/flat/js/static/MooDropMenu.js b/module/webui/themes/flat/js/static/MooDropMenu.js deleted file mode 100644 index ac0fa1874..000000000 --- a/module/webui/themes/flat/js/static/MooDropMenu.js +++ /dev/null @@ -1,86 +0,0 @@ -/* ---- -description: This provides a simple Drop Down menu with infinit levels - -license: MIT-style - -authors: -- Arian Stolwijk - -requires: - - Core/Class.Extras - - Core/Element.Event - - Core/Selectors - -provides: [MooDropMenu, Element.MooDropMenu] - -... -*/ - -var MooDropMenu = new Class({ - - Implements: [Options, Events], - - options: { - onOpen: function(el){ - el.removeClass('close').addClass('open'); - }, - onClose: function(el){ - el.removeClass('open').addClass('close'); - }, - onInitialize: function(el){ - el.removeClass('open').addClass('close'); - }, - mouseoutDelay: 200, - mouseoverDelay: 0, - listSelector: 'ul', - itemSelector: 'li', - openEvent: 'mouseenter', - closeEvent: 'mouseleave' - }, - - initialize: function(menu, options, level){ - this.setOptions(options); - options = this.options; - - var menu = this.menu = document.id(menu); - - menu.getElements(options.itemSelector + ' > ' + options.listSelector).each(function(el){ - - this.fireEvent('initialize', el); - - var parent = el.getParent(options.itemSelector), - timer; - - parent.addEvent(options.openEvent, function(){ - parent.store('DropDownOpen', true); - - clearTimeout(timer); - if (options.mouseoverDelay) timer = this.fireEvent.delay(options.mouseoverDelay, this, ['open', el]); - else this.fireEvent('open', el); - - }.bind(this)).addEvent(options.closeEvent, function(){ - parent.store('DropDownOpen', false); - - clearTimeout(timer); - timer = (function(){ - if (!parent.retrieve('DropDownOpen')) this.fireEvent('close', el); - }).delay(options.mouseoutDelay, this); - - }.bind(this)); - - }, this); - }, - - toElement: function(){ - return this.menu - } - -}); - -/* So you can do like this $('nav').MooDropMenu(); or even $('nav').MooDropMenu().setStyle('border',1); */ -Element.implement({ - MooDropMenu: function(options){ - return this.store('MooDropMenu', new MooDropMenu(this, options)); - } -}); diff --git a/module/webui/themes/flat/js/static/MooDropMenu.min.js b/module/webui/themes/flat/js/static/MooDropMenu.min.js deleted file mode 100644 index 552ae247a..000000000 --- a/module/webui/themes/flat/js/static/MooDropMenu.min.js +++ /dev/null @@ -1 +0,0 @@ -var MooDropMenu=new Class({Implements:[Options,Events],options:{onOpen:function(e){e.removeClass("close").addClass("open")},onClose:function(e){e.removeClass("open").addClass("close")},onInitialize:function(e){e.removeClass("open").addClass("close")},mouseoutDelay:200,mouseoverDelay:0,listSelector:"ul",itemSelector:"li",openEvent:"mouseenter",closeEvent:"mouseleave"},initialize:function(e,o){this.setOptions(o),o=this.options;var e=this.menu=document.id(e);e.getElements(o.itemSelector+" > "+o.listSelector).each(function(e){this.fireEvent("initialize",e);var n,t=e.getParent(o.itemSelector);t.addEvent(o.openEvent,function(){t.store("DropDownOpen",!0),clearTimeout(n),o.mouseoverDelay?n=this.fireEvent.delay(o.mouseoverDelay,this,["open",e]):this.fireEvent("open",e)}.bind(this)).addEvent(o.closeEvent,function(){t.store("DropDownOpen",!1),clearTimeout(n),n=function(){t.retrieve("DropDownOpen")||this.fireEvent("close",e)}.delay(o.mouseoutDelay,this)}.bind(this))},this)},toElement:function(){return this.menu}});Element.implement({MooDropMenu:function(e){return this.store("MooDropMenu",new MooDropMenu(this,e))}}); \ No newline at end of file diff --git a/module/webui/themes/flat/js/static/mootools-core.js b/module/webui/themes/flat/js/static/mootools-core.js deleted file mode 100644 index db83850fd..000000000 --- a/module/webui/themes/flat/js/static/mootools-core.js +++ /dev/null @@ -1,5977 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/core/8423c12ffd6a6bfcde9ea22554aec795 - -packager build: - - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady - -... -*/ - -/* ---- - -name: Core - -description: The heart of MooTools. - -license: MIT-style license. - -copyright: Copyright (c) 2006-2014 [Valerio Proietti](http://mad4milk.net/). - -authors: The MooTools production team (http://mootools.net/developers/) - -inspiration: - - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php) - - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php) - -provides: [Core, MooTools, Type, typeOf, instanceOf, Native] - -... -*/ - -(function(){ - -this.MooTools = { - version: '1.5.0', - build: '0f7b690afee9349b15909f33016a25d2e4d9f4e3' -}; - -// typeOf, instanceOf - -var typeOf = this.typeOf = function(item){ - if (item == null) return 'null'; - if (item.$family != null) return item.$family(); - - if (item.nodeName){ - if (item.nodeType == 1) return 'element'; - if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace'; - } else if (typeof item.length == 'number'){ - if ('callee' in item) return 'arguments'; - if ('item' in item) return 'collection'; - } - - return typeof item; -}; - -var instanceOf = this.instanceOf = function(item, object){ - if (item == null) return false; - var constructor = item.$constructor || item.constructor; - while (constructor){ - if (constructor === object) return true; - constructor = constructor.parent; - } - /**/ - if (!item.hasOwnProperty) return false; - /**/ - return item instanceof object; -}; - -// Function overloading - -var Function = this.Function; - -var enumerables = true; -for (var i in {toString: 1}) enumerables = null; -if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor']; - -Function.prototype.overloadSetter = function(usePlural){ - var self = this; - return function(a, b){ - if (a == null) return this; - if (usePlural || typeof a != 'string'){ - for (var k in a) self.call(this, k, a[k]); - if (enumerables) for (var i = enumerables.length; i--;){ - k = enumerables[i]; - if (a.hasOwnProperty(k)) self.call(this, k, a[k]); - } - } else { - self.call(this, a, b); - } - return this; - }; -}; - -Function.prototype.overloadGetter = function(usePlural){ - var self = this; - return function(a){ - var args, result; - if (typeof a != 'string') args = a; - else if (arguments.length > 1) args = arguments; - else if (usePlural) args = [a]; - if (args){ - result = {}; - for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]); - } else { - result = self.call(this, a); - } - return result; - }; -}; - -Function.prototype.extend = function(key, value){ - this[key] = value; -}.overloadSetter(); - -Function.prototype.implement = function(key, value){ - this.prototype[key] = value; -}.overloadSetter(); - -// From - -var slice = Array.prototype.slice; - -Function.from = function(item){ - return (typeOf(item) == 'function') ? item : function(){ - return item; - }; -}; - -Array.from = function(item){ - if (item == null) return []; - return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item]; -}; - -Number.from = function(item){ - var number = parseFloat(item); - return isFinite(number) ? number : null; -}; - -String.from = function(item){ - return item + ''; -}; - -// hide, protect - -Function.implement({ - - hide: function(){ - this.$hidden = true; - return this; - }, - - protect: function(){ - this.$protected = true; - return this; - } - -}); - -// Type - -var Type = this.Type = function(name, object){ - if (name){ - var lower = name.toLowerCase(); - var typeCheck = function(item){ - return (typeOf(item) == lower); - }; - - Type['is' + name] = typeCheck; - if (object != null){ - object.prototype.$family = (function(){ - return lower; - }).hide(); - - } - } - - if (object == null) return null; - - object.extend(this); - object.$constructor = Type; - object.prototype.$constructor = object; - - return object; -}; - -var toString = Object.prototype.toString; - -Type.isEnumerable = function(item){ - return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' ); -}; - -var hooks = {}; - -var hooksOf = function(object){ - var type = typeOf(object.prototype); - return hooks[type] || (hooks[type] = []); -}; - -var implement = function(name, method){ - if (method && method.$hidden) return; - - var hooks = hooksOf(this); - - for (var i = 0; i < hooks.length; i++){ - var hook = hooks[i]; - if (typeOf(hook) == 'type') implement.call(hook, name, method); - else hook.call(this, name, method); - } - - var previous = this.prototype[name]; - if (previous == null || !previous.$protected) this.prototype[name] = method; - - if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){ - return method.apply(item, slice.call(arguments, 1)); - }); -}; - -var extend = function(name, method){ - if (method && method.$hidden) return; - var previous = this[name]; - if (previous == null || !previous.$protected) this[name] = method; -}; - -Type.implement({ - - implement: implement.overloadSetter(), - - extend: extend.overloadSetter(), - - alias: function(name, existing){ - implement.call(this, name, this.prototype[existing]); - }.overloadSetter(), - - mirror: function(hook){ - hooksOf(this).push(hook); - return this; - } - -}); - -new Type('Type', Type); - -// Default Types - -var force = function(name, object, methods){ - var isType = (object != Object), - prototype = object.prototype; - - if (isType) object = new Type(name, object); - - for (var i = 0, l = methods.length; i < l; i++){ - var key = methods[i], - generic = object[key], - proto = prototype[key]; - - if (generic) generic.protect(); - if (isType && proto) object.implement(key, proto.protect()); - } - - if (isType){ - var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]); - object.forEachMethod = function(fn){ - if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){ - fn.call(prototype, prototype[methods[i]], methods[i]); - } - for (var key in prototype) fn.call(prototype, prototype[key], key); - }; - } - - return force; -}; - -force('String', String, [ - 'charAt', 'charCodeAt', 'concat', 'contains', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search', - 'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase' -])('Array', Array, [ - 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', - 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight' -])('Number', Number, [ - 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision' -])('Function', Function, [ - 'apply', 'call', 'bind' -])('RegExp', RegExp, [ - 'exec', 'test' -])('Object', Object, [ - 'create', 'defineProperty', 'defineProperties', 'keys', - 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames', - 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen' -])('Date', Date, ['now']); - -Object.extend = extend.overloadSetter(); - -Date.extend('now', function(){ - return +(new Date); -}); - -new Type('Boolean', Boolean); - -// fixes NaN returning as Number - -Number.prototype.$family = function(){ - return isFinite(this) ? 'number' : 'null'; -}.hide(); - -// Number.random - -Number.extend('random', function(min, max){ - return Math.floor(Math.random() * (max - min + 1) + min); -}); - -// forEach, each - -var hasOwnProperty = Object.prototype.hasOwnProperty; -Object.extend('forEach', function(object, fn, bind){ - for (var key in object){ - if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object); - } -}); - -Object.each = Object.forEach; - -Array.implement({ - - /**/ - forEach: function(fn, bind){ - for (var i = 0, l = this.length; i < l; i++){ - if (i in this) fn.call(bind, this[i], i, this); - } - }, - /**/ - - each: function(fn, bind){ - Array.forEach(this, fn, bind); - return this; - } - -}); - -// Array & Object cloning, Object merging and appending - -var cloneOf = function(item){ - switch (typeOf(item)){ - case 'array': return item.clone(); - case 'object': return Object.clone(item); - default: return item; - } -}; - -Array.implement('clone', function(){ - var i = this.length, clone = new Array(i); - while (i--) clone[i] = cloneOf(this[i]); - return clone; -}); - -var mergeOne = function(source, key, current){ - switch (typeOf(current)){ - case 'object': - if (typeOf(source[key]) == 'object') Object.merge(source[key], current); - else source[key] = Object.clone(current); - break; - case 'array': source[key] = current.clone(); break; - default: source[key] = current; - } - return source; -}; - -Object.extend({ - - merge: function(source, k, v){ - if (typeOf(k) == 'string') return mergeOne(source, k, v); - for (var i = 1, l = arguments.length; i < l; i++){ - var object = arguments[i]; - for (var key in object) mergeOne(source, key, object[key]); - } - return source; - }, - - clone: function(object){ - var clone = {}; - for (var key in object) clone[key] = cloneOf(object[key]); - return clone; - }, - - append: function(original){ - for (var i = 1, l = arguments.length; i < l; i++){ - var extended = arguments[i] || {}; - for (var key in extended) original[key] = extended[key]; - } - return original; - } - -}); - -// Object-less types - -['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){ - new Type(name); -}); - -// Unique ID - -var UID = Date.now(); - -String.extend('uniqueID', function(){ - return (UID++).toString(36); -}); - - - -})(); - - -/* ---- - -name: Array - -description: Contains Array Prototypes like each, contains, and erase. - -license: MIT-style license. - -requires: [Type] - -provides: Array - -... -*/ - -Array.implement({ - - /**/ - every: function(fn, bind){ - for (var i = 0, l = this.length >>> 0; i < l; i++){ - if ((i in this) && !fn.call(bind, this[i], i, this)) return false; - } - return true; - }, - - filter: function(fn, bind){ - var results = []; - for (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){ - value = this[i]; - if (fn.call(bind, value, i, this)) results.push(value); - } - return results; - }, - - indexOf: function(item, from){ - var length = this.length >>> 0; - for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){ - if (this[i] === item) return i; - } - return -1; - }, - - map: function(fn, bind){ - var length = this.length >>> 0, results = Array(length); - for (var i = 0; i < length; i++){ - if (i in this) results[i] = fn.call(bind, this[i], i, this); - } - return results; - }, - - some: function(fn, bind){ - for (var i = 0, l = this.length >>> 0; i < l; i++){ - if ((i in this) && fn.call(bind, this[i], i, this)) return true; - } - return false; - }, - /**/ - - clean: function(){ - return this.filter(function(item){ - return item != null; - }); - }, - - invoke: function(methodName){ - var args = Array.slice(arguments, 1); - return this.map(function(item){ - return item[methodName].apply(item, args); - }); - }, - - associate: function(keys){ - var obj = {}, length = Math.min(this.length, keys.length); - for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; - return obj; - }, - - link: function(object){ - var result = {}; - for (var i = 0, l = this.length; i < l; i++){ - for (var key in object){ - if (object[key](this[i])){ - result[key] = this[i]; - delete object[key]; - break; - } - } - } - return result; - }, - - contains: function(item, from){ - return this.indexOf(item, from) != -1; - }, - - append: function(array){ - this.push.apply(this, array); - return this; - }, - - getLast: function(){ - return (this.length) ? this[this.length - 1] : null; - }, - - getRandom: function(){ - return (this.length) ? this[Number.random(0, this.length - 1)] : null; - }, - - include: function(item){ - if (!this.contains(item)) this.push(item); - return this; - }, - - combine: function(array){ - for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); - return this; - }, - - erase: function(item){ - for (var i = this.length; i--;){ - if (this[i] === item) this.splice(i, 1); - } - return this; - }, - - empty: function(){ - this.length = 0; - return this; - }, - - flatten: function(){ - var array = []; - for (var i = 0, l = this.length; i < l; i++){ - var type = typeOf(this[i]); - if (type == 'null') continue; - array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]); - } - return array; - }, - - pick: function(){ - for (var i = 0, l = this.length; i < l; i++){ - if (this[i] != null) return this[i]; - } - return null; - }, - - hexToRgb: function(array){ - if (this.length != 3) return null; - var rgb = this.map(function(value){ - if (value.length == 1) value += value; - return parseInt(value, 16); - }); - return (array) ? rgb : 'rgb(' + rgb + ')'; - }, - - rgbToHex: function(array){ - if (this.length < 3) return null; - if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; - var hex = []; - for (var i = 0; i < 3; i++){ - var bit = (this[i] - 0).toString(16); - hex.push((bit.length == 1) ? '0' + bit : bit); - } - return (array) ? hex : '#' + hex.join(''); - } - -}); - - - - -/* ---- - -name: String - -description: Contains String Prototypes like camelCase, capitalize, test, and toInt. - -license: MIT-style license. - -requires: [Type, Array] - -provides: String - -... -*/ - -String.implement({ - - // - contains: function(string, index){ - return (index ? String(this).slice(index) : String(this)).indexOf(string) > -1; - }, - // - - test: function(regex, params){ - return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this); - }, - - trim: function(){ - return String(this).replace(/^\s+|\s+$/g, ''); - }, - - clean: function(){ - return String(this).replace(/\s+/g, ' ').trim(); - }, - - camelCase: function(){ - return String(this).replace(/-\D/g, function(match){ - return match.charAt(1).toUpperCase(); - }); - }, - - hyphenate: function(){ - return String(this).replace(/[A-Z]/g, function(match){ - return ('-' + match.charAt(0).toLowerCase()); - }); - }, - - capitalize: function(){ - return String(this).replace(/\b[a-z]/g, function(match){ - return match.toUpperCase(); - }); - }, - - escapeRegExp: function(){ - return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); - }, - - toInt: function(base){ - return parseInt(this, base || 10); - }, - - toFloat: function(){ - return parseFloat(this); - }, - - hexToRgb: function(array){ - var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); - return (hex) ? hex.slice(1).hexToRgb(array) : null; - }, - - rgbToHex: function(array){ - var rgb = String(this).match(/\d{1,3}/g); - return (rgb) ? rgb.rgbToHex(array) : null; - }, - - substitute: function(object, regexp){ - return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ - if (match.charAt(0) == '\\') return match.slice(1); - return (object[name] != null) ? object[name] : ''; - }); - } - -}); - - - - -/* ---- - -name: Number - -description: Contains Number Prototypes like limit, round, times, and ceil. - -license: MIT-style license. - -requires: Type - -provides: Number - -... -*/ - -Number.implement({ - - limit: function(min, max){ - return Math.min(max, Math.max(min, this)); - }, - - round: function(precision){ - precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0); - return Math.round(this * precision) / precision; - }, - - times: function(fn, bind){ - for (var i = 0; i < this; i++) fn.call(bind, i, this); - }, - - toFloat: function(){ - return parseFloat(this); - }, - - toInt: function(base){ - return parseInt(this, base || 10); - } - -}); - -Number.alias('each', 'times'); - -(function(math){ - var methods = {}; - math.each(function(name){ - if (!Number[name]) methods[name] = function(){ - return Math[name].apply(null, [this].concat(Array.from(arguments))); - }; - }); - Number.implement(methods); -})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); - - -/* ---- - -name: Function - -description: Contains Function Prototypes like create, bind, pass, and delay. - -license: MIT-style license. - -requires: Type - -provides: Function - -... -*/ - -Function.extend({ - - attempt: function(){ - for (var i = 0, l = arguments.length; i < l; i++){ - try { - return arguments[i](); - } catch (e){} - } - return null; - } - -}); - -Function.implement({ - - attempt: function(args, bind){ - try { - return this.apply(bind, Array.from(args)); - } catch (e){} - - return null; - }, - - /**/ - bind: function(that){ - var self = this, - args = arguments.length > 1 ? Array.slice(arguments, 1) : null, - F = function(){}; - - var bound = function(){ - var context = that, length = arguments.length; - if (this instanceof bound){ - F.prototype = self.prototype; - context = new F; - } - var result = (!args && !length) - ? self.call(context) - : self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments); - return context == that ? result : context; - }; - return bound; - }, - /**/ - - pass: function(args, bind){ - var self = this; - if (args != null) args = Array.from(args); - return function(){ - return self.apply(bind, args || arguments); - }; - }, - - delay: function(delay, bind, args){ - return setTimeout(this.pass((args == null ? [] : args), bind), delay); - }, - - periodical: function(periodical, bind, args){ - return setInterval(this.pass((args == null ? [] : args), bind), periodical); - } - -}); - - - - -/* ---- - -name: Object - -description: Object generic methods - -license: MIT-style license. - -requires: Type - -provides: [Object, Hash] - -... -*/ - -(function(){ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -Object.extend({ - - subset: function(object, keys){ - var results = {}; - for (var i = 0, l = keys.length; i < l; i++){ - var k = keys[i]; - if (k in object) results[k] = object[k]; - } - return results; - }, - - map: function(object, fn, bind){ - var results = {}; - for (var key in object){ - if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object); - } - return results; - }, - - filter: function(object, fn, bind){ - var results = {}; - for (var key in object){ - var value = object[key]; - if (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value; - } - return results; - }, - - every: function(object, fn, bind){ - for (var key in object){ - if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false; - } - return true; - }, - - some: function(object, fn, bind){ - for (var key in object){ - if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true; - } - return false; - }, - - keys: function(object){ - var keys = []; - for (var key in object){ - if (hasOwnProperty.call(object, key)) keys.push(key); - } - return keys; - }, - - values: function(object){ - var values = []; - for (var key in object){ - if (hasOwnProperty.call(object, key)) values.push(object[key]); - } - return values; - }, - - getLength: function(object){ - return Object.keys(object).length; - }, - - keyOf: function(object, value){ - for (var key in object){ - if (hasOwnProperty.call(object, key) && object[key] === value) return key; - } - return null; - }, - - contains: function(object, value){ - return Object.keyOf(object, value) != null; - }, - - toQueryString: function(object, base){ - var queryString = []; - - Object.each(object, function(value, key){ - if (base) key = base + '[' + key + ']'; - var result; - switch (typeOf(value)){ - case 'object': result = Object.toQueryString(value, key); break; - case 'array': - var qs = {}; - value.each(function(val, i){ - qs[i] = val; - }); - result = Object.toQueryString(qs, key); - break; - default: result = key + '=' + encodeURIComponent(value); - } - if (value != null) queryString.push(result); - }); - - return queryString.join('&'); - } - -}); - -})(); - - - - -/* ---- - -name: Browser - -description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash. - -license: MIT-style license. - -requires: [Array, Function, Number, String] - -provides: [Browser, Window, Document] - -... -*/ - -(function(){ - -var document = this.document; -var window = document.window = this; - -var parse = function(ua, platform){ - ua = ua.toLowerCase(); - platform = (platform ? platform.toLowerCase() : ''); - - var UA = ua.match(/(opera|ie|firefox|chrome|trident|crios|version)[\s\/:]([\w\d\.]+)?.*?(safari|(?:rv[\s\/:]|version[\s\/:])([\w\d\.]+)|$)/) || [null, 'unknown', 0]; - - if (UA[1] == 'trident'){ - UA[1] = 'ie'; - if (UA[4]) UA[2] = UA[4]; - } else if (UA[1] == 'crios') { - UA[1] = 'chrome'; - } - - var platform = ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]; - if (platform == 'win') platform = 'windows'; - - return { - extend: Function.prototype.extend, - name: (UA[1] == 'version') ? UA[3] : UA[1], - version: parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]), - platform: platform - }; -}; - -var Browser = this.Browser = parse(navigator.userAgent, navigator.platform); - -if (Browser.ie){ - Browser.version = document.documentMode; -} - -Browser.extend({ - Features: { - xpath: !!(document.evaluate), - air: !!(window.runtime), - query: !!(document.querySelector), - json: !!(window.JSON) - }, - parseUA: parse -}); - - - -// Request - -Browser.Request = (function(){ - - var XMLHTTP = function(){ - return new XMLHttpRequest(); - }; - - var MSXML2 = function(){ - return new ActiveXObject('MSXML2.XMLHTTP'); - }; - - var MSXML = function(){ - return new ActiveXObject('Microsoft.XMLHTTP'); - }; - - return Function.attempt(function(){ - XMLHTTP(); - return XMLHTTP; - }, function(){ - MSXML2(); - return MSXML2; - }, function(){ - MSXML(); - return MSXML; - }); - -})(); - -Browser.Features.xhr = !!(Browser.Request); - - - -// String scripts - -Browser.exec = function(text){ - if (!text) return text; - if (window.execScript){ - window.execScript(text); - } else { - var script = document.createElement('script'); - script.setAttribute('type', 'text/javascript'); - script.text = text; - document.head.appendChild(script); - document.head.removeChild(script); - } - return text; -}; - -String.implement('stripScripts', function(exec){ - var scripts = ''; - var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(all, code){ - scripts += code + '\n'; - return ''; - }); - if (exec === true) Browser.exec(scripts); - else if (typeOf(exec) == 'function') exec(scripts, text); - return text; -}); - -// Window, Document - -Browser.extend({ - Document: this.Document, - Window: this.Window, - Element: this.Element, - Event: this.Event -}); - -this.Window = this.$constructor = new Type('Window', function(){}); - -this.$family = Function.from('window').hide(); - -Window.mirror(function(name, method){ - window[name] = method; -}); - -this.Document = document.$constructor = new Type('Document', function(){}); - -document.$family = Function.from('document').hide(); - -Document.mirror(function(name, method){ - document[name] = method; -}); - -document.html = document.documentElement; -if (!document.head) document.head = document.getElementsByTagName('head')[0]; - -if (document.execCommand) try { - document.execCommand("BackgroundImageCache", false, true); -} catch (e){} - -/**/ -if (this.attachEvent && !this.addEventListener){ - var unloadEvent = function(){ - this.detachEvent('onunload', unloadEvent); - document.head = document.html = document.window = null; - }; - this.attachEvent('onunload', unloadEvent); -} - -// IE fails on collections and ) -var arrayFrom = Array.from; -try { - arrayFrom(document.html.childNodes); -} catch(e){ - Array.from = function(item){ - if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){ - var i = item.length, array = new Array(i); - while (i--) array[i] = item[i]; - return array; - } - return arrayFrom(item); - }; - - var prototype = Array.prototype, - slice = prototype.slice; - ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){ - var method = prototype[name]; - Array[name] = function(item){ - return method.apply(Array.from(item), slice.call(arguments, 1)); - }; - }); -} -/**/ - - - -})(); - - -/* ---- - -name: Event - -description: Contains the Event Type, to make the event object cross-browser. - -license: MIT-style license. - -requires: [Window, Document, Array, Function, String, Object] - -provides: Event - -... -*/ - -(function() { - -var _keys = {}; - -var DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){ - if (!win) win = window; - event = event || win.event; - if (event.$extended) return event; - this.event = event; - this.$extended = true; - this.shift = event.shiftKey; - this.control = event.ctrlKey; - this.alt = event.altKey; - this.meta = event.metaKey; - var type = this.type = event.type; - var target = event.target || event.srcElement; - while (target && target.nodeType == 3) target = target.parentNode; - this.target = document.id(target); - - if (type.indexOf('key') == 0){ - var code = this.code = (event.which || event.keyCode); - this.key = _keys[code]; - if (type == 'keydown' || type == 'keyup'){ - if (code > 111 && code < 124) this.key = 'f' + (code - 111); - else if (code > 95 && code < 106) this.key = code - 96; - } - if (this.key == null) this.key = String.fromCharCode(code).toLowerCase(); - } else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){ - var doc = win.document; - doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; - this.page = { - x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft, - y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop - }; - this.client = { - x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX, - y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY - }; - if (type == 'DOMMouseScroll' || type == 'mousewheel') - this.wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; - - this.rightClick = (event.which == 3 || event.button == 2); - if (type == 'mouseover' || type == 'mouseout'){ - var related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']; - while (related && related.nodeType == 3) related = related.parentNode; - this.relatedTarget = document.id(related); - } - } else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){ - this.rotation = event.rotation; - this.scale = event.scale; - this.targetTouches = event.targetTouches; - this.changedTouches = event.changedTouches; - var touches = this.touches = event.touches; - if (touches && touches[0]){ - var touch = touches[0]; - this.page = {x: touch.pageX, y: touch.pageY}; - this.client = {x: touch.clientX, y: touch.clientY}; - } - } - - if (!this.client) this.client = {}; - if (!this.page) this.page = {}; -}); - -DOMEvent.implement({ - - stop: function(){ - return this.preventDefault().stopPropagation(); - }, - - stopPropagation: function(){ - if (this.event.stopPropagation) this.event.stopPropagation(); - else this.event.cancelBubble = true; - return this; - }, - - preventDefault: function(){ - if (this.event.preventDefault) this.event.preventDefault(); - else this.event.returnValue = false; - return this; - } - -}); - -DOMEvent.defineKey = function(code, key){ - _keys[code] = key; - return this; -}; - -DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true); - -DOMEvent.defineKeys({ - '38': 'up', '40': 'down', '37': 'left', '39': 'right', - '27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab', - '46': 'delete', '13': 'enter' -}); - -})(); - - - - - - -/* ---- - -name: Class - -description: Contains the Class Function for easily creating, extending, and implementing reusable Classes. - -license: MIT-style license. - -requires: [Array, String, Function, Number] - -provides: Class - -... -*/ - -(function(){ - -var Class = this.Class = new Type('Class', function(params){ - if (instanceOf(params, Function)) params = {initialize: params}; - - var newClass = function(){ - reset(this); - if (newClass.$prototyping) return this; - this.$caller = null; - var value = (this.initialize) ? this.initialize.apply(this, arguments) : this; - this.$caller = this.caller = null; - return value; - }.extend(this).implement(params); - - newClass.$constructor = Class; - newClass.prototype.$constructor = newClass; - newClass.prototype.parent = parent; - - return newClass; -}); - -var parent = function(){ - if (!this.$caller) throw new Error('The method "parent" cannot be called.'); - var name = this.$caller.$name, - parent = this.$caller.$owner.parent, - previous = (parent) ? parent.prototype[name] : null; - if (!previous) throw new Error('The method "' + name + '" has no parent.'); - return previous.apply(this, arguments); -}; - -var reset = function(object){ - for (var key in object){ - var value = object[key]; - switch (typeOf(value)){ - case 'object': - var F = function(){}; - F.prototype = value; - object[key] = reset(new F); - break; - case 'array': object[key] = value.clone(); break; - } - } - return object; -}; - -var wrap = function(self, key, method){ - if (method.$origin) method = method.$origin; - var wrapper = function(){ - if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.'); - var caller = this.caller, current = this.$caller; - this.caller = current; this.$caller = wrapper; - var result = method.apply(this, arguments); - this.$caller = current; this.caller = caller; - return result; - }.extend({$owner: self, $origin: method, $name: key}); - return wrapper; -}; - -var implement = function(key, value, retain){ - if (Class.Mutators.hasOwnProperty(key)){ - value = Class.Mutators[key].call(this, value); - if (value == null) return this; - } - - if (typeOf(value) == 'function'){ - if (value.$hidden) return this; - this.prototype[key] = (retain) ? value : wrap(this, key, value); - } else { - Object.merge(this.prototype, key, value); - } - - return this; -}; - -var getInstance = function(klass){ - klass.$prototyping = true; - var proto = new klass; - delete klass.$prototyping; - return proto; -}; - -Class.implement('implement', implement.overloadSetter()); - -Class.Mutators = { - - Extends: function(parent){ - this.parent = parent; - this.prototype = getInstance(parent); - }, - - Implements: function(items){ - Array.from(items).each(function(item){ - var instance = new item; - for (var key in instance) implement.call(this, key, instance[key], true); - }, this); - } -}; - -})(); - - -/* ---- - -name: Class.Extras - -description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. - -license: MIT-style license. - -requires: Class - -provides: [Class.Extras, Chain, Events, Options] - -... -*/ - -(function(){ - -this.Chain = new Class({ - - $chain: [], - - chain: function(){ - this.$chain.append(Array.flatten(arguments)); - return this; - }, - - callChain: function(){ - return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; - }, - - clearChain: function(){ - this.$chain.empty(); - return this; - } - -}); - -var removeOn = function(string){ - return string.replace(/^on([A-Z])/, function(full, first){ - return first.toLowerCase(); - }); -}; - -this.Events = new Class({ - - $events: {}, - - addEvent: function(type, fn, internal){ - type = removeOn(type); - - - - this.$events[type] = (this.$events[type] || []).include(fn); - if (internal) fn.internal = true; - return this; - }, - - addEvents: function(events){ - for (var type in events) this.addEvent(type, events[type]); - return this; - }, - - fireEvent: function(type, args, delay){ - type = removeOn(type); - var events = this.$events[type]; - if (!events) return this; - args = Array.from(args); - events.each(function(fn){ - if (delay) fn.delay(delay, this, args); - else fn.apply(this, args); - }, this); - return this; - }, - - removeEvent: function(type, fn){ - type = removeOn(type); - var events = this.$events[type]; - if (events && !fn.internal){ - var index = events.indexOf(fn); - if (index != -1) delete events[index]; - } - return this; - }, - - removeEvents: function(events){ - var type; - if (typeOf(events) == 'object'){ - for (type in events) this.removeEvent(type, events[type]); - return this; - } - if (events) events = removeOn(events); - for (type in this.$events){ - if (events && events != type) continue; - var fns = this.$events[type]; - for (var i = fns.length; i--;) if (i in fns){ - this.removeEvent(type, fns[i]); - } - } - return this; - } - -}); - -this.Options = new Class({ - - setOptions: function(){ - var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments)); - if (this.addEvent) for (var option in options){ - if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; - this.addEvent(option, options[option]); - delete options[option]; - } - return this; - } - -}); - -})(); - - -/* ---- -name: Slick.Parser -description: Standalone CSS3 Selector parser -provides: Slick.Parser -... -*/ - -;(function(){ - -var parsed, - separatorIndex, - combinatorIndex, - reversed, - cache = {}, - reverseCache = {}, - reUnescape = /\\/g; - -var parse = function(expression, isReversed){ - if (expression == null) return null; - if (expression.Slick === true) return expression; - expression = ('' + expression).replace(/^\s+|\s+$/g, ''); - reversed = !!isReversed; - var currentCache = (reversed) ? reverseCache : cache; - if (currentCache[expression]) return currentCache[expression]; - parsed = { - Slick: true, - expressions: [], - raw: expression, - reverse: function(){ - return parse(this.raw, true); - } - }; - separatorIndex = -1; - while (expression != (expression = expression.replace(regexp, parser))); - parsed.length = parsed.expressions.length; - return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed; -}; - -var reverseCombinator = function(combinator){ - if (combinator === '!') return ' '; - else if (combinator === ' ') return '!'; - else if ((/^!/).test(combinator)) return combinator.replace(/^!/, ''); - else return '!' + combinator; -}; - -var reverse = function(expression){ - var expressions = expression.expressions; - for (var i = 0; i < expressions.length; i++){ - var exp = expressions[i]; - var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)}; - - for (var j = 0; j < exp.length; j++){ - var cexp = exp[j]; - if (!cexp.reverseCombinator) cexp.reverseCombinator = ' '; - cexp.combinator = cexp.reverseCombinator; - delete cexp.reverseCombinator; - } - - exp.reverse().push(last); - } - return expression; -}; - -var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan MIT License - return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){ - return '\\' + match; - }); -}; - -var regexp = new RegExp( -/* -#!/usr/bin/env ruby -puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'') -__END__ - "(?x)^(?:\ - \\s* ( , ) \\s* # Separator \n\ - | \\s* ( + ) \\s* # Combinator \n\ - | ( \\s+ ) # CombinatorChildren \n\ - | ( + | \\* ) # Tag \n\ - | \\# ( + ) # ID \n\ - | \\. ( + ) # ClassName \n\ - | # Attribute \n\ - \\[ \ - \\s* (+) (?: \ - \\s* ([*^$!~|]?=) (?: \ - \\s* (?:\ - ([\"']?)(.*?)\\9 \ - )\ - ) \ - )? \\s* \ - \\](?!\\]) \n\ - | :+ ( + )(?:\ - \\( (?:\ - (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\ - ) \\)\ - )?\ - )" -*/ - "^(?:\\s*(,)\\s*|\\s*(+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)" - .replace(//, '[' + escapeRegExp(">+~`!@$%^&={}\\;/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') - .replace(//g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') -); - -function parser( - rawMatch, - - separator, - combinator, - combinatorChildren, - - tagName, - id, - className, - - attributeKey, - attributeOperator, - attributeQuote, - attributeValue, - - pseudoMarker, - pseudoClass, - pseudoQuote, - pseudoClassQuotedValue, - pseudoClassValue -){ - if (separator || separatorIndex === -1){ - parsed.expressions[++separatorIndex] = []; - combinatorIndex = -1; - if (separator) return ''; - } - - if (combinator || combinatorChildren || combinatorIndex === -1){ - combinator = combinator || ' '; - var currentSeparator = parsed.expressions[separatorIndex]; - if (reversed && currentSeparator[combinatorIndex]) - currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator); - currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'}; - } - - var currentParsed = parsed.expressions[separatorIndex][combinatorIndex]; - - if (tagName){ - currentParsed.tag = tagName.replace(reUnescape, ''); - - } else if (id){ - currentParsed.id = id.replace(reUnescape, ''); - - } else if (className){ - className = className.replace(reUnescape, ''); - - if (!currentParsed.classList) currentParsed.classList = []; - if (!currentParsed.classes) currentParsed.classes = []; - currentParsed.classList.push(className); - currentParsed.classes.push({ - value: className, - regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)') - }); - - } else if (pseudoClass){ - pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue; - pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null; - - if (!currentParsed.pseudos) currentParsed.pseudos = []; - currentParsed.pseudos.push({ - key: pseudoClass.replace(reUnescape, ''), - value: pseudoClassValue, - type: pseudoMarker.length == 1 ? 'class' : 'element' - }); - - } else if (attributeKey){ - attributeKey = attributeKey.replace(reUnescape, ''); - attributeValue = (attributeValue || '').replace(reUnescape, ''); - - var test, regexp; - - switch (attributeOperator){ - case '^=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) ); break; - case '$=' : regexp = new RegExp( escapeRegExp(attributeValue) +'$' ); break; - case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break; - case '|=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) +'(-|$)' ); break; - case '=' : test = function(value){ - return attributeValue == value; - }; break; - case '*=' : test = function(value){ - return value && value.indexOf(attributeValue) > -1; - }; break; - case '!=' : test = function(value){ - return attributeValue != value; - }; break; - default : test = function(value){ - return !!value; - }; - } - - if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){ - return false; - }; - - if (!test) test = function(value){ - return value && regexp.test(value); - }; - - if (!currentParsed.attributes) currentParsed.attributes = []; - currentParsed.attributes.push({ - key: attributeKey, - operator: attributeOperator, - value: attributeValue, - test: test - }); - - } - - return ''; -}; - -// Slick NS - -var Slick = (this.Slick || {}); - -Slick.parse = function(expression){ - return parse(expression); -}; - -Slick.escapeRegExp = escapeRegExp; - -if (!this.Slick) this.Slick = Slick; - -}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); - - -/* ---- -name: Slick.Finder -description: The new, superfast css selector engine. -provides: Slick.Finder -requires: Slick.Parser -... -*/ - -;(function(){ - -var local = {}, - featuresCache = {}, - toString = Object.prototype.toString; - -// Feature / Bug detection - -local.isNativeCode = function(fn){ - return (/\{\s*\[native code\]\s*\}/).test('' + fn); -}; - -local.isXML = function(document){ - return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') || - (document.nodeType == 9 && document.documentElement.nodeName != 'HTML'); -}; - -local.setDocument = function(document){ - - // convert elements / window arguments to document. if document cannot be extrapolated, the function returns. - var nodeType = document.nodeType; - if (nodeType == 9); // document - else if (nodeType) document = document.ownerDocument; // node - else if (document.navigator) document = document.document; // window - else return; - - // check if it's the old document - - if (this.document === document) return; - this.document = document; - - // check if we have done feature detection on this document before - - var root = document.documentElement, - rootUid = this.getUIDXML(root), - features = featuresCache[rootUid], - feature; - - if (features){ - for (feature in features){ - this[feature] = features[feature]; - } - return; - } - - features = featuresCache[rootUid] = {}; - - features.root = root; - features.isXMLDocument = this.isXML(document); - - features.brokenStarGEBTN - = features.starSelectsClosedQSA - = features.idGetsName - = features.brokenMixedCaseQSA - = features.brokenGEBCN - = features.brokenCheckedQSA - = features.brokenEmptyAttributeQSA - = features.isHTMLDocument - = features.nativeMatchesSelector - = false; - - var starSelectsClosed, starSelectsComments, - brokenSecondClassNameGEBCN, cachedGetElementsByClassName, - brokenFormAttributeGetter; - - var selected, id = 'slick_uniqueid'; - var testNode = document.createElement('div'); - - var testRoot = document.body || document.getElementsByTagName('body')[0] || root; - testRoot.appendChild(testNode); - - // on non-HTML documents innerHTML and getElementsById doesnt work properly - try { - testNode.innerHTML = ''; - features.isHTMLDocument = !!document.getElementById(id); - } catch(e){}; - - if (features.isHTMLDocument){ - - testNode.style.display = 'none'; - - // IE returns comment nodes for getElementsByTagName('*') for some documents - testNode.appendChild(document.createComment('')); - starSelectsComments = (testNode.getElementsByTagName('*').length > 1); - - // IE returns closed nodes (EG:"") for getElementsByTagName('*') for some documents - try { - testNode.innerHTML = 'foo'; - selected = testNode.getElementsByTagName('*'); - starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); - } catch(e){}; - - features.brokenStarGEBTN = starSelectsComments || starSelectsClosed; - - // IE returns elements with the name instead of just id for getElementsById for some documents - try { - testNode.innerHTML = ''; - features.idGetsName = document.getElementById(id) === testNode.firstChild; - } catch(e){}; - - if (testNode.getElementsByClassName){ - - // Safari 3.2 getElementsByClassName caches results - try { - testNode.innerHTML = ''; - testNode.getElementsByClassName('b').length; - testNode.firstChild.className = 'b'; - cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2); - } catch(e){}; - - // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one - try { - testNode.innerHTML = ''; - brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2); - } catch(e){}; - - features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN; - } - - if (testNode.querySelectorAll){ - // IE 8 returns closed nodes (EG:"") for querySelectorAll('*') for some documents - try { - testNode.innerHTML = 'foo'; - selected = testNode.querySelectorAll('*'); - features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); - } catch(e){}; - - // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode - try { - testNode.innerHTML = ''; - features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length; - } catch(e){}; - - // Webkit and Opera dont return selected options on querySelectorAll - try { - testNode.innerHTML = ''; - features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0); - } catch(e){}; - - // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll - try { - testNode.innerHTML = ''; - features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0); - } catch(e){}; - - } - - // IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input - try { - testNode.innerHTML = '
        '; - brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's'); - } catch(e){}; - - // native matchesSelector function - - features.nativeMatchesSelector = root.matches || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector; - if (features.nativeMatchesSelector) try { - // if matchesSelector trows errors on incorrect sintaxes we can use it - features.nativeMatchesSelector.call(root, ':slick'); - features.nativeMatchesSelector = null; - } catch(e){}; - - } - - try { - root.slick_expando = 1; - delete root.slick_expando; - features.getUID = this.getUIDHTML; - } catch(e) { - features.getUID = this.getUIDXML; - } - - testRoot.removeChild(testNode); - testNode = selected = testRoot = null; - - // getAttribute - - features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){ - var method = this.attributeGetters[name]; - if (method) return method.call(node); - var attributeNode = node.getAttributeNode(name); - return (attributeNode) ? attributeNode.nodeValue : null; - } : function(node, name){ - var method = this.attributeGetters[name]; - return (method) ? method.call(node) : node.getAttribute(name); - }; - - // hasAttribute - - features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) { - return node.hasAttribute(attribute); - } : function(node, attribute) { - node = node.getAttributeNode(attribute); - return !!(node && (node.specified || node.nodeValue)); - }; - - // contains - // FIXME: Add specs: local.contains should be different for xml and html documents? - var nativeRootContains = root && this.isNativeCode(root.contains), - nativeDocumentContains = document && this.isNativeCode(document.contains); - - features.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){ - return context.contains(node); - } : (nativeRootContains && !nativeDocumentContains) ? function(context, node){ - // IE8 does not have .contains on document. - return context === node || ((context === document) ? document.documentElement : context).contains(node); - } : (root && root.compareDocumentPosition) ? function(context, node){ - return context === node || !!(context.compareDocumentPosition(node) & 16); - } : function(context, node){ - if (node) do { - if (node === context) return true; - } while ((node = node.parentNode)); - return false; - }; - - // document order sorting - // credits to Sizzle (http://sizzlejs.com/) - - features.documentSorter = (root.compareDocumentPosition) ? function(a, b){ - if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0; - return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; - } : ('sourceIndex' in root) ? function(a, b){ - if (!a.sourceIndex || !b.sourceIndex) return 0; - return a.sourceIndex - b.sourceIndex; - } : (document.createRange) ? function(a, b){ - if (!a.ownerDocument || !b.ownerDocument) return 0; - var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); - aRange.setStart(a, 0); - aRange.setEnd(a, 0); - bRange.setStart(b, 0); - bRange.setEnd(b, 0); - return aRange.compareBoundaryPoints(Range.START_TO_END, bRange); - } : null ; - - root = null; - - for (feature in features){ - this[feature] = features[feature]; - } -}; - -// Main Method - -var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/, - reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/, - qsaFailExpCache = {}; - -local.search = function(context, expression, append, first){ - - var found = this.found = (first) ? null : (append || []); - - if (!context) return found; - else if (context.navigator) context = context.document; // Convert the node from a window to a document - else if (!context.nodeType) return found; - - // setup - - var parsed, i, - uniques = this.uniques = {}, - hasOthers = !!(append && append.length), - contextIsDocument = (context.nodeType == 9); - - if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context); - - // avoid duplicating items already in the append array - if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true; - - // expression checks - - if (typeof expression == 'string'){ // expression is a string - - /**/ - var simpleSelector = expression.match(reSimpleSelector); - simpleSelectors: if (simpleSelector) { - - var symbol = simpleSelector[1], - name = simpleSelector[2], - node, nodes; - - if (!symbol){ - - if (name == '*' && this.brokenStarGEBTN) break simpleSelectors; - nodes = context.getElementsByTagName(name); - if (first) return nodes[0] || null; - for (i = 0; node = nodes[i++];){ - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - } - - } else if (symbol == '#'){ - - if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors; - node = context.getElementById(name); - if (!node) return found; - if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors; - if (first) return node || null; - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - - } else if (symbol == '.'){ - - if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors; - if (context.getElementsByClassName && !this.brokenGEBCN){ - nodes = context.getElementsByClassName(name); - if (first) return nodes[0] || null; - for (i = 0; node = nodes[i++];){ - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - } - } else { - var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)'); - nodes = context.getElementsByTagName('*'); - for (i = 0; node = nodes[i++];){ - className = node.className; - if (!(className && matchClass.test(className))) continue; - if (first) return node; - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - } - } - - } - - if (hasOthers) this.sort(found); - return (first) ? null : found; - - } - /**/ - - /**/ - querySelector: if (context.querySelectorAll) { - - if (!this.isHTMLDocument - || qsaFailExpCache[expression] - //TODO: only skip when expression is actually mixed case - || this.brokenMixedCaseQSA - || (this.brokenCheckedQSA && expression.indexOf(':checked') > -1) - || (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) - || (!contextIsDocument //Abort when !contextIsDocument and... - // there are multiple expressions in the selector - // since we currently only fix non-document rooted QSA for single expression selectors - && expression.indexOf(',') > -1 - ) - || Slick.disableQSA - ) break querySelector; - - var _expression = expression, _context = context; - if (!contextIsDocument){ - // non-document rooted QSA - // credits to Andrew Dupont - var currentId = _context.getAttribute('id'), slickid = 'slickid__'; - _context.setAttribute('id', slickid); - _expression = '#' + slickid + ' ' + _expression; - context = _context.parentNode; - } - - try { - if (first) return context.querySelector(_expression) || null; - else nodes = context.querySelectorAll(_expression); - } catch(e) { - qsaFailExpCache[expression] = 1; - break querySelector; - } finally { - if (!contextIsDocument){ - if (currentId) _context.setAttribute('id', currentId); - else _context.removeAttribute('id'); - context = _context; - } - } - - if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){ - if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node); - } else for (i = 0; node = nodes[i++];){ - if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); - } - - if (hasOthers) this.sort(found); - return found; - - } - /**/ - - parsed = this.Slick.parse(expression); - if (!parsed.length) return found; - } else if (expression == null){ // there is no expression - return found; - } else if (expression.Slick){ // expression is a parsed Slick object - parsed = expression; - } else if (this.contains(context.documentElement || context, expression)){ // expression is a node - (found) ? found.push(expression) : found = expression; - return found; - } else { // other junk - return found; - } - - /**//**/ - - // cache elements for the nth selectors - - this.posNTH = {}; - this.posNTHLast = {}; - this.posNTHType = {}; - this.posNTHTypeLast = {}; - - /**//**/ - - // if append is null and there is only a single selector with one expression use pushArray, else use pushUID - this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID; - - if (found == null) found = []; - - // default engine - - var j, m, n; - var combinator, tag, id, classList, classes, attributes, pseudos; - var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions; - - search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){ - - combinator = 'combinator:' + currentBit.combinator; - if (!this[combinator]) continue search; - - tag = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase(); - id = currentBit.id; - classList = currentBit.classList; - classes = currentBit.classes; - attributes = currentBit.attributes; - pseudos = currentBit.pseudos; - lastBit = (j === (currentExpression.length - 1)); - - this.bitUniques = {}; - - if (lastBit){ - this.uniques = uniques; - this.found = found; - } else { - this.uniques = {}; - this.found = []; - } - - if (j === 0){ - this[combinator](context, tag, id, classes, attributes, pseudos, classList); - if (first && lastBit && found.length) break search; - } else { - if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){ - this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); - if (found.length) break search; - } else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); - } - - currentItems = this.found; - } - - // should sort if there are nodes in append and if you pass multiple expressions. - if (hasOthers || (parsed.expressions.length > 1)) this.sort(found); - - return (first) ? (found[0] || null) : found; -}; - -// Utils - -local.uidx = 1; -local.uidk = 'slick-uniqueid'; - -local.getUIDXML = function(node){ - var uid = node.getAttribute(this.uidk); - if (!uid){ - uid = this.uidx++; - node.setAttribute(this.uidk, uid); - } - return uid; -}; - -local.getUIDHTML = function(node){ - return node.uniqueNumber || (node.uniqueNumber = this.uidx++); -}; - -// sort based on the setDocument documentSorter method. - -local.sort = function(results){ - if (!this.documentSorter) return results; - results.sort(this.documentSorter); - return results; -}; - -/**//**/ - -local.cacheNTH = {}; - -local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/; - -local.parseNTHArgument = function(argument){ - var parsed = argument.match(this.matchNTH); - if (!parsed) return false; - var special = parsed[2] || false; - var a = parsed[1] || 1; - if (a == '-') a = -1; - var b = +parsed[3] || 0; - parsed = - (special == 'n') ? {a: a, b: b} : - (special == 'odd') ? {a: 2, b: 1} : - (special == 'even') ? {a: 2, b: 0} : {a: 0, b: a}; - - return (this.cacheNTH[argument] = parsed); -}; - -local.createNTHPseudo = function(child, sibling, positions, ofType){ - return function(node, argument){ - var uid = this.getUID(node); - if (!this[positions][uid]){ - var parent = node.parentNode; - if (!parent) return false; - var el = parent[child], count = 1; - if (ofType){ - var nodeName = node.nodeName; - do { - if (el.nodeName != nodeName) continue; - this[positions][this.getUID(el)] = count++; - } while ((el = el[sibling])); - } else { - do { - if (el.nodeType != 1) continue; - this[positions][this.getUID(el)] = count++; - } while ((el = el[sibling])); - } - } - argument = argument || 'n'; - var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument); - if (!parsed) return false; - var a = parsed.a, b = parsed.b, pos = this[positions][uid]; - if (a == 0) return b == pos; - if (a > 0){ - if (pos < b) return false; - } else { - if (b < pos) return false; - } - return ((pos - b) % a) == 0; - }; -}; - -/**//**/ - -local.pushArray = function(node, tag, id, classes, attributes, pseudos){ - if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node); -}; - -local.pushUID = function(node, tag, id, classes, attributes, pseudos){ - var uid = this.getUID(node); - if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){ - this.uniques[uid] = true; - this.found.push(node); - } -}; - -local.matchNode = function(node, selector){ - if (this.isHTMLDocument && this.nativeMatchesSelector){ - try { - return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]')); - } catch(matchError) {} - } - - var parsed = this.Slick.parse(selector); - if (!parsed) return true; - - // simple (single) selectors - var expressions = parsed.expressions, simpleExpCounter = 0, i; - for (i = 0; (currentExpression = expressions[i]); i++){ - if (currentExpression.length == 1){ - var exp = currentExpression[0]; - if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true; - simpleExpCounter++; - } - } - - if (simpleExpCounter == parsed.length) return false; - - var nodes = this.search(this.document, parsed), item; - for (i = 0; item = nodes[i++];){ - if (item === node) return true; - } - return false; -}; - -local.matchPseudo = function(node, name, argument){ - var pseudoName = 'pseudo:' + name; - if (this[pseudoName]) return this[pseudoName](node, argument); - var attribute = this.getAttribute(node, name); - return (argument) ? argument == attribute : !!attribute; -}; - -local.matchSelector = function(node, tag, id, classes, attributes, pseudos){ - if (tag){ - var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase(); - if (tag == '*'){ - if (nodeName < '@') return false; // Fix for comment nodes and closed nodes - } else { - if (nodeName != tag) return false; - } - } - - if (id && node.getAttribute('id') != id) return false; - - var i, part, cls; - if (classes) for (i = classes.length; i--;){ - cls = this.getAttribute(node, 'class'); - if (!(cls && classes[i].regexp.test(cls))) return false; - } - if (attributes) for (i = attributes.length; i--;){ - part = attributes[i]; - if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false; - } - if (pseudos) for (i = pseudos.length; i--;){ - part = pseudos[i]; - if (!this.matchPseudo(node, part.key, part.value)) return false; - } - return true; -}; - -var combinators = { - - ' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level - - var i, item, children; - - if (this.isHTMLDocument){ - getById: if (id){ - item = this.document.getElementById(id); - if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){ - // all[id] returns all the elements with that name or id inside node - // if theres just one it will return the element, else it will be a collection - children = node.all[id]; - if (!children) return; - if (!children[0]) children = [children]; - for (i = 0; item = children[i++];){ - var idNode = item.getAttributeNode('id'); - if (idNode && idNode.nodeValue == id){ - this.push(item, tag, null, classes, attributes, pseudos); - break; - } - } - return; - } - if (!item){ - // if the context is in the dom we return, else we will try GEBTN, breaking the getById label - if (this.contains(this.root, node)) return; - else break getById; - } else if (this.document !== node && !this.contains(node, item)) return; - this.push(item, tag, null, classes, attributes, pseudos); - return; - } - getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){ - children = node.getElementsByClassName(classList.join(' ')); - if (!(children && children.length)) break getByClass; - for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos); - return; - } - } - getByTag: { - children = node.getElementsByTagName(tag); - if (!(children && children.length)) break getByTag; - if (!this.brokenStarGEBTN) tag = null; - for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos); - } - }, - - '>': function(node, tag, id, classes, attributes, pseudos){ // direct children - if ((node = node.firstChild)) do { - if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); - } while ((node = node.nextSibling)); - }, - - '+': function(node, tag, id, classes, attributes, pseudos){ // next sibling - while ((node = node.nextSibling)) if (node.nodeType == 1){ - this.push(node, tag, id, classes, attributes, pseudos); - break; - } - }, - - '^': function(node, tag, id, classes, attributes, pseudos){ // first child - node = node.firstChild; - if (node){ - if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); - else this['combinator:+'](node, tag, id, classes, attributes, pseudos); - } - }, - - '~': function(node, tag, id, classes, attributes, pseudos){ // next siblings - while ((node = node.nextSibling)){ - if (node.nodeType != 1) continue; - var uid = this.getUID(node); - if (this.bitUniques[uid]) break; - this.bitUniques[uid] = true; - this.push(node, tag, id, classes, attributes, pseudos); - } - }, - - '++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling - this['combinator:+'](node, tag, id, classes, attributes, pseudos); - this['combinator:!+'](node, tag, id, classes, attributes, pseudos); - }, - - '~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings - this['combinator:~'](node, tag, id, classes, attributes, pseudos); - this['combinator:!~'](node, tag, id, classes, attributes, pseudos); - }, - - '!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document - while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); - }, - - '!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level) - node = node.parentNode; - if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); - }, - - '!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling - while ((node = node.previousSibling)) if (node.nodeType == 1){ - this.push(node, tag, id, classes, attributes, pseudos); - break; - } - }, - - '!^': function(node, tag, id, classes, attributes, pseudos){ // last child - node = node.lastChild; - if (node){ - if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); - else this['combinator:!+'](node, tag, id, classes, attributes, pseudos); - } - }, - - '!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings - while ((node = node.previousSibling)){ - if (node.nodeType != 1) continue; - var uid = this.getUID(node); - if (this.bitUniques[uid]) break; - this.bitUniques[uid] = true; - this.push(node, tag, id, classes, attributes, pseudos); - } - } - -}; - -for (var c in combinators) local['combinator:' + c] = combinators[c]; - -var pseudos = { - - /**/ - - 'empty': function(node){ - var child = node.firstChild; - return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length; - }, - - 'not': function(node, expression){ - return !this.matchNode(node, expression); - }, - - 'contains': function(node, text){ - return (node.innerText || node.textContent || '').indexOf(text) > -1; - }, - - 'first-child': function(node){ - while ((node = node.previousSibling)) if (node.nodeType == 1) return false; - return true; - }, - - 'last-child': function(node){ - while ((node = node.nextSibling)) if (node.nodeType == 1) return false; - return true; - }, - - 'only-child': function(node){ - var prev = node; - while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false; - var next = node; - while ((next = next.nextSibling)) if (next.nodeType == 1) return false; - return true; - }, - - /**/ - - 'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'), - - 'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'), - - 'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true), - - 'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true), - - 'index': function(node, index){ - return this['pseudo:nth-child'](node, '' + (index + 1)); - }, - - 'even': function(node){ - return this['pseudo:nth-child'](node, '2n'); - }, - - 'odd': function(node){ - return this['pseudo:nth-child'](node, '2n+1'); - }, - - /**/ - - /**/ - - 'first-of-type': function(node){ - var nodeName = node.nodeName; - while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false; - return true; - }, - - 'last-of-type': function(node){ - var nodeName = node.nodeName; - while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false; - return true; - }, - - 'only-of-type': function(node){ - var prev = node, nodeName = node.nodeName; - while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false; - var next = node; - while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false; - return true; - }, - - /**/ - - // custom pseudos - - 'enabled': function(node){ - return !node.disabled; - }, - - 'disabled': function(node){ - return node.disabled; - }, - - 'checked': function(node){ - return node.checked || node.selected; - }, - - 'focus': function(node){ - return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex')); - }, - - 'root': function(node){ - return (node === this.root); - }, - - 'selected': function(node){ - return node.selected; - } - - /**/ -}; - -for (var p in pseudos) local['pseudo:' + p] = pseudos[p]; - -// attributes methods - -var attributeGetters = local.attributeGetters = { - - 'for': function(){ - return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for'); - }, - - 'href': function(){ - return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href'); - }, - - 'style': function(){ - return (this.style) ? this.style.cssText : this.getAttribute('style'); - }, - - 'tabindex': function(){ - var attributeNode = this.getAttributeNode('tabindex'); - return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; - }, - - 'type': function(){ - return this.getAttribute('type'); - }, - - 'maxlength': function(){ - var attributeNode = this.getAttributeNode('maxLength'); - return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; - } - -}; - -attributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength; - -// Slick - -var Slick = local.Slick = (this.Slick || {}); - -Slick.version = '1.1.7'; - -// Slick finder - -Slick.search = function(context, expression, append){ - return local.search(context, expression, append); -}; - -Slick.find = function(context, expression){ - return local.search(context, expression, null, true); -}; - -// Slick containment checker - -Slick.contains = function(container, node){ - local.setDocument(container); - return local.contains(container, node); -}; - -// Slick attribute getter - -Slick.getAttribute = function(node, name){ - local.setDocument(node); - return local.getAttribute(node, name); -}; - -Slick.hasAttribute = function(node, name){ - local.setDocument(node); - return local.hasAttribute(node, name); -}; - -// Slick matcher - -Slick.match = function(node, selector){ - if (!(node && selector)) return false; - if (!selector || selector === node) return true; - local.setDocument(node); - return local.matchNode(node, selector); -}; - -// Slick attribute accessor - -Slick.defineAttributeGetter = function(name, fn){ - local.attributeGetters[name] = fn; - return this; -}; - -Slick.lookupAttributeGetter = function(name){ - return local.attributeGetters[name]; -}; - -// Slick pseudo accessor - -Slick.definePseudo = function(name, fn){ - local['pseudo:' + name] = function(node, argument){ - return fn.call(node, argument); - }; - return this; -}; - -Slick.lookupPseudo = function(name){ - var pseudo = local['pseudo:' + name]; - if (pseudo) return function(argument){ - return pseudo.call(this, argument); - }; - return null; -}; - -// Slick overrides accessor - -Slick.override = function(regexp, fn){ - local.override(regexp, fn); - return this; -}; - -Slick.isXML = local.isXML; - -Slick.uidOf = function(node){ - return local.getUIDHTML(node); -}; - -if (!this.Slick) this.Slick = Slick; - -}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); - - -/* ---- - -name: Element - -description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements. - -license: MIT-style license. - -requires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder] - -provides: [Element, Elements, $, $$, IFrame, Selectors] - -... -*/ - -var Element = this.Element = function(tag, props){ - var konstructor = Element.Constructors[tag]; - if (konstructor) return konstructor(props); - if (typeof tag != 'string') return document.id(tag).set(props); - - if (!props) props = {}; - - if (!(/^[\w-]+$/).test(tag)){ - var parsed = Slick.parse(tag).expressions[0][0]; - tag = (parsed.tag == '*') ? 'div' : parsed.tag; - if (parsed.id && props.id == null) props.id = parsed.id; - - var attributes = parsed.attributes; - if (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){ - attr = attributes[i]; - if (props[attr.key] != null) continue; - - if (attr.value != null && attr.operator == '=') props[attr.key] = attr.value; - else if (!attr.value && !attr.operator) props[attr.key] = true; - } - - if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' '); - } - - return document.newElement(tag, props); -}; - - -if (Browser.Element){ - Element.prototype = Browser.Element.prototype; - // IE8 and IE9 require the wrapping. - Element.prototype._fireEvent = (function(fireEvent){ - return function(type, event){ - return fireEvent.call(this, type, event); - }; - })(Element.prototype.fireEvent); -} - -new Type('Element', Element).mirror(function(name){ - if (Array.prototype[name]) return; - - var obj = {}; - obj[name] = function(){ - var results = [], args = arguments, elements = true; - for (var i = 0, l = this.length; i < l; i++){ - var element = this[i], result = results[i] = element[name].apply(element, args); - elements = (elements && typeOf(result) == 'element'); - } - return (elements) ? new Elements(results) : results; - }; - - Elements.implement(obj); -}); - -if (!Browser.Element){ - Element.parent = Object; - - Element.Prototype = { - '$constructor': Element, - '$family': Function.from('element').hide() - }; - - Element.mirror(function(name, method){ - Element.Prototype[name] = method; - }); -} - -Element.Constructors = {}; - - - -var IFrame = new Type('IFrame', function(){ - var params = Array.link(arguments, { - properties: Type.isObject, - iframe: function(obj){ - return (obj != null); - } - }); - - var props = params.properties || {}, iframe; - if (params.iframe) iframe = document.id(params.iframe); - var onload = props.onload || function(){}; - delete props.onload; - props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick(); - iframe = new Element(iframe || 'iframe', props); - - var onLoad = function(){ - onload.call(iframe.contentWindow); - }; - - if (window.frames[props.id]) onLoad(); - else iframe.addListener('load', onLoad); - return iframe; -}); - -var Elements = this.Elements = function(nodes){ - if (nodes && nodes.length){ - var uniques = {}, node; - for (var i = 0; node = nodes[i++];){ - var uid = Slick.uidOf(node); - if (!uniques[uid]){ - uniques[uid] = true; - this.push(node); - } - } - } -}; - -Elements.prototype = {length: 0}; -Elements.parent = Array; - -new Type('Elements', Elements).implement({ - - filter: function(filter, bind){ - if (!filter) return this; - return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){ - return item.match(filter); - } : filter, bind)); - }.protect(), - - push: function(){ - var length = this.length; - for (var i = 0, l = arguments.length; i < l; i++){ - var item = document.id(arguments[i]); - if (item) this[length++] = item; - } - return (this.length = length); - }.protect(), - - unshift: function(){ - var items = []; - for (var i = 0, l = arguments.length; i < l; i++){ - var item = document.id(arguments[i]); - if (item) items.push(item); - } - return Array.prototype.unshift.apply(this, items); - }.protect(), - - concat: function(){ - var newElements = new Elements(this); - for (var i = 0, l = arguments.length; i < l; i++){ - var item = arguments[i]; - if (Type.isEnumerable(item)) newElements.append(item); - else newElements.push(item); - } - return newElements; - }.protect(), - - append: function(collection){ - for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]); - return this; - }.protect(), - - empty: function(){ - while (this.length) delete this[--this.length]; - return this; - }.protect() - -}); - - - -(function(){ - -// FF, IE -var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2}; - -splice.call(object, 1, 1); -if (object[1] == 1) Elements.implement('splice', function(){ - var length = this.length; - var result = splice.apply(this, arguments); - while (length >= this.length) delete this[length--]; - return result; -}.protect()); - -Array.forEachMethod(function(method, name){ - Elements.implement(name, method); -}); - -Array.mirror(Elements); - -/**/ -var createElementAcceptsHTML; -try { - createElementAcceptsHTML = (document.createElement('').name == 'x'); -} catch (e){} - -var escapeQuotes = function(html){ - return ('' + html).replace(/&/g, '&').replace(/"/g, '"'); -}; -/**/ - -Document.implement({ - - newElement: function(tag, props){ - if (props && props.checked != null) props.defaultChecked = props.checked; - /**/// Fix for readonly name and type properties in IE < 8 - if (createElementAcceptsHTML && props){ - tag = '<' + tag; - if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"'; - if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"'; - tag += '>'; - delete props.name; - delete props.type; - } - /**/ - return this.id(this.createElement(tag)).set(props); - } - -}); - -})(); - -(function(){ - -Slick.uidOf(window); -Slick.uidOf(document); - -Document.implement({ - - newTextNode: function(text){ - return this.createTextNode(text); - }, - - getDocument: function(){ - return this; - }, - - getWindow: function(){ - return this.window; - }, - - id: (function(){ - - var types = { - - string: function(id, nocash, doc){ - id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1')); - return (id) ? types.element(id, nocash) : null; - }, - - element: function(el, nocash){ - Slick.uidOf(el); - if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){ - var fireEvent = el.fireEvent; - // wrapping needed in IE7, or else crash - el._fireEvent = function(type, event){ - return fireEvent(type, event); - }; - Object.append(el, Element.Prototype); - } - return el; - }, - - object: function(obj, nocash, doc){ - if (obj.toElement) return types.element(obj.toElement(doc), nocash); - return null; - } - - }; - - types.textnode = types.whitespace = types.window = types.document = function(zero){ - return zero; - }; - - return function(el, nocash, doc){ - if (el && el.$family && el.uniqueNumber) return el; - var type = typeOf(el); - return (types[type]) ? types[type](el, nocash, doc || document) : null; - }; - - })() - -}); - -if (window.$ == null) Window.implement('$', function(el, nc){ - return document.id(el, nc, this.document); -}); - -Window.implement({ - - getDocument: function(){ - return this.document; - }, - - getWindow: function(){ - return this; - } - -}); - -[Document, Element].invoke('implement', { - - getElements: function(expression){ - return Slick.search(this, expression, new Elements); - }, - - getElement: function(expression){ - return document.id(Slick.find(this, expression)); - } - -}); - -var contains = {contains: function(element){ - return Slick.contains(this, element); -}}; - -if (!document.contains) Document.implement(contains); -if (!document.createElement('div').contains) Element.implement(contains); - - - -// tree walking - -var injectCombinator = function(expression, combinator){ - if (!expression) return combinator; - - expression = Object.clone(Slick.parse(expression)); - - var expressions = expression.expressions; - for (var i = expressions.length; i--;) - expressions[i][0].combinator = combinator; - - return expression; -}; - -Object.forEach({ - getNext: '~', - getPrevious: '!~', - getParent: '!' -}, function(combinator, method){ - Element.implement(method, function(expression){ - return this.getElement(injectCombinator(expression, combinator)); - }); -}); - -Object.forEach({ - getAllNext: '~', - getAllPrevious: '!~', - getSiblings: '~~', - getChildren: '>', - getParents: '!' -}, function(combinator, method){ - Element.implement(method, function(expression){ - return this.getElements(injectCombinator(expression, combinator)); - }); -}); - -Element.implement({ - - getFirst: function(expression){ - return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]); - }, - - getLast: function(expression){ - return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast()); - }, - - getWindow: function(){ - return this.ownerDocument.window; - }, - - getDocument: function(){ - return this.ownerDocument; - }, - - getElementById: function(id){ - return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1'))); - }, - - match: function(expression){ - return !expression || Slick.match(this, expression); - } - -}); - - - -if (window.$$ == null) Window.implement('$$', function(selector){ - if (arguments.length == 1){ - if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements); - else if (Type.isEnumerable(selector)) return new Elements(selector); - } - return new Elements(arguments); -}); - -// Inserters - -var inserters = { - - before: function(context, element){ - var parent = element.parentNode; - if (parent) parent.insertBefore(context, element); - }, - - after: function(context, element){ - var parent = element.parentNode; - if (parent) parent.insertBefore(context, element.nextSibling); - }, - - bottom: function(context, element){ - element.appendChild(context); - }, - - top: function(context, element){ - element.insertBefore(context, element.firstChild); - } - -}; - -inserters.inside = inserters.bottom; - - - -// getProperty / setProperty - -var propertyGetters = {}, propertySetters = {}; - -// properties - -var properties = {}; -Array.forEach([ - 'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', - 'frameBorder', 'rowSpan', 'tabIndex', 'useMap' -], function(property){ - properties[property.toLowerCase()] = property; -}); - -properties.html = 'innerHTML'; -properties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent'; - -Object.forEach(properties, function(real, key){ - propertySetters[key] = function(node, value){ - node[real] = value; - }; - propertyGetters[key] = function(node){ - return node[real]; - }; -}); - -// Booleans - -var bools = [ - 'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', - 'disabled', 'readOnly', 'multiple', 'selected', 'noresize', - 'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay', - 'loop' -]; - -var booleans = {}; -Array.forEach(bools, function(bool){ - var lower = bool.toLowerCase(); - booleans[lower] = bool; - propertySetters[lower] = function(node, value){ - node[bool] = !!value; - }; - propertyGetters[lower] = function(node){ - return !!node[bool]; - }; -}); - -// Special cases - -Object.append(propertySetters, { - - 'class': function(node, value){ - ('className' in node) ? node.className = (value || '') : node.setAttribute('class', value); - }, - - 'for': function(node, value){ - ('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value); - }, - - 'style': function(node, value){ - (node.style) ? node.style.cssText = value : node.setAttribute('style', value); - }, - - 'value': function(node, value){ - node.value = (value != null) ? value : ''; - } - -}); - -propertyGetters['class'] = function(node){ - return ('className' in node) ? node.className || null : node.getAttribute('class'); -}; - -/* */ -var el = document.createElement('button'); -// IE sets type as readonly and throws -try { el.type = 'button'; } catch(e){} -if (el.type != 'button') propertySetters.type = function(node, value){ - node.setAttribute('type', value); -}; -el = null; -/* */ - -/**/ -var input = document.createElement('input'); -input.value = 't'; -input.type = 'submit'; -if (input.value != 't') propertySetters.type = function(node, type){ - var value = node.value; - node.type = type; - node.value = value; -}; -input = null; -/**/ - -/* getProperty, setProperty */ - -/* */ -var pollutesGetAttribute = (function(div){ - div.random = 'attribute'; - return (div.getAttribute('random') == 'attribute'); -})(document.createElement('div')); - -var hasCloneBug = (function(test){ - test.innerHTML = ''; - return test.cloneNode(true).firstChild.childNodes.length != 1; -})(document.createElement('div')); -/* */ - -var hasClassList = !!document.createElement('div').classList; - -var classes = function(className){ - var classNames = (className || '').clean().split(" "), uniques = {}; - return classNames.filter(function(className){ - if (className !== "" && !uniques[className]) return uniques[className] = className; - }); -}; - -var addToClassList = function(name){ - this.classList.add(name); -}; - -var removeFromClassList = function(name){ - this.classList.remove(name); -}; - -Element.implement({ - - setProperty: function(name, value){ - var setter = propertySetters[name.toLowerCase()]; - if (setter){ - setter(this, value); - } else { - /* */ - var attributeWhiteList; - if (pollutesGetAttribute) attributeWhiteList = this.retrieve('$attributeWhiteList', {}); - /* */ - - if (value == null){ - this.removeAttribute(name); - /* */ - if (pollutesGetAttribute) delete attributeWhiteList[name]; - /* */ - } else { - this.setAttribute(name, '' + value); - /* */ - if (pollutesGetAttribute) attributeWhiteList[name] = true; - /* */ - } - } - return this; - }, - - setProperties: function(attributes){ - for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); - return this; - }, - - getProperty: function(name){ - var getter = propertyGetters[name.toLowerCase()]; - if (getter) return getter(this); - /* */ - if (pollutesGetAttribute){ - var attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {}); - if (!attr) return null; - if (attr.expando && !attributeWhiteList[name]){ - var outer = this.outerHTML; - // segment by the opening tag and find mention of attribute name - if (outer.substr(0, outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name) < 0) return null; - attributeWhiteList[name] = true; - } - } - /* */ - var result = Slick.getAttribute(this, name); - return (!result && !Slick.hasAttribute(this, name)) ? null : result; - }, - - getProperties: function(){ - var args = Array.from(arguments); - return args.map(this.getProperty, this).associate(args); - }, - - removeProperty: function(name){ - return this.setProperty(name, null); - }, - - removeProperties: function(){ - Array.each(arguments, this.removeProperty, this); - return this; - }, - - set: function(prop, value){ - var property = Element.Properties[prop]; - (property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value); - }.overloadSetter(), - - get: function(prop){ - var property = Element.Properties[prop]; - return (property && property.get) ? property.get.apply(this) : this.getProperty(prop); - }.overloadGetter(), - - erase: function(prop){ - var property = Element.Properties[prop]; - (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); - return this; - }, - - hasClass: hasClassList ? function(className){ - return this.classList.contains(className); - } : function(className){ - return this.className.clean().contains(className, ' '); - }, - - addClass: hasClassList ? function(className){ - classes(className).forEach(addToClassList, this); - return this; - } : function(className){ - this.className = classes(className + ' ' + this.className).join(' '); - return this; - }, - - removeClass: hasClassList ? function(className){ - classes(className).forEach(removeFromClassList, this); - return this; - } : function(className){ - var classNames = classes(this.className); - classes(className).forEach(classNames.erase, classNames); - this.className = classNames.join(' '); - return this; - }, - - toggleClass: function(className, force){ - if (force == null) force = !this.hasClass(className); - return (force) ? this.addClass(className) : this.removeClass(className); - }, - - adopt: function(){ - var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length; - if (length > 1) parent = fragment = document.createDocumentFragment(); - - for (var i = 0; i < length; i++){ - var element = document.id(elements[i], true); - if (element) parent.appendChild(element); - } - - if (fragment) this.appendChild(fragment); - - return this; - }, - - appendText: function(text, where){ - return this.grab(this.getDocument().newTextNode(text), where); - }, - - grab: function(el, where){ - inserters[where || 'bottom'](document.id(el, true), this); - return this; - }, - - inject: function(el, where){ - inserters[where || 'bottom'](this, document.id(el, true)); - return this; - }, - - replaces: function(el){ - el = document.id(el, true); - el.parentNode.replaceChild(this, el); - return this; - }, - - wraps: function(el, where){ - el = document.id(el, true); - return this.replaces(el).grab(el, where); - }, - - getSelected: function(){ - this.selectedIndex; // Safari 3.2.1 - return new Elements(Array.from(this.options).filter(function(option){ - return option.selected; - })); - }, - - toQueryString: function(){ - var queryString = []; - this.getElements('input, select, textarea').each(function(el){ - var type = el.type; - if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return; - - var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){ - // IE - return document.id(opt).get('value'); - }) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value'); - - Array.from(value).each(function(val){ - if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val)); - }); - }); - return queryString.join('&'); - } - -}); - - -// appendHTML - -var appendInserters = { - before: 'beforeBegin', - after: 'afterEnd', - bottom: 'beforeEnd', - top: 'afterBegin', - inside: 'beforeEnd' -}; - -Element.implement('appendHTML', ('insertAdjacentHTML' in document.createElement('div')) ? function(html, where){ - this.insertAdjacentHTML(appendInserters[where || 'bottom'], html); - return this; -} : function(html, where){ - var temp = new Element('div', {html: html}), - children = temp.childNodes, - fragment = temp.firstChild; - - if (!fragment) return this; - if (children.length > 1){ - fragment = document.createDocumentFragment(); - for (var i = 0, l = children.length; i < l; i++){ - fragment.appendChild(children[i]); - } - } - - inserters[where || 'bottom'](fragment, this); - return this; -}); - -var collected = {}, storage = {}; - -var get = function(uid){ - return (storage[uid] || (storage[uid] = {})); -}; - -var clean = function(item){ - var uid = item.uniqueNumber; - if (item.removeEvents) item.removeEvents(); - if (item.clearAttributes) item.clearAttributes(); - if (uid != null){ - delete collected[uid]; - delete storage[uid]; - } - return item; -}; - -var formProps = {input: 'checked', option: 'selected', textarea: 'value'}; - -Element.implement({ - - destroy: function(){ - var children = clean(this).getElementsByTagName('*'); - Array.each(children, clean); - Element.dispose(this); - return null; - }, - - empty: function(){ - Array.from(this.childNodes).each(Element.dispose); - return this; - }, - - dispose: function(){ - return (this.parentNode) ? this.parentNode.removeChild(this) : this; - }, - - clone: function(contents, keepid){ - contents = contents !== false; - var clone = this.cloneNode(contents), ce = [clone], te = [this], i; - - if (contents){ - ce.append(Array.from(clone.getElementsByTagName('*'))); - te.append(Array.from(this.getElementsByTagName('*'))); - } - - for (i = ce.length; i--;){ - var node = ce[i], element = te[i]; - if (!keepid) node.removeAttribute('id'); - /**/ - if (node.clearAttributes){ - node.clearAttributes(); - node.mergeAttributes(element); - node.removeAttribute('uniqueNumber'); - if (node.options){ - var no = node.options, eo = element.options; - for (var j = no.length; j--;) no[j].selected = eo[j].selected; - } - } - /**/ - var prop = formProps[element.tagName.toLowerCase()]; - if (prop && element[prop]) node[prop] = element[prop]; - } - - /**/ - if (hasCloneBug){ - var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object'); - for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML; - } - /**/ - return document.id(clone); - } - -}); - -[Element, Window, Document].invoke('implement', { - - addListener: function(type, fn){ - if (window.attachEvent && !window.addEventListener){ - collected[Slick.uidOf(this)] = this; - } - if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]); - else this.attachEvent('on' + type, fn); - return this; - }, - - removeListener: function(type, fn){ - if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]); - else this.detachEvent('on' + type, fn); - return this; - }, - - retrieve: function(property, dflt){ - var storage = get(Slick.uidOf(this)), prop = storage[property]; - if (dflt != null && prop == null) prop = storage[property] = dflt; - return prop != null ? prop : null; - }, - - store: function(property, value){ - var storage = get(Slick.uidOf(this)); - storage[property] = value; - return this; - }, - - eliminate: function(property){ - var storage = get(Slick.uidOf(this)); - delete storage[property]; - return this; - } - -}); - -/**/ -if (window.attachEvent && !window.addEventListener){ - var gc = function(){ - Object.each(collected, clean); - if (window.CollectGarbage) CollectGarbage(); - window.removeListener('unload', gc); - } - window.addListener('unload', gc); -} -/**/ - -Element.Properties = {}; - - - -Element.Properties.style = { - - set: function(style){ - this.style.cssText = style; - }, - - get: function(){ - return this.style.cssText; - }, - - erase: function(){ - this.style.cssText = ''; - } - -}; - -Element.Properties.tag = { - - get: function(){ - return this.tagName.toLowerCase(); - } - -}; - -Element.Properties.html = { - - set: function(html){ - if (html == null) html = ''; - else if (typeOf(html) == 'array') html = html.join(''); - this.innerHTML = html; - }, - - erase: function(){ - this.innerHTML = ''; - } - -}; - -var supportsHTML5Elements = true, supportsTableInnerHTML = true, supportsTRInnerHTML = true; - -/**/ -// technique by jdbarlett - http://jdbartlett.com/innershiv/ -var div = document.createElement('div'); -div.innerHTML = ''; -supportsHTML5Elements = (div.childNodes.length == 1); -if (!supportsHTML5Elements){ - var tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '), - fragment = document.createDocumentFragment(), l = tags.length; - while (l--) fragment.createElement(tags[l]); -} -div = null; -/**/ - -/**/ -supportsTableInnerHTML = Function.attempt(function(){ - var table = document.createElement('table'); - table.innerHTML = ''; - return true; -}); - -/**/ -var tr = document.createElement('tr'), html = ''; -tr.innerHTML = html; -supportsTRInnerHTML = (tr.innerHTML == html); -tr = null; -/**/ - -if (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){ - - Element.Properties.html.set = (function(set){ - - var translations = { - table: [1, '', '
        '], - select: [1, ''], - tbody: [2, '', '
        '], - tr: [3, '', '
        '] - }; - - translations.thead = translations.tfoot = translations.tbody; - - return function(html){ - var wrap = translations[this.get('tag')]; - if (!wrap && !supportsHTML5Elements) wrap = [0, '', '']; - if (!wrap) return set.call(this, html); - - var level = wrap[0], wrapper = document.createElement('div'), target = wrapper; - if (!supportsHTML5Elements) fragment.appendChild(wrapper); - wrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join(''); - while (level--) target = target.firstChild; - this.empty().adopt(target.childNodes); - if (!supportsHTML5Elements) fragment.removeChild(wrapper); - wrapper = null; - }; - - })(Element.Properties.html.set); -} -/*
        */ - -/**/ -var testForm = document.createElement('form'); -testForm.innerHTML = ''; - -if (testForm.firstChild.value != 's') Element.Properties.value = { - - set: function(value){ - var tag = this.get('tag'); - if (tag != 'select') return this.setProperty('value', value); - var options = this.getElements('option'); - value = String(value); - for (var i = 0; i < options.length; i++){ - var option = options[i], - attr = option.getAttributeNode('value'), - optionValue = (attr && attr.specified) ? option.value : option.get('text'); - if (optionValue === value) return option.selected = true; - } - }, - - get: function(){ - var option = this, tag = option.get('tag'); - - if (tag != 'select' && tag != 'option') return this.getProperty('value'); - - if (tag == 'select' && !(option = option.getSelected()[0])) return ''; - - var attr = option.getAttributeNode('value'); - return (attr && attr.specified) ? option.value : option.get('text'); - } - -}; -testForm = null; -/**/ - -/**/ -if (document.createElement('div').getAttributeNode('id')) Element.Properties.id = { - set: function(id){ - this.id = this.getAttributeNode('id').value = id; - }, - get: function(){ - return this.id || null; - }, - erase: function(){ - this.id = this.getAttributeNode('id').value = ''; - } -}; -/**/ - -})(); - - -/* ---- - -name: Element.Style - -description: Contains methods for interacting with the styles of Elements in a fashionable way. - -license: MIT-style license. - -requires: Element - -provides: Element.Style - -... -*/ - -(function(){ - -var html = document.html, el; - -// -// Check for oldIE, which does not remove styles when they're set to null -el = document.createElement('div'); -el.style.color = 'red'; -el.style.color = null; -var doesNotRemoveStyles = el.style.color == 'red'; - -// check for oldIE, which returns border* shorthand styles in the wrong order (color-width-style instead of width-style-color) -var border = '1px solid #123abc'; -el.style.border = border; -var returnsBordersInWrongOrder = el.style.border != border; -el = null; -// - -var hasGetComputedStyle = !!window.getComputedStyle; - -Element.Properties.styles = {set: function(styles){ - this.setStyles(styles); -}}; - -var hasOpacity = (html.style.opacity != null), - hasFilter = (html.style.filter != null), - reAlpha = /alpha\(opacity=([\d.]+)\)/i; - -var setVisibility = function(element, opacity){ - element.store('$opacity', opacity); - element.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden'; -}; - -// -var setFilter = function(element, regexp, value){ - var style = element.style, - filter = style.filter || element.getComputedStyle('filter') || ''; - style.filter = (regexp.test(filter) ? filter.replace(regexp, value) : filter + ' ' + value).trim(); - if (!style.filter) style.removeAttribute('filter'); -}; -// - -var setOpacity = (hasOpacity ? function(element, opacity){ - element.style.opacity = opacity; -} : (hasFilter ? function(element, opacity){ - if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1; - if (opacity == null || opacity == 1){ - setFilter(element, reAlpha, ''); - if (opacity == 1 && getOpacity(element) != 1) setFilter(element, reAlpha, 'alpha(opacity=100)'); - } else { - setFilter(element, reAlpha, 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')'); - } -} : setVisibility)); - -var getOpacity = (hasOpacity ? function(element){ - var opacity = element.style.opacity || element.getComputedStyle('opacity'); - return (opacity == '') ? 1 : opacity.toFloat(); -} : (hasFilter ? function(element){ - var filter = (element.style.filter || element.getComputedStyle('filter')), - opacity; - if (filter) opacity = filter.match(reAlpha); - return (opacity == null || filter == null) ? 1 : (opacity[1] / 100); -} : function(element){ - var opacity = element.retrieve('$opacity'); - if (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1); - return opacity; -})); - -var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat', - namedPositions = {left: '0%', top: '0%', center: '50%', right: '100%', bottom: '100%'}, - hasBackgroundPositionXY = (html.style.backgroundPositionX != null); - -// -var removeStyle = function(style, property){ - if (property == 'backgroundPosition'){ - style.removeAttribute(property + 'X'); - property += 'Y'; - } - style.removeAttribute(property); -}; -// - -Element.implement({ - - getComputedStyle: function(property){ - if (!hasGetComputedStyle && this.currentStyle) return this.currentStyle[property.camelCase()]; - var defaultView = Element.getDocument(this).defaultView, - computed = defaultView ? defaultView.getComputedStyle(this, null) : null; - return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : ''; - }, - - setStyle: function(property, value){ - if (property == 'opacity'){ - if (value != null) value = parseFloat(value); - setOpacity(this, value); - return this; - } - property = (property == 'float' ? floatName : property).camelCase(); - if (typeOf(value) != 'string'){ - var map = (Element.Styles[property] || '@').split(' '); - value = Array.from(value).map(function(val, i){ - if (!map[i]) return ''; - return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; - }).join(' '); - } else if (value == String(Number(value))){ - value = Math.round(value); - } - this.style[property] = value; - // - if ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){ - removeStyle(this.style, property); - } - // - return this; - }, - - getStyle: function(property){ - if (property == 'opacity') return getOpacity(this); - property = (property == 'float' ? floatName : property).camelCase(); - var result = this.style[property]; - if (!result || property == 'zIndex'){ - if (Element.ShortStyles.hasOwnProperty(property)){ - result = []; - for (var s in Element.ShortStyles[property]) result.push(this.getStyle(s)); - return result.join(' '); - } - result = this.getComputedStyle(property); - } - if (hasBackgroundPositionXY && /^backgroundPosition[XY]?$/.test(property)){ - return result.replace(/(top|right|bottom|left)/g, function(position){ - return namedPositions[position]; - }) || '0px'; - } - if (!result && property == 'backgroundPosition') return '0px 0px'; - if (result){ - result = String(result); - var color = result.match(/rgba?\([\d\s,]+\)/); - if (color) result = result.replace(color[0], color[0].rgbToHex()); - } - if (!hasGetComputedStyle && !this.style[property]){ - if ((/^(height|width)$/).test(property) && !(/px$/.test(result))){ - var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; - values.each(function(value){ - size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); - }, this); - return this['offset' + property.capitalize()] - size + 'px'; - } - if ((/^border(.+)Width|margin|padding/).test(property) && isNaN(parseFloat(result))){ - return '0px'; - } - } - // - if (returnsBordersInWrongOrder && /^border(Top|Right|Bottom|Left)?$/.test(property) && /^#/.test(result)){ - return result.replace(/^(.+)\s(.+)\s(.+)$/, '$2 $3 $1'); - } - // - return result; - }, - - setStyles: function(styles){ - for (var style in styles) this.setStyle(style, styles[style]); - return this; - }, - - getStyles: function(){ - var result = {}; - Array.flatten(arguments).each(function(key){ - result[key] = this.getStyle(key); - }, this); - return result; - } - -}); - -Element.Styles = { - left: '@px', top: '@px', bottom: '@px', right: '@px', - width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px', - backgroundColor: 'rgb(@, @, @)', backgroundSize: '@px', backgroundPosition: '@px @px', color: 'rgb(@, @, @)', - fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)', - margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)', - borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)', - zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@' -}; - - - - - -Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; - -['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ - var Short = Element.ShortStyles; - var All = Element.Styles; - ['margin', 'padding'].each(function(style){ - var sd = style + direction; - Short[style][sd] = All[sd] = '@px'; - }); - var bd = 'border' + direction; - Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; - var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; - Short[bd] = {}; - Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; - Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; - Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; -}); - -if (hasBackgroundPositionXY) Element.ShortStyles.backgroundPosition = {backgroundPositionX: '@', backgroundPositionY: '@'}; -})(); - - -/* ---- - -name: Element.Event - -description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary. - -license: MIT-style license. - -requires: [Element, Event] - -provides: Element.Event - -... -*/ - -(function(){ - -Element.Properties.events = {set: function(events){ - this.addEvents(events); -}}; - -[Element, Window, Document].invoke('implement', { - - addEvent: function(type, fn){ - var events = this.retrieve('events', {}); - if (!events[type]) events[type] = {keys: [], values: []}; - if (events[type].keys.contains(fn)) return this; - events[type].keys.push(fn); - var realType = type, - custom = Element.Events[type], - condition = fn, - self = this; - if (custom){ - if (custom.onAdd) custom.onAdd.call(this, fn, type); - if (custom.condition){ - condition = function(event){ - if (custom.condition.call(this, event, type)) return fn.call(this, event); - return true; - }; - } - if (custom.base) realType = Function.from(custom.base).call(this, type); - } - var defn = function(){ - return fn.call(self); - }; - var nativeEvent = Element.NativeEvents[realType]; - if (nativeEvent){ - if (nativeEvent == 2){ - defn = function(event){ - event = new DOMEvent(event, self.getWindow()); - if (condition.call(self, event) === false) event.stop(); - }; - } - this.addListener(realType, defn, arguments[2]); - } - events[type].values.push(defn); - return this; - }, - - removeEvent: function(type, fn){ - var events = this.retrieve('events'); - if (!events || !events[type]) return this; - var list = events[type]; - var index = list.keys.indexOf(fn); - if (index == -1) return this; - var value = list.values[index]; - delete list.keys[index]; - delete list.values[index]; - var custom = Element.Events[type]; - if (custom){ - if (custom.onRemove) custom.onRemove.call(this, fn, type); - if (custom.base) type = Function.from(custom.base).call(this, type); - } - return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this; - }, - - addEvents: function(events){ - for (var event in events) this.addEvent(event, events[event]); - return this; - }, - - removeEvents: function(events){ - var type; - if (typeOf(events) == 'object'){ - for (type in events) this.removeEvent(type, events[type]); - return this; - } - var attached = this.retrieve('events'); - if (!attached) return this; - if (!events){ - for (type in attached) this.removeEvents(type); - this.eliminate('events'); - } else if (attached[events]){ - attached[events].keys.each(function(fn){ - this.removeEvent(events, fn); - }, this); - delete attached[events]; - } - return this; - }, - - fireEvent: function(type, args, delay){ - var events = this.retrieve('events'); - if (!events || !events[type]) return this; - args = Array.from(args); - - events[type].keys.each(function(fn){ - if (delay) fn.delay(delay, this, args); - else fn.apply(this, args); - }, this); - return this; - }, - - cloneEvents: function(from, type){ - from = document.id(from); - var events = from.retrieve('events'); - if (!events) return this; - if (!type){ - for (var eventType in events) this.cloneEvents(from, eventType); - } else if (events[type]){ - events[type].keys.each(function(fn){ - this.addEvent(type, fn); - }, this); - } - return this; - } - -}); - -Element.NativeEvents = { - click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons - mousewheel: 2, DOMMouseScroll: 2, //mouse wheel - mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement - keydown: 2, keypress: 2, keyup: 2, //keyboard - orientationchange: 2, // mobile - touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch - gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture - focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements - load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window - hashchange: 1, popstate: 2, // history - error: 1, abort: 1, scroll: 1 //misc -}; - -Element.Events = { - mousewheel: { - base: 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll' - } -}; - -var check = function(event){ - var related = event.relatedTarget; - if (related == null) return true; - if (!related) return false; - return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related)); -}; - -if ('onmouseenter' in document.documentElement){ - Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2; - Element.MouseenterCheck = check; -} else { - Element.Events.mouseenter = { - base: 'mouseover', - condition: check - }; - - Element.Events.mouseleave = { - base: 'mouseout', - condition: check - }; -} - -/**/ -if (!window.addEventListener){ - Element.NativeEvents.propertychange = 2; - Element.Events.change = { - base: function(){ - var type = this.type; - return (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change'; - }, - condition: function(event){ - return event.type != 'propertychange' || event.event.propertyName == 'checked'; - } - }; -} -/**/ - - - -})(); - - -/* ---- - -name: Element.Delegation - -description: Extends the Element native object to include the delegate method for more efficient event management. - -license: MIT-style license. - -requires: [Element.Event] - -provides: [Element.Delegation] - -... -*/ - -(function(){ - -var eventListenerSupport = !!window.addEventListener; - -Element.NativeEvents.focusin = Element.NativeEvents.focusout = 2; - -var bubbleUp = function(self, match, fn, event, target){ - while (target && target != self){ - if (match(target, event)) return fn.call(target, event, target); - target = document.id(target.parentNode); - } -}; - -var map = { - mouseenter: { - base: 'mouseover', - condition: Element.MouseenterCheck - }, - mouseleave: { - base: 'mouseout', - condition: Element.MouseenterCheck - }, - focus: { - base: 'focus' + (eventListenerSupport ? '' : 'in'), - capture: true - }, - blur: { - base: eventListenerSupport ? 'blur' : 'focusout', - capture: true - } -}; - -/**/ -var _key = '$delegation:'; -var formObserver = function(type){ - - return { - - base: 'focusin', - - remove: function(self, uid){ - var list = self.retrieve(_key + type + 'listeners', {})[uid]; - if (list && list.forms) for (var i = list.forms.length; i--;){ - list.forms[i].removeEvent(type, list.fns[i]); - } - }, - - listen: function(self, match, fn, event, target, uid){ - var form = (target.get('tag') == 'form') ? target : event.target.getParent('form'); - if (!form) return; - - var listeners = self.retrieve(_key + type + 'listeners', {}), - listener = listeners[uid] || {forms: [], fns: []}, - forms = listener.forms, fns = listener.fns; - - if (forms.indexOf(form) != -1) return; - forms.push(form); - - var _fn = function(event){ - bubbleUp(self, match, fn, event, target); - }; - form.addEvent(type, _fn); - fns.push(_fn); - - listeners[uid] = listener; - self.store(_key + type + 'listeners', listeners); - } - }; -}; - -var inputObserver = function(type){ - return { - base: 'focusin', - listen: function(self, match, fn, event, target){ - var events = {blur: function(){ - this.removeEvents(events); - }}; - events[type] = function(event){ - bubbleUp(self, match, fn, event, target); - }; - event.target.addEvents(events); - } - }; -}; - -if (!eventListenerSupport) Object.append(map, { - submit: formObserver('submit'), - reset: formObserver('reset'), - change: inputObserver('change'), - select: inputObserver('select') -}); -/**/ - -var proto = Element.prototype, - addEvent = proto.addEvent, - removeEvent = proto.removeEvent; - -var relay = function(old, method){ - return function(type, fn, useCapture){ - if (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture); - var parsed = Slick.parse(type).expressions[0][0]; - if (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture); - var newType = parsed.tag; - parsed.pseudos.slice(1).each(function(pseudo){ - newType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : ''); - }); - old.call(this, type, fn); - return method.call(this, newType, parsed.pseudos[0].value, fn); - }; -}; - -var delegation = { - - addEvent: function(type, match, fn){ - var storage = this.retrieve('$delegates', {}), stored = storage[type]; - if (stored) for (var _uid in stored){ - if (stored[_uid].fn == fn && stored[_uid].match == match) return this; - } - - var _type = type, _match = match, _fn = fn, _map = map[type] || {}; - type = _map.base || _type; - - match = function(target){ - return Slick.match(target, _match); - }; - - var elementEvent = Element.Events[_type]; - if (_map.condition || elementEvent && elementEvent.condition){ - var __match = match, condition = _map.condition || elementEvent.condition; - match = function(target, event){ - return __match(target, event) && condition.call(target, event, type); - }; - } - - var self = this, uid = String.uniqueID(); - var delegator = _map.listen ? function(event, target){ - if (!target && event && event.target) target = event.target; - if (target) _map.listen(self, match, fn, event, target, uid); - } : function(event, target){ - if (!target && event && event.target) target = event.target; - if (target) bubbleUp(self, match, fn, event, target); - }; - - if (!stored) stored = {}; - stored[uid] = { - match: _match, - fn: _fn, - delegator: delegator - }; - storage[_type] = stored; - return addEvent.call(this, type, delegator, _map.capture); - }, - - removeEvent: function(type, match, fn, _uid){ - var storage = this.retrieve('$delegates', {}), stored = storage[type]; - if (!stored) return this; - - if (_uid){ - var _type = type, delegator = stored[_uid].delegator, _map = map[type] || {}; - type = _map.base || _type; - if (_map.remove) _map.remove(this, _uid); - delete stored[_uid]; - storage[_type] = stored; - return removeEvent.call(this, type, delegator, _map.capture); - } - - var __uid, s; - if (fn) for (__uid in stored){ - s = stored[__uid]; - if (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid); - } else for (__uid in stored){ - s = stored[__uid]; - if (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid); - } - return this; - } - -}; - -[Element, Window, Document].invoke('implement', { - addEvent: relay(addEvent, delegation.addEvent), - removeEvent: relay(removeEvent, delegation.removeEvent) -}); - -})(); - - -/* ---- - -name: Element.Dimensions - -description: Contains methods to work with size, scroll, or positioning of Elements and the window object. - -license: MIT-style license. - -credits: - - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). - - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). - -requires: [Element, Element.Style] - -provides: [Element.Dimensions] - -... -*/ - -(function(){ - -var element = document.createElement('div'), - child = document.createElement('div'); -element.style.height = '0'; -element.appendChild(child); -var brokenOffsetParent = (child.offsetParent === element); -element = child = null; - -var isOffset = function(el){ - return styleString(el, 'position') != 'static' || isBody(el); -}; - -var isOffsetStatic = function(el){ - return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName); -}; - -Element.implement({ - - scrollTo: function(x, y){ - if (isBody(this)){ - this.getWindow().scrollTo(x, y); - } else { - this.scrollLeft = x; - this.scrollTop = y; - } - return this; - }, - - getSize: function(){ - if (isBody(this)) return this.getWindow().getSize(); - return {x: this.offsetWidth, y: this.offsetHeight}; - }, - - getScrollSize: function(){ - if (isBody(this)) return this.getWindow().getScrollSize(); - return {x: this.scrollWidth, y: this.scrollHeight}; - }, - - getScroll: function(){ - if (isBody(this)) return this.getWindow().getScroll(); - return {x: this.scrollLeft, y: this.scrollTop}; - }, - - getScrolls: function(){ - var element = this.parentNode, position = {x: 0, y: 0}; - while (element && !isBody(element)){ - position.x += element.scrollLeft; - position.y += element.scrollTop; - element = element.parentNode; - } - return position; - }, - - getOffsetParent: brokenOffsetParent ? function(){ - var element = this; - if (isBody(element) || styleString(element, 'position') == 'fixed') return null; - - var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset; - while ((element = element.parentNode)){ - if (isOffsetCheck(element)) return element; - } - return null; - } : function(){ - var element = this; - if (isBody(element) || styleString(element, 'position') == 'fixed') return null; - - try { - return element.offsetParent; - } catch(e) {} - return null; - }, - - getOffsets: function(){ - var hasGetBoundingClientRect = this.getBoundingClientRect; - - if (hasGetBoundingClientRect){ - var bound = this.getBoundingClientRect(), - html = document.id(this.getDocument().documentElement), - htmlScroll = html.getScroll(), - elemScrolls = this.getScrolls(), - isFixed = (styleString(this, 'position') == 'fixed'); - - return { - x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, - y: bound.top.toInt() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop - }; - } - - var element = this, position = {x: 0, y: 0}; - if (isBody(this)) return position; - - while (element && !isBody(element)){ - position.x += element.offsetLeft; - position.y += element.offsetTop; - - element = element.offsetParent; - } - - return position; - }, - - getPosition: function(relative){ - var offset = this.getOffsets(), - scroll = this.getScrolls(); - var position = { - x: offset.x - scroll.x, - y: offset.y - scroll.y - }; - - if (relative && (relative = document.id(relative))){ - var relativePosition = relative.getPosition(); - return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)}; - } - return position; - }, - - getCoordinates: function(element){ - if (isBody(this)) return this.getWindow().getCoordinates(); - var position = this.getPosition(element), - size = this.getSize(); - var obj = { - left: position.x, - top: position.y, - width: size.x, - height: size.y - }; - obj.right = obj.left + obj.width; - obj.bottom = obj.top + obj.height; - return obj; - }, - - computePosition: function(obj){ - return { - left: obj.x - styleNumber(this, 'margin-left'), - top: obj.y - styleNumber(this, 'margin-top') - }; - }, - - setPosition: function(obj){ - return this.setStyles(this.computePosition(obj)); - } - -}); - - -[Document, Window].invoke('implement', { - - getSize: function(){ - var doc = getCompatElement(this); - return {x: doc.clientWidth, y: doc.clientHeight}; - }, - - getScroll: function(){ - var win = this.getWindow(), doc = getCompatElement(this); - return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; - }, - - getScrollSize: function(){ - var doc = getCompatElement(this), - min = this.getSize(), - body = this.getDocument().body; - - return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)}; - }, - - getPosition: function(){ - return {x: 0, y: 0}; - }, - - getCoordinates: function(){ - var size = this.getSize(); - return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; - } - -}); - -// private methods - -var styleString = Element.getComputedStyle; - -function styleNumber(element, style){ - return styleString(element, style).toInt() || 0; -} - -function borderBox(element){ - return styleString(element, '-moz-box-sizing') == 'border-box'; -} - -function topBorder(element){ - return styleNumber(element, 'border-top-width'); -} - -function leftBorder(element){ - return styleNumber(element, 'border-left-width'); -} - -function isBody(element){ - return (/^(?:body|html)$/i).test(element.tagName); -} - -function getCompatElement(element){ - var doc = element.getDocument(); - return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; -} - -})(); - -//aliases -Element.alias({position: 'setPosition'}); //compatability - -[Window, Document, Element].invoke('implement', { - - getHeight: function(){ - return this.getSize().y; - }, - - getWidth: function(){ - return this.getSize().x; - }, - - getScrollTop: function(){ - return this.getScroll().y; - }, - - getScrollLeft: function(){ - return this.getScroll().x; - }, - - getScrollHeight: function(){ - return this.getScrollSize().y; - }, - - getScrollWidth: function(){ - return this.getScrollSize().x; - }, - - getTop: function(){ - return this.getPosition().y; - }, - - getLeft: function(){ - return this.getPosition().x; - } - -}); - - -/* ---- - -name: Fx - -description: Contains the basic animation logic to be extended by all other Fx Classes. - -license: MIT-style license. - -requires: [Chain, Events, Options] - -provides: Fx - -... -*/ - -(function(){ - -var Fx = this.Fx = new Class({ - - Implements: [Chain, Events, Options], - - options: { - /* - onStart: nil, - onCancel: nil, - onComplete: nil, - */ - fps: 60, - unit: false, - duration: 500, - frames: null, - frameSkip: true, - link: 'ignore' - }, - - initialize: function(options){ - this.subject = this.subject || this; - this.setOptions(options); - }, - - getTransition: function(){ - return function(p){ - return -(Math.cos(Math.PI * p) - 1) / 2; - }; - }, - - step: function(now){ - if (this.options.frameSkip){ - var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval; - this.time = now; - this.frame += frames; - } else { - this.frame++; - } - - if (this.frame < this.frames){ - var delta = this.transition(this.frame / this.frames); - this.set(this.compute(this.from, this.to, delta)); - } else { - this.frame = this.frames; - this.set(this.compute(this.from, this.to, 1)); - this.stop(); - } - }, - - set: function(now){ - return now; - }, - - compute: function(from, to, delta){ - return Fx.compute(from, to, delta); - }, - - check: function(){ - if (!this.isRunning()) return true; - switch (this.options.link){ - case 'cancel': this.cancel(); return true; - case 'chain': this.chain(this.caller.pass(arguments, this)); return false; - } - return false; - }, - - start: function(from, to){ - if (!this.check(from, to)) return this; - this.from = from; - this.to = to; - this.frame = (this.options.frameSkip) ? 0 : -1; - this.time = null; - this.transition = this.getTransition(); - var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration; - this.duration = Fx.Durations[duration] || duration.toInt(); - this.frameInterval = 1000 / fps; - this.frames = frames || Math.round(this.duration / this.frameInterval); - this.fireEvent('start', this.subject); - pushInstance.call(this, fps); - return this; - }, - - stop: function(){ - if (this.isRunning()){ - this.time = null; - pullInstance.call(this, this.options.fps); - if (this.frames == this.frame){ - this.fireEvent('complete', this.subject); - if (!this.callChain()) this.fireEvent('chainComplete', this.subject); - } else { - this.fireEvent('stop', this.subject); - } - } - return this; - }, - - cancel: function(){ - if (this.isRunning()){ - this.time = null; - pullInstance.call(this, this.options.fps); - this.frame = this.frames; - this.fireEvent('cancel', this.subject).clearChain(); - } - return this; - }, - - pause: function(){ - if (this.isRunning()){ - this.time = null; - pullInstance.call(this, this.options.fps); - } - return this; - }, - - resume: function(){ - if (this.isPaused()) pushInstance.call(this, this.options.fps); - return this; - }, - - isRunning: function(){ - var list = instances[this.options.fps]; - return list && list.contains(this); - }, - - isPaused: function(){ - return (this.frame < this.frames) && !this.isRunning(); - } - -}); - -Fx.compute = function(from, to, delta){ - return (to - from) * delta + from; -}; - -Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; - -// global timers - -var instances = {}, timers = {}; - -var loop = function(){ - var now = Date.now(); - for (var i = this.length; i--;){ - var instance = this[i]; - if (instance) instance.step(now); - } -}; - -var pushInstance = function(fps){ - var list = instances[fps] || (instances[fps] = []); - list.push(this); - if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list); -}; - -var pullInstance = function(fps){ - var list = instances[fps]; - if (list){ - list.erase(this); - if (!list.length && timers[fps]){ - delete instances[fps]; - timers[fps] = clearInterval(timers[fps]); - } - } -}; - -})(); - - -/* ---- - -name: Fx.CSS - -description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. - -license: MIT-style license. - -requires: [Fx, Element.Style] - -provides: Fx.CSS - -... -*/ - -Fx.CSS = new Class({ - - Extends: Fx, - - //prepares the base from/to object - - prepare: function(element, property, values){ - values = Array.from(values); - var from = values[0], to = values[1]; - if (to == null){ - to = from; - from = element.getStyle(property); - var unit = this.options.unit; - // adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299 - if (unit && from && typeof from == 'string' && from.slice(-unit.length) != unit && parseFloat(from) != 0){ - element.setStyle(property, to + unit); - var value = element.getComputedStyle(property); - // IE and Opera support pixelLeft or pixelWidth - if (!(/px$/.test(value))){ - value = element.style[('pixel-' + property).camelCase()]; - if (value == null){ - // adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - var left = element.style.left; - element.style.left = to + unit; - value = element.style.pixelLeft; - element.style.left = left; - } - } - from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0); - element.setStyle(property, from + unit); - } - } - return {from: this.parse(from), to: this.parse(to)}; - }, - - //parses a value into an array - - parse: function(value){ - value = Function.from(value)(); - value = (typeof value == 'string') ? value.split(' ') : Array.from(value); - return value.map(function(val){ - val = String(val); - var found = false; - Object.each(Fx.CSS.Parsers, function(parser, key){ - if (found) return; - var parsed = parser.parse(val); - if (parsed || parsed === 0) found = {value: parsed, parser: parser}; - }); - found = found || {value: val, parser: Fx.CSS.Parsers.String}; - return found; - }); - }, - - //computes by a from and to prepared objects, using their parsers. - - compute: function(from, to, delta){ - var computed = []; - (Math.min(from.length, to.length)).times(function(i){ - computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); - }); - computed.$family = Function.from('fx:css:value'); - return computed; - }, - - //serves the value as settable - - serve: function(value, unit){ - if (typeOf(value) != 'fx:css:value') value = this.parse(value); - var returned = []; - value.each(function(bit){ - returned = returned.concat(bit.parser.serve(bit.value, unit)); - }); - return returned; - }, - - //renders the change to an element - - render: function(element, property, value, unit){ - element.setStyle(property, this.serve(value, unit)); - }, - - //searches inside the page css to find the values for a selector - - search: function(selector){ - if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; - var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$'); - - var searchStyles = function(rules){ - Array.each(rules, function(rule, i){ - if (rule.media){ - searchStyles(rule.rules || rule.cssRules); - return; - } - if (!rule.style) return; - var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ - return m.toLowerCase(); - }) : null; - if (!selectorText || !selectorTest.test(selectorText)) return; - Object.each(Element.Styles, function(value, style){ - if (!rule.style[style] || Element.ShortStyles[style]) return; - value = String(rule.style[style]); - to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value; - }); - }); - }; - - Array.each(document.styleSheets, function(sheet, j){ - var href = sheet.href; - if (href && href.indexOf('://') > -1 && href.indexOf(document.domain) == -1) return; - var rules = sheet.rules || sheet.cssRules; - searchStyles(rules); - }); - return Fx.CSS.Cache[selector] = to; - } - -}); - -Fx.CSS.Cache = {}; - -Fx.CSS.Parsers = { - - Color: { - parse: function(value){ - if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); - return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; - }, - compute: function(from, to, delta){ - return from.map(function(value, i){ - return Math.round(Fx.compute(from[i], to[i], delta)); - }); - }, - serve: function(value){ - return value.map(Number); - } - }, - - Number: { - parse: parseFloat, - compute: Fx.compute, - serve: function(value, unit){ - return (unit) ? value + unit : value; - } - }, - - String: { - parse: Function.from(false), - compute: function(zero, one){ - return one; - }, - serve: function(zero){ - return zero; - } - } - -}; - - - - -/* ---- - -name: Fx.Tween - -description: Formerly Fx.Style, effect to transition any CSS property for an element. - -license: MIT-style license. - -requires: Fx.CSS - -provides: [Fx.Tween, Element.fade, Element.highlight] - -... -*/ - -Fx.Tween = new Class({ - - Extends: Fx.CSS, - - initialize: function(element, options){ - this.element = this.subject = document.id(element); - this.parent(options); - }, - - set: function(property, now){ - if (arguments.length == 1){ - now = property; - property = this.property || this.options.property; - } - this.render(this.element, property, now, this.options.unit); - return this; - }, - - start: function(property, from, to){ - if (!this.check(property, from, to)) return this; - var args = Array.flatten(arguments); - this.property = this.options.property || args.shift(); - var parsed = this.prepare(this.element, this.property, args); - return this.parent(parsed.from, parsed.to); - } - -}); - -Element.Properties.tween = { - - set: function(options){ - this.get('tween').cancel().setOptions(options); - return this; - }, - - get: function(){ - var tween = this.retrieve('tween'); - if (!tween){ - tween = new Fx.Tween(this, {link: 'cancel'}); - this.store('tween', tween); - } - return tween; - } - -}; - -Element.implement({ - - tween: function(property, from, to){ - this.get('tween').start(property, from, to); - return this; - }, - - fade: function(how){ - var fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle; - if (args[1] == null) args[1] = 'toggle'; - switch (args[1]){ - case 'in': method = 'start'; args[1] = 1; break; - case 'out': method = 'start'; args[1] = 0; break; - case 'show': method = 'set'; args[1] = 1; break; - case 'hide': method = 'set'; args[1] = 0; break; - case 'toggle': - var flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1); - method = 'start'; - args[1] = flag ? 0 : 1; - this.store('fade:flag', !flag); - toggle = true; - break; - default: method = 'start'; - } - if (!toggle) this.eliminate('fade:flag'); - fade[method].apply(fade, args); - var to = args[args.length - 1]; - if (method == 'set' || to != 0) this.setStyle('visibility', to == 0 ? 'hidden' : 'visible'); - else fade.chain(function(){ - this.element.setStyle('visibility', 'hidden'); - this.callChain(); - }); - return this; - }, - - highlight: function(start, end){ - if (!end){ - end = this.retrieve('highlight:original', this.getStyle('background-color')); - end = (end == 'transparent') ? '#fff' : end; - } - var tween = this.get('tween'); - tween.start('background-color', start || '#ffff88', end).chain(function(){ - this.setStyle('background-color', this.retrieve('highlight:original')); - tween.callChain(); - }.bind(this)); - return this; - } - -}); - - -/* ---- - -name: Fx.Morph - -description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules. - -license: MIT-style license. - -requires: Fx.CSS - -provides: Fx.Morph - -... -*/ - -Fx.Morph = new Class({ - - Extends: Fx.CSS, - - initialize: function(element, options){ - this.element = this.subject = document.id(element); - this.parent(options); - }, - - set: function(now){ - if (typeof now == 'string') now = this.search(now); - for (var p in now) this.render(this.element, p, now[p], this.options.unit); - return this; - }, - - compute: function(from, to, delta){ - var now = {}; - for (var p in from) now[p] = this.parent(from[p], to[p], delta); - return now; - }, - - start: function(properties){ - if (!this.check(properties)) return this; - if (typeof properties == 'string') properties = this.search(properties); - var from = {}, to = {}; - for (var p in properties){ - var parsed = this.prepare(this.element, p, properties[p]); - from[p] = parsed.from; - to[p] = parsed.to; - } - return this.parent(from, to); - } - -}); - -Element.Properties.morph = { - - set: function(options){ - this.get('morph').cancel().setOptions(options); - return this; - }, - - get: function(){ - var morph = this.retrieve('morph'); - if (!morph){ - morph = new Fx.Morph(this, {link: 'cancel'}); - this.store('morph', morph); - } - return morph; - } - -}; - -Element.implement({ - - morph: function(props){ - this.get('morph').start(props); - return this; - } - -}); - - -/* ---- - -name: Fx.Transitions - -description: Contains a set of advanced transitions to be used with any of the Fx Classes. - -license: MIT-style license. - -credits: - - Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. - -requires: Fx - -provides: Fx.Transitions - -... -*/ - -Fx.implement({ - - getTransition: function(){ - var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; - if (typeof trans == 'string'){ - var data = trans.split(':'); - trans = Fx.Transitions; - trans = trans[data[0]] || trans[data[0].capitalize()]; - if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; - } - return trans; - } - -}); - -Fx.Transition = function(transition, params){ - params = Array.from(params); - var easeIn = function(pos){ - return transition(pos, params); - }; - return Object.append(easeIn, { - easeIn: easeIn, - easeOut: function(pos){ - return 1 - transition(1 - pos, params); - }, - easeInOut: function(pos){ - return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2; - } - }); -}; - -Fx.Transitions = { - - linear: function(zero){ - return zero; - } - -}; - - - -Fx.Transitions.extend = function(transitions){ - for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); -}; - -Fx.Transitions.extend({ - - Pow: function(p, x){ - return Math.pow(p, x && x[0] || 6); - }, - - Expo: function(p){ - return Math.pow(2, 8 * (p - 1)); - }, - - Circ: function(p){ - return 1 - Math.sin(Math.acos(p)); - }, - - Sine: function(p){ - return 1 - Math.cos(p * Math.PI / 2); - }, - - Back: function(p, x){ - x = x && x[0] || 1.618; - return Math.pow(p, 2) * ((x + 1) * p - x); - }, - - Bounce: function(p){ - var value; - for (var a = 0, b = 1; 1; a += b, b /= 2){ - if (p >= (7 - 4 * a) / 11){ - value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); - break; - } - } - return value; - }, - - Elastic: function(p, x){ - return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3); - } - -}); - -['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ - Fx.Transitions[transition] = new Fx.Transition(function(p){ - return Math.pow(p, i + 2); - }); -}); - - -/* ---- - -name: Request - -description: Powerful all purpose Request Class. Uses XMLHTTPRequest. - -license: MIT-style license. - -requires: [Object, Element, Chain, Events, Options, Browser] - -provides: Request - -... -*/ - -(function(){ - -var empty = function(){}, - progressSupport = ('onprogress' in new Browser.Request); - -var Request = this.Request = new Class({ - - Implements: [Chain, Events, Options], - - options: {/* - onRequest: function(){}, - onLoadstart: function(event, xhr){}, - onProgress: function(event, xhr){}, - onComplete: function(){}, - onCancel: function(){}, - onSuccess: function(responseText, responseXML){}, - onFailure: function(xhr){}, - onException: function(headerName, value){}, - onTimeout: function(){}, - user: '', - password: '',*/ - url: '', - data: '', - headers: { - 'X-Requested-With': 'XMLHttpRequest', - 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' - }, - async: true, - format: false, - method: 'post', - link: 'ignore', - isSuccess: null, - emulation: true, - urlEncoded: true, - encoding: 'utf-8', - evalScripts: false, - evalResponse: false, - timeout: 0, - noCache: false - }, - - initialize: function(options){ - this.xhr = new Browser.Request(); - this.setOptions(options); - this.headers = this.options.headers; - }, - - onStateChange: function(){ - var xhr = this.xhr; - if (xhr.readyState != 4 || !this.running) return; - this.running = false; - this.status = 0; - Function.attempt(function(){ - var status = xhr.status; - this.status = (status == 1223) ? 204 : status; - }.bind(this)); - xhr.onreadystatechange = empty; - if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; - clearTimeout(this.timer); - - this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML}; - if (this.options.isSuccess.call(this, this.status)) - this.success(this.response.text, this.response.xml); - else - this.failure(); - }, - - isSuccess: function(){ - var status = this.status; - return (status >= 200 && status < 300); - }, - - isRunning: function(){ - return !!this.running; - }, - - processScripts: function(text){ - if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text); - return text.stripScripts(this.options.evalScripts); - }, - - success: function(text, xml){ - this.onSuccess(this.processScripts(text), xml); - }, - - onSuccess: function(){ - this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); - }, - - failure: function(){ - this.onFailure(); - }, - - onFailure: function(){ - this.fireEvent('complete').fireEvent('failure', this.xhr); - }, - - loadstart: function(event){ - this.fireEvent('loadstart', [event, this.xhr]); - }, - - progress: function(event){ - this.fireEvent('progress', [event, this.xhr]); - }, - - timeout: function(){ - this.fireEvent('timeout', this.xhr); - }, - - setHeader: function(name, value){ - this.headers[name] = value; - return this; - }, - - getHeader: function(name){ - return Function.attempt(function(){ - return this.xhr.getResponseHeader(name); - }.bind(this)); - }, - - check: function(){ - if (!this.running) return true; - switch (this.options.link){ - case 'cancel': this.cancel(); return true; - case 'chain': this.chain(this.caller.pass(arguments, this)); return false; - } - return false; - }, - - send: function(options){ - if (!this.check(options)) return this; - - this.options.isSuccess = this.options.isSuccess || this.isSuccess; - this.running = true; - - var type = typeOf(options); - if (type == 'string' || type == 'element') options = {data: options}; - - var old = this.options; - options = Object.append({data: old.data, url: old.url, method: old.method}, options); - var data = options.data, url = String(options.url), method = options.method.toLowerCase(); - - switch (typeOf(data)){ - case 'element': data = document.id(data).toQueryString(); break; - case 'object': case 'hash': data = Object.toQueryString(data); - } - - if (this.options.format){ - var format = 'format=' + this.options.format; - data = (data) ? format + '&' + data : format; - } - - if (this.options.emulation && !['get', 'post'].contains(method)){ - var _method = '_method=' + method; - data = (data) ? _method + '&' + data : _method; - method = 'post'; - } - - if (this.options.urlEncoded && ['post', 'put'].contains(method)){ - var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; - this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding; - } - - if (!url) url = document.location.pathname; - - var trimPosition = url.lastIndexOf('/'); - if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition); - - if (this.options.noCache) - url += (url.indexOf('?') > -1 ? '&' : '?') + String.uniqueID(); - - if (data && (method == 'get' || method == 'delete')){ - url += (url.indexOf('?') > -1 ? '&' : '?') + data; - data = null; - } - - var xhr = this.xhr; - if (progressSupport){ - xhr.onloadstart = this.loadstart.bind(this); - xhr.onprogress = this.progress.bind(this); - } - - xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password); - if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true; - - xhr.onreadystatechange = this.onStateChange.bind(this); - - Object.each(this.headers, function(value, key){ - try { - xhr.setRequestHeader(key, value); - } catch (e){ - this.fireEvent('exception', [key, value]); - } - }, this); - - this.fireEvent('request'); - xhr.send(data); - if (!this.options.async) this.onStateChange(); - else if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this); - return this; - }, - - cancel: function(){ - if (!this.running) return this; - this.running = false; - var xhr = this.xhr; - xhr.abort(); - clearTimeout(this.timer); - xhr.onreadystatechange = empty; - if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; - this.xhr = new Browser.Request(); - this.fireEvent('cancel'); - return this; - } - -}); - -var methods = {}; -['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ - methods[method] = function(data){ - var object = { - method: method - }; - if (data != null) object.data = data; - return this.send(object); - }; -}); - -Request.implement(methods); - -Element.Properties.send = { - - set: function(options){ - var send = this.get('send').cancel(); - send.setOptions(options); - return this; - }, - - get: function(){ - var send = this.retrieve('send'); - if (!send){ - send = new Request({ - data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') - }); - this.store('send', send); - } - return send; - } - -}; - -Element.implement({ - - send: function(url){ - var sender = this.get('send'); - sender.send({data: this, url: url || sender.options.url}); - return this; - } - -}); - -})(); - - -/* ---- - -name: Request.HTML - -description: Extends the basic Request Class with additional methods for interacting with HTML responses. - -license: MIT-style license. - -requires: [Element, Request] - -provides: Request.HTML - -... -*/ - -Request.HTML = new Class({ - - Extends: Request, - - options: { - update: false, - append: false, - evalScripts: true, - filter: false, - headers: { - Accept: 'text/html, application/xml, text/xml, */*' - } - }, - - success: function(text){ - var options = this.options, response = this.response; - - response.html = text.stripScripts(function(script){ - response.javascript = script; - }); - - var match = response.html.match(/]*>([\s\S]*?)<\/body>/i); - if (match) response.html = match[1]; - var temp = new Element('div').set('html', response.html); - - response.tree = temp.childNodes; - response.elements = temp.getElements(options.filter || '*'); - - if (options.filter) response.tree = response.elements; - if (options.update){ - var update = document.id(options.update).empty(); - if (options.filter) update.adopt(response.elements); - else update.set('html', response.html); - } else if (options.append){ - var append = document.id(options.append); - if (options.filter) response.elements.reverse().inject(append); - else append.adopt(temp.getChildren()); - } - if (options.evalScripts) Browser.exec(response.javascript); - - this.onSuccess(response.tree, response.elements, response.html, response.javascript); - } - -}); - -Element.Properties.load = { - - set: function(options){ - var load = this.get('load').cancel(); - load.setOptions(options); - return this; - }, - - get: function(){ - var load = this.retrieve('load'); - if (!load){ - load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'}); - this.store('load', load); - } - return load; - } - -}; - -Element.implement({ - - load: function(){ - this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString})); - return this; - } - -}); - - -/* ---- - -name: JSON - -description: JSON encoder and decoder. - -license: MIT-style license. - -SeeAlso: - -requires: [Array, String, Number, Function] - -provides: JSON - -... -*/ - -if (typeof JSON == 'undefined') this.JSON = {}; - - - -(function(){ - -var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}; - -var escape = function(chr){ - return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4); -}; - -JSON.validate = function(string){ - string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). - replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). - replace(/(?:^|:|,)(?:\s*\[)+/g, ''); - - return (/^[\],:{}\s]*$/).test(string); -}; - -JSON.encode = JSON.stringify ? function(obj){ - return JSON.stringify(obj); -} : function(obj){ - if (obj && obj.toJSON) obj = obj.toJSON(); - - switch (typeOf(obj)){ - case 'string': - return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"'; - case 'array': - return '[' + obj.map(JSON.encode).clean() + ']'; - case 'object': case 'hash': - var string = []; - Object.each(obj, function(value, key){ - var json = JSON.encode(value); - if (json) string.push(JSON.encode(key) + ':' + json); - }); - return '{' + string + '}'; - case 'number': case 'boolean': return '' + obj; - case 'null': return 'null'; - } - - return null; -}; - -JSON.secure = true; - - -JSON.decode = function(string, secure){ - if (!string || typeOf(string) != 'string') return null; - - if (secure == null) secure = JSON.secure; - if (secure){ - if (JSON.parse) return JSON.parse(string); - if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.'); - } - - return eval('(' + string + ')'); -}; - -})(); - - -/* ---- - -name: Request.JSON - -description: Extends the basic Request Class with additional methods for sending and receiving JSON data. - -license: MIT-style license. - -requires: [Request, JSON] - -provides: Request.JSON - -... -*/ - -Request.JSON = new Class({ - - Extends: Request, - - options: { - /*onError: function(text, error){},*/ - secure: true - }, - - initialize: function(options){ - this.parent(options); - Object.append(this.headers, { - 'Accept': 'application/json', - 'X-Request': 'JSON' - }); - }, - - success: function(text){ - var json; - try { - json = this.response.json = JSON.decode(text, this.options.secure); - } catch (error){ - this.fireEvent('error', [text, error]); - return; - } - if (json == null) this.onFailure(); - else this.onSuccess(json, text); - } - -}); - - -/* ---- - -name: Cookie - -description: Class for creating, reading, and deleting browser Cookies. - -license: MIT-style license. - -credits: - - Based on the functions by Peter-Paul Koch (http://quirksmode.org). - -requires: [Options, Browser] - -provides: Cookie - -... -*/ - -var Cookie = new Class({ - - Implements: Options, - - options: { - path: '/', - domain: false, - duration: false, - secure: false, - document: document, - encode: true - }, - - initialize: function(key, options){ - this.key = key; - this.setOptions(options); - }, - - write: function(value){ - if (this.options.encode) value = encodeURIComponent(value); - if (this.options.domain) value += '; domain=' + this.options.domain; - if (this.options.path) value += '; path=' + this.options.path; - if (this.options.duration){ - var date = new Date(); - date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); - value += '; expires=' + date.toGMTString(); - } - if (this.options.secure) value += '; secure'; - this.options.document.cookie = this.key + '=' + value; - return this; - }, - - read: function(){ - var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); - return (value) ? decodeURIComponent(value[1]) : null; - }, - - dispose: function(){ - new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write(''); - return this; - } - -}); - -Cookie.write = function(key, value, options){ - return new Cookie(key, options).write(value); -}; - -Cookie.read = function(key){ - return new Cookie(key).read(); -}; - -Cookie.dispose = function(key, options){ - return new Cookie(key, options).dispose(); -}; - - -/* ---- - -name: DOMReady - -description: Contains the custom event domready. - -license: MIT-style license. - -requires: [Browser, Element, Element.Event] - -provides: [DOMReady, DomReady] - -... -*/ - -(function(window, document){ - -var ready, - loaded, - checks = [], - shouldPoll, - timer, - testElement = document.createElement('div'); - -var domready = function(){ - clearTimeout(timer); - if (ready) return; - Browser.loaded = ready = true; - document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check); - - document.fireEvent('domready'); - window.fireEvent('domready'); -}; - -var check = function(){ - for (var i = checks.length; i--;) if (checks[i]()){ - domready(); - return true; - } - return false; -}; - -var poll = function(){ - clearTimeout(timer); - if (!check()) timer = setTimeout(poll, 10); -}; - -document.addListener('DOMContentLoaded', domready); - -/**/ -// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/ -// testElement.doScroll() throws when the DOM is not ready, only in the top window -var doScrollWorks = function(){ - try { - testElement.doScroll(); - return true; - } catch (e){} - return false; -}; -// If doScroll works already, it can't be used to determine domready -// e.g. in an iframe -if (testElement.doScroll && !doScrollWorks()){ - checks.push(doScrollWorks); - shouldPoll = true; -} -/**/ - -if (document.readyState) checks.push(function(){ - var state = document.readyState; - return (state == 'loaded' || state == 'complete'); -}); - -if ('onreadystatechange' in document) document.addListener('readystatechange', check); -else shouldPoll = true; - -if (shouldPoll) poll(); - -Element.Events.domready = { - onAdd: function(fn){ - if (ready) fn.call(this); - } -}; - -// Make sure that domready fires before load -Element.Events.load = { - base: 'load', - onAdd: function(fn){ - if (loaded && this == window) fn.call(this); - }, - condition: function(){ - if (this == window){ - domready(); - delete Element.Events.load; - } - return true; - } -}; - -// This is based on the custom load event -window.addEvent('load', function(){ - loaded = true; -}); - -})(window, document); - diff --git a/module/webui/themes/flat/js/static/mootools-core.min.js b/module/webui/themes/flat/js/static/mootools-core.min.js deleted file mode 100644 index 354f94196..000000000 --- a/module/webui/themes/flat/js/static/mootools-core.min.js +++ /dev/null @@ -1,491 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/core/8423c12ffd6a6bfcde9ea22554aec795 - -packager build: - - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady - -copyrights: - - [MooTools](http://mootools.net) - -licenses: - - [MIT License](http://mootools.net/license.txt) -... -*/ - -(function(){this.MooTools={version:"1.5.0",build:"0f7b690afee9349b15909f33016a25d2e4d9f4e3"};var o=this.typeOf=function(i){if(i==null){return"null";}if(i.$family!=null){return i.$family(); -}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if("callee" in i){return"arguments"; -}if("item" in i){return"collection";}}}return typeof i;};var j=this.instanceOf=function(t,i){if(t==null){return false;}var s=t.$constructor||t.constructor; -while(s){if(s===i){return true;}s=s.parent;}if(!t.hasOwnProperty){return false;}return t instanceof i;};var f=this.Function;var p=true;for(var k in {toString:1}){p=null; -}if(p){p=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];}f.prototype.overloadSetter=function(s){var i=this; -return function(u,t){if(u==null){return this;}if(s||typeof u!="string"){for(var v in u){i.call(this,v,u[v]);}if(p){for(var w=p.length;w--;){v=p[w];if(u.hasOwnProperty(v)){i.call(this,v,u[v]); -}}}}else{i.call(this,u,t);}return this;};};f.prototype.overloadGetter=function(s){var i=this;return function(u){var v,t;if(typeof u!="string"){v=u;}else{if(arguments.length>1){v=arguments; -}else{if(s){v=[u];}}}if(v){t={};for(var w=0;w>>0; -b>>0;b>>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a>>0,b=Array(d);for(var a=0;a>>0; -b-1;},test:function(a,b){return((typeOf(a)=="regexp")?a:new RegExp(""+a,b)).test(this); -},trim:function(){return String(this).replace(/^\s+|\s+$/g,"");},clean:function(){return String(this).replace(/\s+/g," ").trim();},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase(); -});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase(); -});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this); -},hexToRgb:function(b){var a=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g); -return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1); -}return(a[c]!=null)?a[c]:"";});}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0); -return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype; -g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this; -if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b); -},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={}; -for(var e=0,b=g.length;e]*>([\s\S]*?)<\/script>/gi,function(m,n){e+=n+"\n";return""; -});if(k===true){j.exec(e);}else{if(typeOf(k)=="function"){k(e,l);}}return l;});j.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event}); -this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,k){d[e]=k;});this.Document=f.$constructor=new Type("Document",function(){}); -f.$family=Function.from("document").hide();Document.mirror(function(e,k){f[e]=k;});f.html=f.documentElement;if(!f.head){f.head=f.getElementsByTagName("head")[0]; -}if(f.execCommand){try{f.execCommand("BackgroundImageCache",false,true);}catch(c){}}if(this.attachEvent&&!this.addEventListener){var b=function(){this.detachEvent("onunload",b); -f.head=f.html=f.window=null;};this.attachEvent("onunload",b);}var g=Array.from;try{g(f.html.childNodes);}catch(c){Array.from=function(k){if(typeof k!="string"&&Type.isEnumerable(k)&&typeOf(k)!="array"){var e=k.length,l=new Array(e); -while(e--){l[e]=k[e];}return l;}return g(k);};var h=Array.prototype,i=h.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var k=h[e]; -Array[e]=function(l){return k.apply(Array.from(l),i.call(arguments,1));};});}})();(function(){var b={};var a=this.DOMEvent=new Type("DOMEvent",function(c,g){if(!g){g=window; -}c=c||g.event;if(c.$extended){return c;}this.event=c;this.$extended=true;this.shift=c.shiftKey;this.control=c.ctrlKey;this.alt=c.altKey;this.meta=c.metaKey; -var i=this.type=c.type;var h=c.target||c.srcElement;while(h&&h.nodeType==3){h=h.parentNode;}this.target=document.id(h);if(i.indexOf("key")==0){var d=this.code=(c.which||c.keyCode); -this.key=b[d];if(i=="keydown"||i=="keyup"){if(d>111&&d<124){this.key="f"+(d-111);}else{if(d>95&&d<106){this.key=d-96;}}}if(this.key==null){this.key=String.fromCharCode(d).toLowerCase(); -}}else{if(i=="click"||i=="dblclick"||i=="contextmenu"||i=="DOMMouseScroll"||i.indexOf("mouse")==0){var j=g.document;j=(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body; -this.page={x:(c.pageX!=null)?c.pageX:c.clientX+j.scrollLeft,y:(c.pageY!=null)?c.pageY:c.clientY+j.scrollTop};this.client={x:(c.pageX!=null)?c.pageX-g.pageXOffset:c.clientX,y:(c.pageY!=null)?c.pageY-g.pageYOffset:c.clientY}; -if(i=="DOMMouseScroll"||i=="mousewheel"){this.wheel=(c.wheelDelta)?c.wheelDelta/120:-(c.detail||0)/3;}this.rightClick=(c.which==3||c.button==2);if(i=="mouseover"||i=="mouseout"){var k=c.relatedTarget||c[(i=="mouseover"?"from":"to")+"Element"]; -while(k&&k.nodeType==3){k=k.parentNode;}this.relatedTarget=document.id(k);}}else{if(i.indexOf("touch")==0||i.indexOf("gesture")==0){this.rotation=c.rotation; -this.scale=c.scale;this.targetTouches=c.targetTouches;this.changedTouches=c.changedTouches;var f=this.touches=c.touches;if(f&&f[0]){var e=f[0];this.page={x:e.pageX,y:e.pageY}; -this.client={x:e.clientX,y:e.clientY};}}}}if(!this.client){this.client={};}if(!this.page){this.page={};}});a.implement({stop:function(){return this.preventDefault().stopPropagation(); -},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); -}else{this.event.returnValue=false;}return this;}});a.defineKey=function(d,c){b[d]=c;return this;};a.defineKeys=a.defineKey.overloadSetter(true);a.defineKeys({"38":"up","40":"down","37":"left","39":"right","27":"esc","32":"space","8":"backspace","9":"tab","46":"delete","13":"enter"}); -})();(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h};}var g=function(){e(this);if(g.$prototyping){return this; -}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;return i;}.extend(this).implement(h); -g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.'); -}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments); -};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone(); -break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.'); -}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h}); -return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this; -}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping; -return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j; -for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments)); -return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty(); -return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d); -this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; -},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c); -}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this; -},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue; -}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments)); -if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})(); -(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p; -var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length; -return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o; -}}}};var h=function(u){var r=u.expressions;for(var p=0;p+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(//,"["+f(">+~`!@$%^&={}\\;/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(//g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")); -function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n]; -if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,""); -}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")}); -}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"}); -}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)"); -break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break; -case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I); -};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o); -};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var k={},m={},d=Object.prototype.toString; -k.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};k.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(d.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML"); -};k.setDocument=function(w){var p=w.nodeType;if(p==9){}else{if(p){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return; -}this.document=w;var A=w.documentElement,o=this.getUIDXML(A),s=m[o],r;if(s){for(r in s){this[r]=s[r];}return;}s=m[o]={};s.root=A;s.isXMLDocument=this.isXML(w); -s.brokenStarGEBTN=s.starSelectsClosedQSA=s.idGetsName=s.brokenMixedCaseQSA=s.brokenGEBCN=s.brokenCheckedQSA=s.brokenEmptyAttributeQSA=s.isHTMLDocument=s.nativeMatchesSelector=false; -var q,u,y,z,t;var x,v="slick_uniqueid";var c=w.createElement("div");var n=w.body||w.getElementsByTagName("body")[0]||A;n.appendChild(c);try{c.innerHTML=''; -s.isHTMLDocument=!!w.getElementById(v);}catch(C){}if(s.isHTMLDocument){c.style.display="none";c.appendChild(w.createComment(""));u=(c.getElementsByTagName("*").length>1); -try{c.innerHTML="foo";x=c.getElementsByTagName("*");q=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");}catch(C){}s.brokenStarGEBTN=u||q;try{c.innerHTML=''; -s.idGetsName=w.getElementById(v)===c.firstChild;}catch(C){}if(c.getElementsByClassName){try{c.innerHTML='';c.getElementsByClassName("b").length; -c.firstChild.className="b";z=(c.getElementsByClassName("b").length!=2);}catch(C){}try{c.innerHTML='';y=(c.getElementsByClassName("a").length!=2); -}catch(C){}s.brokenGEBCN=z||y;}if(c.querySelectorAll){try{c.innerHTML="foo";x=c.querySelectorAll("*");s.starSelectsClosedQSA=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/"); -}catch(C){}try{c.innerHTML='';s.brokenMixedCaseQSA=!c.querySelectorAll(".MiX").length;}catch(C){}try{c.innerHTML=''; -s.brokenCheckedQSA=(c.querySelectorAll(":checked").length==0);}catch(C){}try{c.innerHTML='';s.brokenEmptyAttributeQSA=(c.querySelectorAll('[class*=""]').length!=0); -}catch(C){}}try{c.innerHTML='
        ';t=(c.firstChild.getAttribute("action")!="s");}catch(C){}s.nativeMatchesSelector=A.matches||A.mozMatchesSelector||A.webkitMatchesSelector; -if(s.nativeMatchesSelector){try{s.nativeMatchesSelector.call(A,":slick");s.nativeMatchesSelector=null;}catch(C){}}}try{A.slick_expando=1;delete A.slick_expando; -s.getUID=this.getUIDHTML;}catch(C){s.getUID=this.getUIDXML;}n.removeChild(c);c=x=n=null;s.getAttribute=(s.isHTMLDocument&&t)?function(G,E){var H=this.attributeGetters[E]; -if(H){return H.call(G);}var F=G.getAttributeNode(E);return(F)?F.nodeValue:null;}:function(F,E){var G=this.attributeGetters[E];return(G)?G.call(F):F.getAttribute(E); -};s.hasAttribute=(A&&this.isNativeCode(A.hasAttribute))?function(F,E){return F.hasAttribute(E);}:function(F,E){F=F.getAttributeNode(E);return !!(F&&(F.specified||F.nodeValue)); -};var D=A&&this.isNativeCode(A.contains),B=w&&this.isNativeCode(w.contains);s.contains=(D&&B)?function(E,F){return E.contains(F);}:(D&&!B)?function(E,F){return E===F||((E===w)?w.documentElement:E).contains(F); -}:(A&&A.compareDocumentPosition)?function(E,F){return E===F||!!(E.compareDocumentPosition(F)&16);}:function(E,F){if(F){do{if(F===E){return true;}}while((F=F.parentNode)); -}return false;};s.documentSorter=(A.compareDocumentPosition)?function(F,E){if(!F.compareDocumentPosition||!E.compareDocumentPosition){return 0;}return F.compareDocumentPosition(E)&4?-1:F===E?0:1; -}:("sourceIndex" in A)?function(F,E){if(!F.sourceIndex||!E.sourceIndex){return 0;}return F.sourceIndex-E.sourceIndex;}:(w.createRange)?function(H,F){if(!H.ownerDocument||!F.ownerDocument){return 0; -}var G=H.ownerDocument.createRange(),E=F.ownerDocument.createRange();G.setStart(H,0);G.setEnd(H,0);E.setStart(F,0);E.setEnd(F,0);return G.compareBoundaryPoints(Range.START_TO_END,E); -}:null;A=null;for(r in s){this[r]=s[r];}};var f=/^([#.]?)((?:[\w-]+|\*))$/,h=/\[.+[*$^]=(?:""|'')?\]/,g={};k.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]); -if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U); -}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(f);simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors; -}E=U.getElementsByTagName(v);if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors; -}A=U.getElementById(v);if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A); -}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v); -if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+e.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*"); -for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p); -}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||g[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&h.test(z))||(!y&&z.indexOf(",")>-1)||e.disableQSA){break querySelector; -}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null; -}else{E=U.querySelectorAll(S);}}catch(Q){g[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0; -A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p); -}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z; -return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID; -if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator; -if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1)); -this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search; -}}else{if(s&&w){for(L=0,K=N.length;L1)){this.sort(p);}return(s)?(p[0]||null):p;};k.uidx=1;k.uidk="slick-uniqueid";k.getUIDXML=function(n){var c=n.getAttribute(this.uidk); -if(!c){c=this.uidx++;n.setAttribute(this.uidk,c);}return c;};k.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};k.sort=function(c){if(!this.documentSorter){return c; -}c.sort(this.documentSorter);return c;};k.cacheNTH={};k.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;k.parseNTHArgument=function(q){var o=q.match(this.matchNTH); -if(!o){return false;}var p=o[2]||false;var n=o[1]||1;if(n=="-"){n=-1;}var c=+o[3]||0;o=(p=="n")?{a:n,b:c}:(p=="odd")?{a:2,b:1}:(p=="even")?{a:2,b:0}:{a:0,b:n}; -return(this.cacheNTH[q]=o);};k.createNTHPseudo=function(p,n,c,o){return function(s,q){var u=this.getUID(s);if(!this[c][u]){var A=s.parentNode;if(!A){return false; -}var r=A[p],t=1;if(o){var z=s.nodeName;do{if(r.nodeName!=z){continue;}this[c][this.getUID(r)]=t++;}while((r=r[n]));}else{do{if(r.nodeType!=1){continue; -}this[c][this.getUID(r)]=t++;}while((r=r[n]));}}q=q||"n";var v=this.cacheNTH[q]||this.parseNTHArgument(q);if(!v){return false;}var y=v.a,x=v.b,w=this[c][u]; -if(y==0){return x==w;}if(y>0){if(w":function(p,c,r,o,n,q){if((p=p.firstChild)){do{if(p.nodeType==1){this.push(p,c,r,o,n,q); -}}while((p=p.nextSibling));}},"+":function(p,c,r,o,n,q){while((p=p.nextSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);break;}}},"^":function(p,c,r,o,n,q){p=p.firstChild; -if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:+"](p,c,r,o,n,q);}}},"~":function(q,c,s,p,n,r){while((q=q.nextSibling)){if(q.nodeType!=1){continue; -}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}},"++":function(p,c,r,o,n,q){this["combinator:+"](p,c,r,o,n,q); -this["combinator:!+"](p,c,r,o,n,q);},"~~":function(p,c,r,o,n,q){this["combinator:~"](p,c,r,o,n,q);this["combinator:!~"](p,c,r,o,n,q);},"!":function(p,c,r,o,n,q){while((p=p.parentNode)){if(p!==this.document){this.push(p,c,r,o,n,q); -}}},"!>":function(p,c,r,o,n,q){p=p.parentNode;if(p!==this.document){this.push(p,c,r,o,n,q);}},"!+":function(p,c,r,o,n,q){while((p=p.previousSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q); -break;}}},"!^":function(p,c,r,o,n,q){p=p.lastChild;if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:!+"](p,c,r,o,n,q);}}},"!~":function(q,c,s,p,n,r){while((q=q.previousSibling)){if(q.nodeType!=1){continue; -}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}}};for(var i in j){k["combinator:"+i]=j[i];}var l={empty:function(c){var n=c.firstChild; -return !(n&&n.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,n){return !this.matchNode(c,n);},contains:function(c,n){return(c.innerText||c.textContent||"").indexOf(n)>-1; -},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false; -}}return true;},"only-child":function(o){var n=o;while((n=n.previousSibling)){if(n.nodeType==1){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeType==1){return false; -}}return true;},"nth-child":k.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":k.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":k.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":k.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(n,c){return this["pseudo:nth-child"](n,""+(c+1)); -},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var n=c.nodeName; -while((c=c.previousSibling)){if(c.nodeName==n){return false;}}return true;},"last-of-type":function(c){var n=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==n){return false; -}}return true;},"only-of-type":function(o){var n=o,p=o.nodeName;while((n=n.previousSibling)){if(n.nodeName==p){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeName==p){return false; -}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex")); -},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var b in l){k["pseudo:"+b]=l[b];}var a=k.attributeGetters={"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for"); -},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style"); -},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;},type:function(){return this.getAttribute("type"); -},maxlength:function(){var c=this.getAttributeNode("maxLength");return(c&&c.specified)?c.nodeValue:null;}};a.MAXLENGTH=a.maxLength=a.maxlength;var e=k.Slick=(this.Slick||{}); -e.version="1.1.7";e.search=function(n,o,c){return k.search(n,o,c);};e.find=function(c,n){return k.search(c,n,null,true);};e.contains=function(c,n){k.setDocument(c); -return k.contains(c,n);};e.getAttribute=function(n,c){k.setDocument(n);return k.getAttribute(n,c);};e.hasAttribute=function(n,c){k.setDocument(n);return k.hasAttribute(n,c); -};e.match=function(n,c){if(!(n&&c)){return false;}if(!c||c===n){return true;}k.setDocument(n);return k.matchNode(n,c);};e.defineAttributeGetter=function(c,n){k.attributeGetters[c]=n; -return this;};e.lookupAttributeGetter=function(c){return k.attributeGetters[c];};e.definePseudo=function(c,n){k["pseudo:"+c]=function(p,o){return n.call(p,o); -};return this;};e.lookupPseudo=function(c){var n=k["pseudo:"+c];if(n){return function(o){return n.call(this,o);};}return null;};e.override=function(n,c){k.override(n,c); -return this;};e.isXML=k.isXML;e.uidOf=function(c){return k.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this); -var Element=this.Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={}; -}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0];b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var a,f=0,c=d.length; -f=this.length){delete this[g--]; -}return e;}.protect());}Array.forEachMethod(function(g,e){Elements.implement(e,g);});Array.mirror(Elements);var d;try{d=(document.createElement("").name=="x"); -}catch(b){}var c=function(e){return(""+e).replace(/&/g,"&").replace(/"/g,""");};Document.implement({newElement:function(e,g){if(g&&g.checked!=null){g.defaultChecked=g.checked; -}if(d&&g){e="<"+e;if(g.name){e+=' name="'+c(g.name)+'"';}if(g.type){e+=' type="'+c(g.type)+'"';}e+=">";delete g.name;delete g.type;}return this.id(this.createElement(e)).set(g); -}});})();(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(e){return this.createTextNode(e);},getDocument:function(){return this; -},getWindow:function(){return this.window;},id:(function(){var e={string:function(L,K,l){L=Slick.find(l,"#"+L.replace(/(\W)/g,"\\$1"));return(L)?e.element(L,K):null; -},element:function(K,L){Slick.uidOf(K);if(!L&&!K.$family&&!(/^(?:object|embed)$/i).test(K.tagName)){var l=K.fireEvent;K._fireEvent=function(M,N){return l(M,N); -};Object.append(K,Element.Prototype);}return K;},object:function(K,L,l){if(K.toElement){return e.element(K.toElement(l),L);}return null;}};e.textnode=e.whitespace=e.window=e.document=function(l){return l; -};return function(K,M,L){if(K&&K.$family&&K.uniqueNumber){return K;}var l=typeOf(K);return(e[l])?e[l](K,M,L||document):null;};})()});if(window.$==null){Window.implement("$",function(e,l){return document.id(e,l,this.document); -});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(e){return Slick.search(this,e,new Elements); -},getElement:function(e){return document.id(Slick.find(this,e));}});var p={contains:function(e){return Slick.contains(this,e);}};if(!document.contains){Document.implement(p); -}if(!document.createElement("div").contains){Element.implement(p);}var v=function(L,K){if(!L){return K;}L=Object.clone(Slick.parse(L));var l=L.expressions; -for(var e=l.length;e--;){l[e][0].combinator=K;}return L;};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(e,l){Element.implement(l,function(K){return this.getElement(v(K,e)); -});});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(e,l){Element.implement(l,function(K){return this.getElements(v(K,e)); -});});Element.implement({getFirst:function(e){return document.id(Slick.search(this,v(e,">"))[0]);},getLast:function(e){return document.id(Slick.search(this,v(e,">")).getLast()); -},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(e){return document.id(Slick.find(this,"#"+(""+e).replace(/(\W)/g,"\\$1"))); -},match:function(e){return !e||Slick.match(this,e);}});if(window.$$==null){Window.implement("$$",function(e){if(arguments.length==1){if(typeof e=="string"){return Slick.search(this.document,e,new Elements); -}else{if(Type.isEnumerable(e)){return new Elements(e);}}}return new Elements(arguments);});}var A={before:function(l,e){var K=e.parentNode;if(K){K.insertBefore(l,e); -}},after:function(l,e){var K=e.parentNode;if(K){K.insertBefore(l,e.nextSibling);}},bottom:function(l,e){e.appendChild(l);},top:function(l,e){e.insertBefore(l,e.firstChild); -}};A.inside=A.bottom;var n={},d={};var o={};Array.forEach(["type","value","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","rowSpan","tabIndex","useMap"],function(e){o[e.toLowerCase()]=e; -});o.html="innerHTML";o.text=(document.createElement("div").textContent==null)?"innerText":"textContent";Object.forEach(o,function(l,e){d[e]=function(K,L){K[l]=L; -};n[e]=function(K){return K[l];};});var B=["compact","nowrap","ismap","declare","noshade","checked","disabled","readOnly","multiple","selected","noresize","defer","defaultChecked","autofocus","controls","autoplay","loop"]; -var k={};Array.forEach(B,function(e){var l=e.toLowerCase();k[l]=e;d[l]=function(K,L){K[e]=!!L;};n[l]=function(K){return !!K[e];};});Object.append(d,{"class":function(e,l){("className" in e)?e.className=(l||""):e.setAttribute("class",l); -},"for":function(e,l){("htmlFor" in e)?e.htmlFor=l:e.setAttribute("for",l);},style:function(e,l){(e.style)?e.style.cssText=l:e.setAttribute("style",l); -},value:function(e,l){e.value=(l!=null)?l:"";}});n["class"]=function(e){return("className" in e)?e.className||null:e.getAttribute("class");};var f=document.createElement("button"); -try{f.type="button";}catch(E){}if(f.type!="button"){d.type=function(e,l){e.setAttribute("type",l);};}f=null;var s=document.createElement("input");s.value="t"; -s.type="submit";if(s.value!="t"){d.type=function(l,e){var K=l.value;l.type=e;l.value=K;};}s=null;var u=(function(e){e.random="attribute";return(e.getAttribute("random")=="attribute"); -})(document.createElement("div"));var i=(function(e){e.innerHTML='';return e.cloneNode(true).firstChild.childNodes.length!=1; -})(document.createElement("div"));var j=!!document.createElement("div").classList;var F=function(e){var l=(e||"").clean().split(" "),K={};return l.filter(function(L){if(L!==""&&!K[L]){return K[L]=L; -}});};var t=function(e){this.classList.add(e);};var g=function(e){this.classList.remove(e);};Element.implement({setProperty:function(l,K){var L=d[l.toLowerCase()]; -if(L){L(this,K);}else{var e;if(u){e=this.retrieve("$attributeWhiteList",{});}if(K==null){this.removeAttribute(l);if(u){delete e[l];}}else{this.setAttribute(l,""+K); -if(u){e[l]=true;}}}return this;},setProperties:function(e){for(var l in e){this.setProperty(l,e[l]);}return this;},getProperty:function(M){var K=n[M.toLowerCase()]; -if(K){return K(this);}if(u){var l=this.getAttributeNode(M),L=this.retrieve("$attributeWhiteList",{});if(!l){return null;}if(l.expando&&!L[M]){var N=this.outerHTML; -if(N.substr(0,N.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(M)<0){return null;}L[M]=true;}}var e=Slick.getAttribute(this,M);return(!e&&!Slick.hasAttribute(this,M))?null:e; -},getProperties:function(){var e=Array.from(arguments);return e.map(this.getProperty,this).associate(e);},removeProperty:function(e){return this.setProperty(e,null); -},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;},set:function(K,l){var e=Element.Properties[K];(e&&e.set)?e.set.call(this,l):this.setProperty(K,l); -}.overloadSetter(),get:function(l){var e=Element.Properties[l];return(e&&e.get)?e.get.apply(this):this.getProperty(l);}.overloadGetter(),erase:function(l){var e=Element.Properties[l]; -(e&&e.erase)?e.erase.apply(this):this.removeProperty(l);return this;},hasClass:j?function(e){return this.classList.contains(e);}:function(e){return this.className.clean().contains(e," "); -},addClass:j?function(e){F(e).forEach(t,this);return this;}:function(e){this.className=F(e+" "+this.className).join(" ");return this;},removeClass:j?function(e){F(e).forEach(g,this); -return this;}:function(e){var l=F(this.className);F(e).forEach(l.erase,l);this.className=l.join(" ");return this;},toggleClass:function(e,l){if(l==null){l=!this.hasClass(e); -}return(l)?this.addClass(e):this.removeClass(e);},adopt:function(){var L=this,e,N=Array.flatten(arguments),M=N.length;if(M>1){L=e=document.createDocumentFragment(); -}for(var K=0;K1){L=document.createDocumentFragment(); -for(var N=0,e=O.length;N";a=(x.childNodes.length==1);if(!a){var w="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),b=document.createDocumentFragment(),y=w.length; -while(y--){b.createElement(w[y]);}}x=null;h=Function.attempt(function(){var e=document.createElement("table");e.innerHTML="";return true; -});var c=document.createElement("tr"),r="";c.innerHTML=r;C=(c.innerHTML==r);c=null;if(!h||!C||!a){Element.Properties.html.set=(function(l){var e={table:[1,"","
        "],select:[1,""],tbody:[2,"","
        "],tr:[3,"","
        "]}; -e.thead=e.tfoot=e.tbody;return function(K){var L=e[this.get("tag")];if(!L&&!a){L=[0,"",""];}if(!L){return l.call(this,K);}var O=L[0],N=document.createElement("div"),M=N; -if(!a){b.appendChild(N);}N.innerHTML=[L[1],K,L[2]].flatten().join("");while(O--){M=M.firstChild;}this.empty().adopt(M.childNodes);if(!a){b.removeChild(N); -}N=null;};})(Element.Properties.html.set);}var q=document.createElement("form");q.innerHTML="";if(q.firstChild.value!="s"){Element.Properties.value={set:function(N){var l=this.get("tag"); -if(l!="select"){return this.setProperty("value",N);}var K=this.getElements("option");N=String(N);for(var L=0;L0||r==null?"visible":"hidden";};var p=function(r,v,u){var t=r.style,s=t.filter||r.getComputedStyle("filter")||"";t.filter=(v.test(s)?s.replace(v,u):s+" "+u).trim(); -if(!t.filter){t.removeAttribute("filter");}};var h=(j?function(s,r){s.style.opacity=r;}:(g?function(s,r){if(!s.currentStyle||!s.currentStyle.hasLayout){s.style.zoom=1; -}if(r==null||r==1){p(s,q,"");if(r==1&&i(s)!=1){p(s,q,"alpha(opacity=100)");}}else{p(s,q,"alpha(opacity="+(r*100).limit(0,100).round()+")");}}:b));var i=(j?function(s){var r=s.style.opacity||s.getComputedStyle("opacity"); -return(r=="")?1:r.toFloat();}:(g?function(s){var t=(s.style.filter||s.getComputedStyle("filter")),r;if(t){r=t.match(q);}return(r==null||t==null)?1:(r[1]/100); -}:function(s){var r=s.retrieve("$opacity");if(r==null){r=(s.style.visibility=="hidden"?0:1);}return r;}));var d=(l.style.cssFloat==null)?"styleFloat":"cssFloat",a={left:"0%",top:"0%",center:"50%",right:"100%",bottom:"100%"},c=(l.style.backgroundPositionX!=null); -var m=function(r,s){if(s=="backgroundPosition"){r.removeAttribute(s+"X");s+="Y";}r.removeAttribute(s);};Element.implement({getComputedStyle:function(t){if(!n&&this.currentStyle){return this.currentStyle[t.camelCase()]; -}var s=Element.getDocument(this).defaultView,r=s?s.getComputedStyle(this,null):null;return(r)?r.getPropertyValue((t==d)?"float":t.hyphenate()):"";},setStyle:function(s,r){if(s=="opacity"){if(r!=null){r=parseFloat(r); -}h(this,r);return this;}s=(s=="float"?d:s).camelCase();if(typeOf(r)!="string"){var t=(Element.Styles[s]||"@").split(" ");r=Array.from(r).map(function(v,u){if(!t[u]){return""; -}return(typeOf(v)=="number")?t[u].replace("@",Math.round(v)):v;}).join(" ");}else{if(r==String(Number(r))){r=Math.round(r);}}this.style[s]=r;if((r==""||r==null)&&e&&this.style.removeAttribute){m(this.style,s); -}return this;},getStyle:function(x){if(x=="opacity"){return i(this);}x=(x=="float"?d:x).camelCase();var r=this.style[x];if(!r||x=="zIndex"){if(Element.ShortStyles.hasOwnProperty(x)){r=[]; -for(var w in Element.ShortStyles[x]){r.push(this.getStyle(w));}return r.join(" ");}r=this.getComputedStyle(x);}if(c&&/^backgroundPosition[XY]?$/.test(x)){return r.replace(/(top|right|bottom|left)/g,function(s){return a[s]; -})||"0px";}if(!r&&x=="backgroundPosition"){return"0px 0px";}if(r){r=String(r);var u=r.match(/rgba?\([\d\s,]+\)/);if(u){r=r.replace(u[0],u[0].rgbToHex()); -}}if(!n&&!this.style[x]){if((/^(height|width)$/).test(x)&&!(/px$/.test(r))){var t=(x=="width")?["left","right"]:["top","bottom"],v=0;t.each(function(s){v+=this.getStyle("border-"+s+"-width").toInt()+this.getStyle("padding-"+s).toInt(); -},this);return this["offset"+x.capitalize()]-v+"px";}if((/^border(.+)Width|margin|padding/).test(x)&&isNaN(parseFloat(r))){return"0px";}}if(o&&/^border(Top|Right|Bottom|Left)?$/.test(x)&&/^#/.test(r)){return r.replace(/^(.+)\s(.+)\s(.+)$/,"$2 $3 $1"); -}return r;},setStyles:function(s){for(var r in s){this.setStyle(r,s[r]);}return this;},getStyles:function(){var r={};Array.flatten(arguments).each(function(s){r[s]=this.getStyle(s); -},this);return r;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundSize:"@px",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}; -Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(x){var w=Element.ShortStyles; -var s=Element.Styles;["margin","padding"].each(function(y){var z=y+x;w[y][z]=s[z]="@px";});var v="border"+x;w.border[v]=s[v]="@px @ rgb(@, @, @)";var u=v+"Width",r=v+"Style",t=v+"Color"; -w[v]={};w.borderWidth[u]=w[v][u]=s[u]="@px";w.borderStyle[r]=w[v][r]=s[r]="@";w.borderColor[t]=w[v][t]=s[t]="rgb(@, @, @)";});if(c){Element.ShortStyles.backgroundPosition={backgroundPositionX:"@",backgroundPositionY:"@"}; -}})();(function(){Element.Properties.events={set:function(b){this.addEvents(b);}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{}); -if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h,f); -}if(b.condition){d=function(k){if(b.condition.call(this,k,f)){return h.call(this,k);}return true;};}if(b.base){g=Function.from(b.base).call(this,f);}}var e=function(){return h.call(j); -};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new DOMEvent(k,j.getWindow());if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]); -}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events");if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d); -if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];if(f){if(f.onRemove){f.onRemove.call(this,d,e);}if(f.base){e=Function.from(f.base).call(this,e); -}}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; -},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);}return this;}var c=this.retrieve("events");if(!c){return this; -}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);},this);delete c[b]; -}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c); -}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b); -}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,hashchange:1,popstate:2,error:1,abort:1,scroll:1}; -Element.Events={mousewheel:{base:"onwheel" in document?"wheel":"onmousewheel" in document?"mousewheel":"DOMMouseScroll"}};var a=function(b){var c=b.relatedTarget; -if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c));};if("onmouseenter" in document.documentElement){Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2; -Element.MouseenterCheck=a;}else{Element.Events.mouseenter={base:"mouseover",condition:a};Element.Events.mouseleave={base:"mouseout",condition:a};}if(!window.addEventListener){Element.NativeEvents.propertychange=2; -Element.Events.change={base:function(){var b=this.type;return(this.get("tag")=="input"&&(b=="radio"||b=="checkbox"))?"propertychange":"change";},condition:function(b){return b.type!="propertychange"||b.event.propertyName=="checked"; -}};}})();(function(){var c=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2;var k=function(l,m,n,o,p){while(p&&p!=l){if(m(p,o)){return n.call(p,o,p); -}p=document.id(p.parentNode);}};var a={mouseenter:{base:"mouseover",condition:Element.MouseenterCheck},mouseleave:{base:"mouseout",condition:Element.MouseenterCheck},focus:{base:"focus"+(c?"":"in"),capture:true},blur:{base:c?"blur":"focusout",capture:true}}; -var b="$delegation:";var i=function(l){return{base:"focusin",remove:function(m,o){var p=m.retrieve(b+l+"listeners",{})[o];if(p&&p.forms){for(var n=p.forms.length; -n--;){p.forms[n].removeEvent(l,p.fns[n]);}}},listen:function(x,r,v,n,t,s){var o=(t.get("tag")=="form")?t:n.target.getParent("form");if(!o){return;}var u=x.retrieve(b+l+"listeners",{}),p=u[s]||{forms:[],fns:[]},m=p.forms,w=p.fns; -if(m.indexOf(o)!=-1){return;}m.push(o);var q=function(y){k(x,r,v,y,t);};o.addEvent(l,q);w.push(q);u[s]=p;x.store(b+l+"listeners",u);}};};var d=function(l){return{base:"focusin",listen:function(m,n,p,q,r){var o={blur:function(){this.removeEvents(o); -}};o[l]=function(s){k(m,n,p,s,r);};q.target.addEvents(o);}};};if(!c){Object.append(a,{submit:i("submit"),reset:i("reset"),change:d("change"),select:d("select")}); -}var h=Element.prototype,f=h.addEvent,j=h.removeEvent;var e=function(l,m){return function(r,q,n){if(r.indexOf(":relay")==-1){return l.call(this,r,q,n); -}var o=Slick.parse(r).expressions[0][0];if(o.pseudos[0].key!="relay"){return l.call(this,r,q,n);}var p=o.tag;o.pseudos.slice(1).each(function(s){p+=":"+s.key+(s.value?"("+s.value+")":""); -});l.call(this,r,q);return m.call(this,p,o.pseudos[0].value,q);};};var g={addEvent:function(v,q,x){var t=this.retrieve("$delegates",{}),r=t[v];if(r){for(var y in r){if(r[y].fn==x&&r[y].match==q){return this; -}}}var p=v,u=q,o=x,n=a[v]||{};v=n.base||p;q=function(B){return Slick.match(B,u);};var w=Element.Events[p];if(n.condition||w&&w.condition){var l=q,m=n.condition||w.condition; -q=function(C,B){return l(C,B)&&m.call(C,B,v);};}var z=this,s=String.uniqueID();var A=n.listen?function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){n.listen(z,q,x,B,C,s); -}}:function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){k(z,q,x,B,C);}};if(!r){r={};}r[s]={match:u,fn:o,delegator:A};t[p]=r;return f.call(this,v,A,n.capture); -},removeEvent:function(r,n,t,u){var q=this.retrieve("$delegates",{}),p=q[r];if(!p){return this;}if(u){var m=r,w=p[u].delegator,l=a[r]||{};r=l.base||m;if(l.remove){l.remove(this,u); -}delete p[u];q[m]=p;return j.call(this,r,w,l.capture);}var o,v;if(t){for(o in p){v=p[o];if(v.match==n&&v.fn==t){return g.removeEvent.call(this,r,n,t,o); -}}}else{for(o in p){v=p[o];if(v.match==n){g.removeEvent.call(this,r,n,v.fn,o);}}}return this;}};[Element,Window,Document].invoke("implement",{addEvent:e(f,g.addEvent),removeEvent:e(j,g.removeEvent)}); -})();(function(){var h=document.createElement("div"),e=document.createElement("div");h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null; -var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName);};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n); -}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight}; -},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(a(this)){return this.getWindow().getScroll(); -}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0};while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop; -n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}var n=(k(m,"position")=="static")?i:l; -while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}try{return m.offsetParent; -}catch(n){}return null;},getOffsets:function(){var n=this.getBoundingClientRect;if(n){var r=this.getBoundingClientRect(),p=document.id(this.getDocument().documentElement),q=p.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed"); -return{x:r.left.toInt()+t.x+((s)?0:q.x)-p.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-p.clientTop};}var o=this,m={x:0,y:0};if(a(this)){return m;}while(o&&!a(o)){m.x+=o.offsetLeft; -m.y+=o.offsetTop;o=o.offsetParent;}return m;},getPosition:function(p){var q=this.getOffsets(),n=this.getScrolls();var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition(); -return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates();}var m=this.getPosition(o),n=this.getSize(); -var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")}; -},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight}; -},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body; -return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize(); -return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box"; -}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName); -}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y; -},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x; -},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y; -},getLeft:function(){return this.getPosition().x;}});(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this; -this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval; -this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame-1&&e.indexOf(document.domain)==-1){return;}var h=g.rules||g.cssRules; -b(h);});return Fx.CSS.Cache[a]=d;}});Fx.CSS.Cache={};Fx.CSS.Parsers={Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true); -}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a)); -});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:Function.from(false),compute:function(b,a){return a; -},serve:function(a){return a;}}};Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);},set:function(b,a){if(arguments.length==1){a=b; -b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit);return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this; -}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);return this.parent(a.from,a.to); -}});Element.Properties.tween={set:function(a){this.get("tween").cancel().setOptions(a);return this;},get:function(){var a=this.retrieve("tween");if(!a){a=new Fx.Tween(this,{link:"cancel"}); -this.store("tween",a);}return a;}};Element.implement({tween:function(a,c,b){this.get("tween").start(a,c,b);return this;},fade:function(d){var e=this.get("tween"),g,c=["opacity"].append(arguments),a; -if(c[1]==null){c[1]="toggle";}switch(c[1]){case"in":g="start";c[1]=1;break;case"out":g="start";c[1]=0;break;case"show":g="set";c[1]=1;break;case"hide":g="set"; -c[1]=0;break;case"toggle":var b=this.retrieve("fade:flag",this.getStyle("opacity")==1);g="start";c[1]=b?0:1;this.store("fade:flag",!b);a=true;break;default:g="start"; -}if(!a){this.eliminate("fade:flag");}e[g].apply(e,c);var f=c[c.length-1];if(g=="set"||f!=0){this.setStyle("visibility",f==0?"hidden":"visible");}else{e.chain(function(){this.element.setStyle("visibility","hidden"); -this.callChain();});}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));a=(a=="transparent")?"#fff":a; -}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original")); -b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a); -},set:function(a){if(typeof a=="string"){a=this.search(a);}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={}; -for(var b in e){a[b]=this.parent(e[b],d[b],c);}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={}; -for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){this.get("morph").cancel().setOptions(a); -return this;},get:function(){var a=this.retrieve("morph");if(!a){a=new Fx.Morph(this,{link:"cancel"});this.store("morph",a);}return a;}};Element.implement({morph:function(a){this.get("morph").start(a); -return this;}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof a=="string"){var b=a.split(":"); -a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")];}}return a;}});Fx.Transition=function(c,b){b=Array.from(b); -var a=function(d){return c(d,b);};return Object.append(a,{easeIn:a,easeOut:function(d){return 1-c(1-d,b);},easeInOut:function(d){return(d<=0.5?c(2*d,b):(2-c(2*(1-d),b)))/2; -}});};Fx.Transitions={linear:function(a){return a;}};Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b]);}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a&&a[0]||6); -},Expo:function(a){return Math.pow(2,8*(a-1));},Circ:function(a){return 1-Math.sin(Math.acos(a));},Sine:function(a){return 1-Math.cos(a*Math.PI/2);},Back:function(b,a){a=a&&a[0]||1.618; -return Math.pow(b,2)*((a+1)*b-a);},Bounce:function(f){var e;for(var d=0,c=1;1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e; -},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,a+2); -});});(function(){var d=function(){},a=("onprogress" in new Browser.Request);var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(e){this.xhr=new Browser.Request(); -this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false; -this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d; -}clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml); -}else{this.failure();}},isSuccess:function(){var e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e); -}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); -},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(e){this.fireEvent("loadstart",[e,this.xhr]); -},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f; -return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.bind(this));},check:function(){if(!this.running){return true; -}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(o){if(!this.check(o)){return this; -}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options; -o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString(); -break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e; -j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g; -}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.indexOf("?")>-1?"&":"?")+String.uniqueID(); -}if(j&&(e=="get"||e=="delete")){f+=(f.indexOf("?")>-1?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this); -}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true; -}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]); -}},this);this.fireEvent("request");n.send(j);if(!this.options.async){this.onStateChange();}else{if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this); -}}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d; -if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e}; -if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e); -return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")}); -this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.options.url});return this;}});})(); -Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(f){var e=this.options,c=this.response; -c.html=f.stripScripts(function(h){c.javascript=h;});var d=c.html.match(/]*>([\s\S]*?)<\/body>/i);if(d){c.html=d[1];}var b=new Element("div").set("html",c.html); -c.tree=b.childNodes;c.elements=b.getElements(e.filter||"*");if(e.filter){c.tree=c.elements;}if(e.update){var g=document.id(e.update).empty();if(e.filter){g.adopt(c.elements); -}else{g.set("html",c.html);}}else{if(e.append){var a=document.id(e.append);if(e.filter){c.elements.reverse().inject(a);}else{a.adopt(b.getChildren());}}}if(e.evalScripts){Browser.exec(c.javascript); -}this.onSuccess(c.tree,c.elements,c.html,c.javascript);}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this; -},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",a);}return a; -}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return this;}});if(typeof JSON=="undefined"){this.JSON={}; -}(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4); -};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""); -return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON(); -}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[]; -Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj; -case"null":return"null";}return null;};JSON.secure=true;JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null;}if(secure==null){secure=JSON.secure; -}if(secure){if(JSON.parse){return JSON.parse(string);}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure."); -}}return eval("("+string+")");};})();Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"}); -},success:function(c){var b;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure(); -}else{this.onSuccess(b,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b; -this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path; -}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure"; -}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); -return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}}); -Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose(); -};(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a); -k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b); -if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h); -c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a); -}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this); -}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document); \ No newline at end of file diff --git a/module/webui/themes/flat/js/static/mootools-more.js b/module/webui/themes/flat/js/static/mootools-more.js deleted file mode 100644 index c7f4a1a0e..000000000 --- a/module/webui/themes/flat/js/static/mootools-more.js +++ /dev/null @@ -1,2856 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/more/c1cc18c2fff04bcc58921b4dff80a6f1 - -packager build: - - packager build More/Form.Request More/Fx.Reveal More/Sortables More/Request.Periodical More/Color - -... -*/ - -/* ---- - -script: More.js - -name: More - -description: MooTools More - -license: MIT-style license - -authors: - - Guillermo Rauch - - Thomas Aylott - - Scott Kyle - - Arian Stolwijk - - Tim Wienk - - Christoph Pojer - - Aaron Newton - - Jacob Thornton - -requires: - - Core/MooTools - -provides: [MooTools.More] - -... -*/ - -MooTools.More = { - version: '1.5.0', - build: '73db5e24e6e9c5c87b3a27aebef2248053f7db37' -}; - - -/* ---- - -script: Class.Binds.js - -name: Class.Binds - -description: Automagically binds specified methods in a class to the instance of the class. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Class - - MooTools.More - -provides: [Class.Binds] - -... -*/ - -Class.Mutators.Binds = function(binds){ - if (!this.prototype.initialize) this.implement('initialize', function(){}); - return Array.from(binds).concat(this.prototype.Binds || []); -}; - -Class.Mutators.initialize = function(initialize){ - return function(){ - Array.from(this.Binds).each(function(name){ - var original = this[name]; - if (original) this[name] = original.bind(this); - }, this); - return initialize.apply(this, arguments); - }; -}; - - -/* ---- - -script: Class.Occlude.js - -name: Class.Occlude - -description: Prevents a class from being applied to a DOM element twice. - -license: MIT-style license. - -authors: - - Aaron Newton - -requires: - - Core/Class - - Core/Element - - MooTools.More - -provides: [Class.Occlude] - -... -*/ - -Class.Occlude = new Class({ - - occlude: function(property, element){ - element = document.id(element || this.element); - var instance = element.retrieve(property || this.property); - if (instance && !this.occluded) - return (this.occluded = instance); - - this.occluded = false; - element.store(property || this.property, this); - return this.occluded; - } - -}); - - -/* ---- - -script: Class.Refactor.js - -name: Class.Refactor - -description: Extends a class onto itself with new property, preserving any items attached to the class's namespace. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Class - - MooTools.More - -# Some modules declare themselves dependent on Class.Refactor -provides: [Class.refactor, Class.Refactor] - -... -*/ - -Class.refactor = function(original, refactors){ - - Object.each(refactors, function(item, name){ - var origin = original.prototype[name]; - origin = (origin && origin.$origin) || origin || function(){}; - original.implement(name, (typeof item == 'function') ? function(){ - var old = this.previous; - this.previous = origin; - var value = item.apply(this, arguments); - this.previous = old; - return value; - } : item); - }); - - return original; - -}; - - -/* ---- - -script: Element.Measure.js - -name: Element.Measure - -description: Extends the Element native object to include methods useful in measuring dimensions. - -credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz" - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Element.Style - - Core/Element.Dimensions - - MooTools.More - -provides: [Element.Measure] - -... -*/ - -(function(){ - -var getStylesList = function(styles, planes){ - var list = []; - Object.each(planes, function(directions){ - Object.each(directions, function(edge){ - styles.each(function(style){ - list.push(style + '-' + edge + (style == 'border' ? '-width' : '')); - }); - }); - }); - return list; -}; - -var calculateEdgeSize = function(edge, styles){ - var total = 0; - Object.each(styles, function(value, style){ - if (style.test(edge)) total = total + value.toInt(); - }); - return total; -}; - -var isVisible = function(el){ - return !!(!el || el.offsetHeight || el.offsetWidth); -}; - - -Element.implement({ - - measure: function(fn){ - if (isVisible(this)) return fn.call(this); - var parent = this.getParent(), - toMeasure = []; - while (!isVisible(parent) && parent != document.body){ - toMeasure.push(parent.expose()); - parent = parent.getParent(); - } - var restore = this.expose(), - result = fn.call(this); - restore(); - toMeasure.each(function(restore){ - restore(); - }); - return result; - }, - - expose: function(){ - if (this.getStyle('display') != 'none') return function(){}; - var before = this.style.cssText; - this.setStyles({ - display: 'block', - position: 'absolute', - visibility: 'hidden' - }); - return function(){ - this.style.cssText = before; - }.bind(this); - }, - - getDimensions: function(options){ - options = Object.merge({computeSize: false}, options); - var dim = {x: 0, y: 0}; - - var getSize = function(el, options){ - return (options.computeSize) ? el.getComputedSize(options) : el.getSize(); - }; - - var parent = this.getParent('body'); - - if (parent && this.getStyle('display') == 'none'){ - dim = this.measure(function(){ - return getSize(this, options); - }); - } else if (parent){ - try { //safari sometimes crashes here, so catch it - dim = getSize(this, options); - }catch(e){} - } - - return Object.append(dim, (dim.x || dim.x === 0) ? { - width: dim.x, - height: dim.y - } : { - x: dim.width, - y: dim.height - } - ); - }, - - getComputedSize: function(options){ - - - options = Object.merge({ - styles: ['padding','border'], - planes: { - height: ['top','bottom'], - width: ['left','right'] - }, - mode: 'both' - }, options); - - var styles = {}, - size = {width: 0, height: 0}, - dimensions; - - if (options.mode == 'vertical'){ - delete size.width; - delete options.planes.width; - } else if (options.mode == 'horizontal'){ - delete size.height; - delete options.planes.height; - } - - getStylesList(options.styles, options.planes).each(function(style){ - styles[style] = this.getStyle(style).toInt(); - }, this); - - Object.each(options.planes, function(edges, plane){ - - var capitalized = plane.capitalize(), - style = this.getStyle(plane); - - if (style == 'auto' && !dimensions) dimensions = this.getDimensions(); - - style = styles[plane] = (style == 'auto') ? dimensions[plane] : style.toInt(); - size['total' + capitalized] = style; - - edges.each(function(edge){ - var edgesize = calculateEdgeSize(edge, styles); - size['computed' + edge.capitalize()] = edgesize; - size['total' + capitalized] += edgesize; - }); - - }, this); - - return Object.append(size, styles); - } - -}); - -})(); - - -/* ---- - -script: Element.Position.js - -name: Element.Position - -description: Extends the Element native object to include methods useful positioning elements relative to others. - -license: MIT-style license - -authors: - - Aaron Newton - - Jacob Thornton - -requires: - - Core/Options - - Core/Element.Dimensions - - Element.Measure - -provides: [Element.Position] - -... -*/ - -(function(original){ - -var local = Element.Position = { - - options: {/* - edge: false, - returnPos: false, - minimum: {x: 0, y: 0}, - maximum: {x: 0, y: 0}, - relFixedPosition: false, - ignoreMargins: false, - ignoreScroll: false, - allowNegative: false,*/ - relativeTo: document.body, - position: { - x: 'center', //left, center, right - y: 'center' //top, center, bottom - }, - offset: {x: 0, y: 0} - }, - - getOptions: function(element, options){ - options = Object.merge({}, local.options, options); - local.setPositionOption(options); - local.setEdgeOption(options); - local.setOffsetOption(element, options); - local.setDimensionsOption(element, options); - return options; - }, - - setPositionOption: function(options){ - options.position = local.getCoordinateFromValue(options.position); - }, - - setEdgeOption: function(options){ - var edgeOption = local.getCoordinateFromValue(options.edge); - options.edge = edgeOption ? edgeOption : - (options.position.x == 'center' && options.position.y == 'center') ? {x: 'center', y: 'center'} : - {x: 'left', y: 'top'}; - }, - - setOffsetOption: function(element, options){ - var parentOffset = {x: 0, y: 0}; - var parentScroll = {x: 0, y: 0}; - var offsetParent = element.measure(function(){ - return document.id(this.getOffsetParent()); - }); - - if (!offsetParent || offsetParent == element.getDocument().body) return; - - parentScroll = offsetParent.getScroll(); - parentOffset = offsetParent.measure(function(){ - var position = this.getPosition(); - if (this.getStyle('position') == 'fixed'){ - var scroll = window.getScroll(); - position.x += scroll.x; - position.y += scroll.y; - } - return position; - }); - - options.offset = { - parentPositioned: offsetParent != document.id(options.relativeTo), - x: options.offset.x - parentOffset.x + parentScroll.x, - y: options.offset.y - parentOffset.y + parentScroll.y - }; - }, - - setDimensionsOption: function(element, options){ - options.dimensions = element.getDimensions({ - computeSize: true, - styles: ['padding', 'border', 'margin'] - }); - }, - - getPosition: function(element, options){ - var position = {}; - options = local.getOptions(element, options); - var relativeTo = document.id(options.relativeTo) || document.body; - - local.setPositionCoordinates(options, position, relativeTo); - if (options.edge) local.toEdge(position, options); - - var offset = options.offset; - position.left = ((position.x >= 0 || offset.parentPositioned || options.allowNegative) ? position.x : 0).toInt(); - position.top = ((position.y >= 0 || offset.parentPositioned || options.allowNegative) ? position.y : 0).toInt(); - - local.toMinMax(position, options); - - if (options.relFixedPosition || relativeTo.getStyle('position') == 'fixed') local.toRelFixedPosition(relativeTo, position); - if (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position); - if (options.ignoreMargins) local.toIgnoreMargins(position, options); - - position.left = Math.ceil(position.left); - position.top = Math.ceil(position.top); - delete position.x; - delete position.y; - - return position; - }, - - setPositionCoordinates: function(options, position, relativeTo){ - var offsetY = options.offset.y, - offsetX = options.offset.x, - calc = (relativeTo == document.body) ? window.getScroll() : relativeTo.getPosition(), - top = calc.y, - left = calc.x, - winSize = window.getSize(); - - switch(options.position.x){ - case 'left': position.x = left + offsetX; break; - case 'right': position.x = left + offsetX + relativeTo.offsetWidth; break; - default: position.x = left + ((relativeTo == document.body ? winSize.x : relativeTo.offsetWidth) / 2) + offsetX; break; - } - - switch(options.position.y){ - case 'top': position.y = top + offsetY; break; - case 'bottom': position.y = top + offsetY + relativeTo.offsetHeight; break; - default: position.y = top + ((relativeTo == document.body ? winSize.y : relativeTo.offsetHeight) / 2) + offsetY; break; - } - }, - - toMinMax: function(position, options){ - var xy = {left: 'x', top: 'y'}, value; - ['minimum', 'maximum'].each(function(minmax){ - ['left', 'top'].each(function(lr){ - value = options[minmax] ? options[minmax][xy[lr]] : null; - if (value != null && ((minmax == 'minimum') ? position[lr] < value : position[lr] > value)) position[lr] = value; - }); - }); - }, - - toRelFixedPosition: function(relativeTo, position){ - var winScroll = window.getScroll(); - position.top += winScroll.y; - position.left += winScroll.x; - }, - - toIgnoreScroll: function(relativeTo, position){ - var relScroll = relativeTo.getScroll(); - position.top -= relScroll.y; - position.left -= relScroll.x; - }, - - toIgnoreMargins: function(position, options){ - position.left += options.edge.x == 'right' - ? options.dimensions['margin-right'] - : (options.edge.x != 'center' - ? -options.dimensions['margin-left'] - : -options.dimensions['margin-left'] + ((options.dimensions['margin-right'] + options.dimensions['margin-left']) / 2)); - - position.top += options.edge.y == 'bottom' - ? options.dimensions['margin-bottom'] - : (options.edge.y != 'center' - ? -options.dimensions['margin-top'] - : -options.dimensions['margin-top'] + ((options.dimensions['margin-bottom'] + options.dimensions['margin-top']) / 2)); - }, - - toEdge: function(position, options){ - var edgeOffset = {}, - dimensions = options.dimensions, - edge = options.edge; - - switch(edge.x){ - case 'left': edgeOffset.x = 0; break; - case 'right': edgeOffset.x = -dimensions.x - dimensions.computedRight - dimensions.computedLeft; break; - // center - default: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break; - } - - switch(edge.y){ - case 'top': edgeOffset.y = 0; break; - case 'bottom': edgeOffset.y = -dimensions.y - dimensions.computedTop - dimensions.computedBottom; break; - // center - default: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2)); break; - } - - position.x += edgeOffset.x; - position.y += edgeOffset.y; - }, - - getCoordinateFromValue: function(option){ - if (typeOf(option) != 'string') return option; - option = option.toLowerCase(); - - return { - x: option.test('left') ? 'left' - : (option.test('right') ? 'right' : 'center'), - y: option.test(/upper|top/) ? 'top' - : (option.test('bottom') ? 'bottom' : 'center') - }; - } - -}; - -Element.implement({ - - position: function(options){ - if (options && (options.x != null || options.y != null)){ - return (original ? original.apply(this, arguments) : this); - } - var position = this.setStyle('position', 'absolute').calculatePosition(options); - return (options && options.returnPos) ? position : this.setStyles(position); - }, - - calculatePosition: function(options){ - return local.getPosition(this, options); - } - -}); - -})(Element.prototype.position); - - -/* ---- - -script: IframeShim.js - -name: IframeShim - -description: Defines IframeShim, a class for obscuring select lists and flash objects in IE. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Element.Event - - Core/Element.Style - - Core/Options - - Core/Events - - Element.Position - - Class.Occlude - -provides: [IframeShim] - -... -*/ - -(function(){ - -var browsers = false; - - -this.IframeShim = new Class({ - - Implements: [Options, Events, Class.Occlude], - - options: { - className: 'iframeShim', - src: 'javascript:false;document.write("");', - display: false, - zIndex: null, - margin: 0, - offset: {x: 0, y: 0}, - browsers: browsers - }, - - property: 'IframeShim', - - initialize: function(element, options){ - this.element = document.id(element); - if (this.occlude()) return this.occluded; - this.setOptions(options); - this.makeShim(); - return this; - }, - - makeShim: function(){ - if (this.options.browsers){ - var zIndex = this.element.getStyle('zIndex').toInt(); - - if (!zIndex){ - zIndex = 1; - var pos = this.element.getStyle('position'); - if (pos == 'static' || !pos) this.element.setStyle('position', 'relative'); - this.element.setStyle('zIndex', zIndex); - } - zIndex = ((this.options.zIndex != null || this.options.zIndex === 0) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1; - if (zIndex < 0) zIndex = 1; - this.shim = new Element('iframe', { - src: this.options.src, - scrolling: 'no', - frameborder: 0, - styles: { - zIndex: zIndex, - position: 'absolute', - border: 'none', - filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)' - }, - 'class': this.options.className - }).store('IframeShim', this); - var inject = (function(){ - this.shim.inject(this.element, 'after'); - this[this.options.display ? 'show' : 'hide'](); - this.fireEvent('inject'); - }).bind(this); - if (!IframeShim.ready) window.addEvent('load', inject); - else inject(); - } else { - this.position = this.hide = this.show = this.dispose = Function.from(this); - } - }, - - position: function(){ - if (!IframeShim.ready || !this.shim) return this; - var size = this.element.measure(function(){ - return this.getSize(); - }); - if (this.options.margin != undefined){ - size.x = size.x - (this.options.margin * 2); - size.y = size.y - (this.options.margin * 2); - this.options.offset.x += this.options.margin; - this.options.offset.y += this.options.margin; - } - this.shim.set({width: size.x, height: size.y}).position({ - relativeTo: this.element, - offset: this.options.offset - }); - return this; - }, - - hide: function(){ - if (this.shim) this.shim.setStyle('display', 'none'); - return this; - }, - - show: function(){ - if (this.shim) this.shim.setStyle('display', 'block'); - return this.position(); - }, - - dispose: function(){ - if (this.shim) this.shim.dispose(); - return this; - }, - - destroy: function(){ - if (this.shim) this.shim.destroy(); - return this; - } - -}); - -})(); - -window.addEvent('load', function(){ - IframeShim.ready = true; -}); - - -/* ---- - -script: Mask.js - -name: Mask - -description: Creates a mask element to cover another. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Options - - Core/Events - - Core/Element.Event - - Class.Binds - - Element.Position - - IframeShim - -provides: [Mask] - -... -*/ - -var Mask = new Class({ - - Implements: [Options, Events], - - Binds: ['position'], - - options: {/* - onShow: function(){}, - onHide: function(){}, - onDestroy: function(){}, - onClick: function(event){}, - inject: { - where: 'after', - target: null, - }, - hideOnClick: false, - id: null, - destroyOnHide: false,*/ - style: {}, - 'class': 'mask', - maskMargins: false, - useIframeShim: true, - iframeShimOptions: {} - }, - - initialize: function(target, options){ - this.target = document.id(target) || document.id(document.body); - this.target.store('mask', this); - this.setOptions(options); - this.render(); - this.inject(); - }, - - render: function(){ - this.element = new Element('div', { - 'class': this.options['class'], - id: this.options.id || 'mask-' + String.uniqueID(), - styles: Object.merge({}, this.options.style, { - display: 'none' - }), - events: { - click: function(event){ - this.fireEvent('click', event); - if (this.options.hideOnClick) this.hide(); - }.bind(this) - } - }); - - this.hidden = true; - }, - - toElement: function(){ - return this.element; - }, - - inject: function(target, where){ - where = where || (this.options.inject ? this.options.inject.where : '') || (this.target == document.body ? 'inside' : 'after'); - target = target || (this.options.inject && this.options.inject.target) || this.target; - - this.element.inject(target, where); - - if (this.options.useIframeShim){ - this.shim = new IframeShim(this.element, this.options.iframeShimOptions); - - this.addEvents({ - show: this.shim.show.bind(this.shim), - hide: this.shim.hide.bind(this.shim), - destroy: this.shim.destroy.bind(this.shim) - }); - } - }, - - position: function(){ - this.resize(this.options.width, this.options.height); - - this.element.position({ - relativeTo: this.target, - position: 'topLeft', - ignoreMargins: !this.options.maskMargins, - ignoreScroll: this.target == document.body - }); - - return this; - }, - - resize: function(x, y){ - var opt = { - styles: ['padding', 'border'] - }; - if (this.options.maskMargins) opt.styles.push('margin'); - - var dim = this.target.getComputedSize(opt); - if (this.target == document.body){ - this.element.setStyles({width: 0, height: 0}); - var win = window.getScrollSize(); - if (dim.totalHeight < win.y) dim.totalHeight = win.y; - if (dim.totalWidth < win.x) dim.totalWidth = win.x; - } - this.element.setStyles({ - width: Array.pick([x, dim.totalWidth, dim.x]), - height: Array.pick([y, dim.totalHeight, dim.y]) - }); - - return this; - }, - - show: function(){ - if (!this.hidden) return this; - - window.addEvent('resize', this.position); - this.position(); - this.showMask.apply(this, arguments); - - return this; - }, - - showMask: function(){ - this.element.setStyle('display', 'block'); - this.hidden = false; - this.fireEvent('show'); - }, - - hide: function(){ - if (this.hidden) return this; - - window.removeEvent('resize', this.position); - this.hideMask.apply(this, arguments); - if (this.options.destroyOnHide) return this.destroy(); - - return this; - }, - - hideMask: function(){ - this.element.setStyle('display', 'none'); - this.hidden = true; - this.fireEvent('hide'); - }, - - toggle: function(){ - this[this.hidden ? 'show' : 'hide'](); - }, - - destroy: function(){ - this.hide(); - this.element.destroy(); - this.fireEvent('destroy'); - this.target.eliminate('mask'); - } - -}); - -Element.Properties.mask = { - - set: function(options){ - var mask = this.retrieve('mask'); - if (mask) mask.destroy(); - return this.eliminate('mask').store('mask:options', options); - }, - - get: function(){ - var mask = this.retrieve('mask'); - if (!mask){ - mask = new Mask(this, this.retrieve('mask:options')); - this.store('mask', mask); - } - return mask; - } - -}; - -Element.implement({ - - mask: function(options){ - if (options) this.set('mask', options); - this.get('mask').show(); - return this; - }, - - unmask: function(){ - this.get('mask').hide(); - return this; - } - -}); - - -/* ---- - -script: Spinner.js - -name: Spinner - -description: Adds a semi-transparent overlay over a dom element with a spinnin ajax icon. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Fx.Tween - - Core/Request - - Class.refactor - - Mask - -provides: [Spinner] - -... -*/ - -var Spinner = new Class({ - - Extends: Mask, - - Implements: Chain, - - options: {/* - message: false,*/ - 'class': 'spinner', - containerPosition: {}, - content: { - 'class': 'spinner-content' - }, - messageContainer: { - 'class': 'spinner-msg' - }, - img: { - 'class': 'spinner-img' - }, - fxOptions: { - link: 'chain' - } - }, - - initialize: function(target, options){ - this.target = document.id(target) || document.id(document.body); - this.target.store('spinner', this); - this.setOptions(options); - this.render(); - this.inject(); - - // Add this to events for when noFx is true; parent methods handle hide/show. - var deactivate = function(){ this.active = false; }.bind(this); - this.addEvents({ - hide: deactivate, - show: deactivate - }); - }, - - render: function(){ - this.parent(); - - this.element.set('id', this.options.id || 'spinner-' + String.uniqueID()); - - this.content = document.id(this.options.content) || new Element('div', this.options.content); - this.content.inject(this.element); - - if (this.options.message){ - this.msg = document.id(this.options.message) || new Element('p', this.options.messageContainer).appendText(this.options.message); - this.msg.inject(this.content); - } - - if (this.options.img){ - this.img = document.id(this.options.img) || new Element('div', this.options.img); - this.img.inject(this.content); - } - - this.element.set('tween', this.options.fxOptions); - }, - - show: function(noFx){ - if (this.active) return this.chain(this.show.bind(this)); - if (!this.hidden){ - this.callChain.delay(20, this); - return this; - } - - this.target.set('aria-busy', 'true'); - this.active = true; - - return this.parent(noFx); - }, - - showMask: function(noFx){ - var pos = function(){ - this.content.position(Object.merge({ - relativeTo: this.element - }, this.options.containerPosition)); - }.bind(this); - - if (noFx){ - this.parent(); - pos(); - } else { - if (!this.options.style.opacity) this.options.style.opacity = this.element.getStyle('opacity').toFloat(); - this.element.setStyles({ - display: 'block', - opacity: 0 - }).tween('opacity', this.options.style.opacity); - pos(); - this.hidden = false; - this.fireEvent('show'); - this.callChain(); - } - }, - - hide: function(noFx){ - if (this.active) return this.chain(this.hide.bind(this)); - if (this.hidden){ - this.callChain.delay(20, this); - return this; - } - - this.target.set('aria-busy', 'false'); - this.active = true; - - return this.parent(noFx); - }, - - hideMask: function(noFx){ - if (noFx) return this.parent(); - this.element.tween('opacity', 0).get('tween').chain(function(){ - this.element.setStyle('display', 'none'); - this.hidden = true; - this.fireEvent('hide'); - this.callChain(); - }.bind(this)); - }, - - destroy: function(){ - this.content.destroy(); - this.parent(); - this.target.eliminate('spinner'); - } - -}); - -Request = Class.refactor(Request, { - - options: { - useSpinner: false, - spinnerOptions: {}, - spinnerTarget: false - }, - - initialize: function(options){ - this._send = this.send; - this.send = function(options){ - var spinner = this.getSpinner(); - if (spinner) spinner.chain(this._send.pass(options, this)).show(); - else this._send(options); - return this; - }; - this.previous(options); - }, - - getSpinner: function(){ - if (!this.spinner){ - var update = document.id(this.options.spinnerTarget) || document.id(this.options.update); - if (this.options.useSpinner && update){ - update.set('spinner', this.options.spinnerOptions); - var spinner = this.spinner = update.get('spinner'); - ['complete', 'exception', 'cancel'].each(function(event){ - this.addEvent(event, spinner.hide.bind(spinner)); - }, this); - } - } - return this.spinner; - } - -}); - -Element.Properties.spinner = { - - set: function(options){ - var spinner = this.retrieve('spinner'); - if (spinner) spinner.destroy(); - return this.eliminate('spinner').store('spinner:options', options); - }, - - get: function(){ - var spinner = this.retrieve('spinner'); - if (!spinner){ - spinner = new Spinner(this, this.retrieve('spinner:options')); - this.store('spinner', spinner); - } - return spinner; - } - -}; - -Element.implement({ - - spin: function(options){ - if (options) this.set('spinner', options); - this.get('spinner').show(); - return this; - }, - - unspin: function(){ - this.get('spinner').hide(); - return this; - } - -}); - - -/* ---- - -script: String.QueryString.js - -name: String.QueryString - -description: Methods for dealing with URI query strings. - -license: MIT-style license - -authors: - - Sebastian Markbåge - - Aaron Newton - - Lennart Pilon - - Valerio Proietti - -requires: - - Core/Array - - Core/String - - MooTools.More - -provides: [String.QueryString] - -... -*/ - -String.implement({ - - parseQueryString: function(decodeKeys, decodeValues){ - if (decodeKeys == null) decodeKeys = true; - if (decodeValues == null) decodeValues = true; - - var vars = this.split(/[&;]/), - object = {}; - if (!vars.length) return object; - - vars.each(function(val){ - var index = val.indexOf('=') + 1, - value = index ? val.substr(index) : '', - keys = index ? val.substr(0, index - 1).match(/([^\]\[]+|(\B)(?=\]))/g) : [val], - obj = object; - if (!keys) return; - if (decodeValues) value = decodeURIComponent(value); - keys.each(function(key, i){ - if (decodeKeys) key = decodeURIComponent(key); - var current = obj[key]; - - if (i < keys.length - 1) obj = obj[key] = current || {}; - else if (typeOf(current) == 'array') current.push(value); - else obj[key] = current != null ? [current, value] : value; - }); - }); - - return object; - }, - - cleanQueryString: function(method){ - return this.split('&').filter(function(val){ - var index = val.indexOf('='), - key = index < 0 ? '' : val.substr(0, index), - value = val.substr(index + 1); - - return method ? method.call(null, key, value) : (value || value === 0); - }).join('&'); - } - -}); - - -/* ---- - -name: Events.Pseudos - -description: Adds the functionality to add pseudo events - -license: MIT-style license - -authors: - - Arian Stolwijk - -requires: [Core/Class.Extras, Core/Slick.Parser, MooTools.More] - -provides: [Events.Pseudos] - -... -*/ - -(function(){ - -Events.Pseudos = function(pseudos, addEvent, removeEvent){ - - var storeKey = '_monitorEvents:'; - - var storageOf = function(object){ - return { - store: object.store ? function(key, value){ - object.store(storeKey + key, value); - } : function(key, value){ - (object._monitorEvents || (object._monitorEvents = {}))[key] = value; - }, - retrieve: object.retrieve ? function(key, dflt){ - return object.retrieve(storeKey + key, dflt); - } : function(key, dflt){ - if (!object._monitorEvents) return dflt; - return object._monitorEvents[key] || dflt; - } - }; - }; - - var splitType = function(type){ - if (type.indexOf(':') == -1 || !pseudos) return null; - - var parsed = Slick.parse(type).expressions[0][0], - parsedPseudos = parsed.pseudos, - l = parsedPseudos.length, - splits = []; - - while (l--){ - var pseudo = parsedPseudos[l].key, - listener = pseudos[pseudo]; - if (listener != null) splits.push({ - event: parsed.tag, - value: parsedPseudos[l].value, - pseudo: pseudo, - original: type, - listener: listener - }); - } - return splits.length ? splits : null; - }; - - return { - - addEvent: function(type, fn, internal){ - var split = splitType(type); - if (!split) return addEvent.call(this, type, fn, internal); - - var storage = storageOf(this), - events = storage.retrieve(type, []), - eventType = split[0].event, - args = Array.slice(arguments, 2), - stack = fn, - self = this; - - split.each(function(item){ - var listener = item.listener, - stackFn = stack; - if (listener == false) eventType += ':' + item.pseudo + '(' + item.value + ')'; - else stack = function(){ - listener.call(self, item, stackFn, arguments, stack); - }; - }); - - events.include({type: eventType, event: fn, monitor: stack}); - storage.store(type, events); - - if (type != eventType) addEvent.apply(this, [type, fn].concat(args)); - return addEvent.apply(this, [eventType, stack].concat(args)); - }, - - removeEvent: function(type, fn){ - var split = splitType(type); - if (!split) return removeEvent.call(this, type, fn); - - var storage = storageOf(this), - events = storage.retrieve(type); - if (!events) return this; - - var args = Array.slice(arguments, 2); - - removeEvent.apply(this, [type, fn].concat(args)); - events.each(function(monitor, i){ - if (!fn || monitor.event == fn) removeEvent.apply(this, [monitor.type, monitor.monitor].concat(args)); - delete events[i]; - }, this); - - storage.store(type, events); - return this; - } - - }; - -}; - -var pseudos = { - - once: function(split, fn, args, monitor){ - fn.apply(this, args); - this.removeEvent(split.event, monitor) - .removeEvent(split.original, fn); - }, - - throttle: function(split, fn, args){ - if (!fn._throttled){ - fn.apply(this, args); - fn._throttled = setTimeout(function(){ - fn._throttled = false; - }, split.value || 250); - } - }, - - pause: function(split, fn, args){ - clearTimeout(fn._pause); - fn._pause = fn.delay(split.value || 250, this, args); - } - -}; - -Events.definePseudo = function(key, listener){ - pseudos[key] = listener; - return this; -}; - -Events.lookupPseudo = function(key){ - return pseudos[key]; -}; - -var proto = Events.prototype; -Events.implement(Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent)); - -['Request', 'Fx'].each(function(klass){ - if (this[klass]) this[klass].implement(Events.prototype); -}); - -})(); - - -/* ---- - -name: Element.Event.Pseudos - -description: Adds the functionality to add pseudo events for Elements - -license: MIT-style license - -authors: - - Arian Stolwijk - -requires: [Core/Element.Event, Core/Element.Delegation, Events.Pseudos] - -provides: [Element.Event.Pseudos, Element.Delegation.Pseudo] - -... -*/ - -(function(){ - -var pseudos = {relay: false}, - copyFromEvents = ['once', 'throttle', 'pause'], - count = copyFromEvents.length; - -while (count--) pseudos[copyFromEvents[count]] = Events.lookupPseudo(copyFromEvents[count]); - -DOMEvent.definePseudo = function(key, listener){ - pseudos[key] = listener; - return this; -}; - -var proto = Element.prototype; -[Element, Window, Document].invoke('implement', Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent)); - -})(); - - -/* ---- - -script: Form.Request.js - -name: Form.Request - -description: Handles the basic functionality of submitting a form and updating a dom element with the result. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Request.HTML - - Class.Binds - - Class.Occlude - - Spinner - - String.QueryString - - Element.Delegation.Pseudo - -provides: [Form.Request] - -... -*/ - -if (!window.Form) window.Form = {}; - -(function(){ - - Form.Request = new Class({ - - Binds: ['onSubmit', 'onFormValidate'], - - Implements: [Options, Events, Class.Occlude], - - options: {/* - onFailure: function(){}, - onSuccess: function(){}, // aliased to onComplete, - onSend: function(){}*/ - requestOptions: { - evalScripts: true, - useSpinner: true, - emulation: false, - link: 'ignore' - }, - sendButtonClicked: true, - extraData: {}, - resetForm: true - }, - - property: 'form.request', - - initialize: function(form, target, options){ - this.element = document.id(form); - if (this.occlude()) return this.occluded; - this.setOptions(options) - .setTarget(target) - .attach(); - }, - - setTarget: function(target){ - this.target = document.id(target); - if (!this.request){ - this.makeRequest(); - } else { - this.request.setOptions({ - update: this.target - }); - } - return this; - }, - - toElement: function(){ - return this.element; - }, - - makeRequest: function(){ - var self = this; - this.request = new Request.HTML(Object.merge({ - update: this.target, - emulation: false, - spinnerTarget: this.element, - method: this.element.get('method') || 'post' - }, this.options.requestOptions)).addEvents({ - success: function(tree, elements, html, javascript){ - ['complete', 'success'].each(function(evt){ - self.fireEvent(evt, [self.target, tree, elements, html, javascript]); - }); - }, - failure: function(){ - self.fireEvent('complete', arguments).fireEvent('failure', arguments); - }, - exception: function(){ - self.fireEvent('failure', arguments); - } - }); - return this.attachReset(); - }, - - attachReset: function(){ - if (!this.options.resetForm) return this; - this.request.addEvent('success', function(){ - Function.attempt(function(){ - this.element.reset(); - }.bind(this)); - if (window.OverText) OverText.update(); - }.bind(this)); - return this; - }, - - attach: function(attach){ - var method = (attach != false) ? 'addEvent' : 'removeEvent'; - this.element[method]('click:relay(button, input[type=submit])', this.saveClickedButton.bind(this)); - - var fv = this.element.retrieve('validator'); - if (fv) fv[method]('onFormValidate', this.onFormValidate); - else this.element[method]('submit', this.onSubmit); - - return this; - }, - - detach: function(){ - return this.attach(false); - }, - - //public method - enable: function(){ - return this.attach(); - }, - - //public method - disable: function(){ - return this.detach(); - }, - - onFormValidate: function(valid, form, event){ - //if there's no event, then this wasn't a submit event - if (!event) return; - var fv = this.element.retrieve('validator'); - if (valid || (fv && !fv.options.stopOnFailure)){ - event.stop(); - this.send(); - } - }, - - onSubmit: function(event){ - var fv = this.element.retrieve('validator'); - if (fv){ - //form validator was created after Form.Request - this.element.removeEvent('submit', this.onSubmit); - fv.addEvent('onFormValidate', this.onFormValidate); - fv.validate(event); - return; - } - if (event) event.stop(); - this.send(); - }, - - saveClickedButton: function(event, target){ - var targetName = target.get('name'); - if (!targetName || !this.options.sendButtonClicked) return; - this.options.extraData[targetName] = target.get('value') || true; - this.clickedCleaner = function(){ - delete this.options.extraData[targetName]; - this.clickedCleaner = function(){}; - }.bind(this); - }, - - clickedCleaner: function(){}, - - send: function(){ - var str = this.element.toQueryString().trim(), - data = Object.toQueryString(this.options.extraData); - - if (str) str += "&" + data; - else str = data; - - this.fireEvent('send', [this.element, str.parseQueryString()]); - this.request.send({ - data: str, - url: this.options.requestOptions.url || this.element.get('action') - }); - this.clickedCleaner(); - return this; - } - - }); - - Element.implement('formUpdate', function(update, options){ - var fq = this.retrieve('form.request'); - if (!fq){ - fq = new Form.Request(this, update, options); - } else { - if (update) fq.setTarget(update); - if (options) fq.setOptions(options).makeRequest(); - } - fq.send(); - return this; - }); - -})(); - - -/* ---- - -script: Element.Shortcuts.js - -name: Element.Shortcuts - -description: Extends the Element native object to include some shortcut methods. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Element.Style - - MooTools.More - -provides: [Element.Shortcuts] - -... -*/ - -Element.implement({ - - isDisplayed: function(){ - return this.getStyle('display') != 'none'; - }, - - isVisible: function(){ - var w = this.offsetWidth, - h = this.offsetHeight; - return (w == 0 && h == 0) ? false : (w > 0 && h > 0) ? true : this.style.display != 'none'; - }, - - toggle: function(){ - return this[this.isDisplayed() ? 'hide' : 'show'](); - }, - - hide: function(){ - var d; - try { - //IE fails here if the element is not in the dom - d = this.getStyle('display'); - } catch(e){} - if (d == 'none') return this; - return this.store('element:_originalDisplay', d || '').setStyle('display', 'none'); - }, - - show: function(display){ - if (!display && this.isDisplayed()) return this; - display = display || this.retrieve('element:_originalDisplay') || 'block'; - return this.setStyle('display', (display == 'none') ? 'block' : display); - }, - - swapClass: function(remove, add){ - return this.removeClass(remove).addClass(add); - } - -}); - -Document.implement({ - - clearSelection: function(){ - if (window.getSelection){ - var selection = window.getSelection(); - if (selection && selection.removeAllRanges) selection.removeAllRanges(); - } else if (document.selection && document.selection.empty){ - try { - //IE fails here if selected element is not in dom - document.selection.empty(); - } catch(e){} - } - } - -}); - - -/* ---- - -script: Fx.Reveal.js - -name: Fx.Reveal - -description: Defines Fx.Reveal, a class that shows and hides elements with a transition. - -license: MIT-style license - -authors: - - Aaron Newton - -requires: - - Core/Fx.Morph - - Element.Shortcuts - - Element.Measure - -provides: [Fx.Reveal] - -... -*/ - -(function(){ - - -var hideTheseOf = function(object){ - var hideThese = object.options.hideInputs; - if (window.OverText){ - var otClasses = [null]; - OverText.each(function(ot){ - otClasses.include('.' + ot.options.labelClass); - }); - if (otClasses) hideThese += otClasses.join(', '); - } - return (hideThese) ? object.element.getElements(hideThese) : null; -}; - - -Fx.Reveal = new Class({ - - Extends: Fx.Morph, - - options: {/* - onShow: function(thisElement){}, - onHide: function(thisElement){}, - onComplete: function(thisElement){}, - heightOverride: null, - widthOverride: null,*/ - link: 'cancel', - styles: ['padding', 'border', 'margin'], - transitionOpacity: 'opacity' in document.documentElement, - mode: 'vertical', - display: function(){ - return this.element.get('tag') != 'tr' ? 'block' : 'table-row'; - }, - opacity: 1, - hideInputs: !('opacity' in document.documentElement) ? 'select, input, textarea, object, embed' : null - }, - - dissolve: function(){ - if (!this.hiding && !this.showing){ - if (this.element.getStyle('display') != 'none'){ - this.hiding = true; - this.showing = false; - this.hidden = true; - this.cssText = this.element.style.cssText; - - var startStyles = this.element.getComputedSize({ - styles: this.options.styles, - mode: this.options.mode - }); - if (this.options.transitionOpacity) startStyles.opacity = this.options.opacity; - - var zero = {}; - Object.each(startStyles, function(style, name){ - zero[name] = [style, 0]; - }); - - this.element.setStyles({ - display: Function.from(this.options.display).call(this), - overflow: 'hidden' - }); - - var hideThese = hideTheseOf(this); - if (hideThese) hideThese.setStyle('visibility', 'hidden'); - - this.$chain.unshift(function(){ - if (this.hidden){ - this.hiding = false; - this.element.style.cssText = this.cssText; - this.element.setStyle('display', 'none'); - if (hideThese) hideThese.setStyle('visibility', 'visible'); - } - this.fireEvent('hide', this.element); - this.callChain(); - }.bind(this)); - - this.start(zero); - } else { - this.callChain.delay(10, this); - this.fireEvent('complete', this.element); - this.fireEvent('hide', this.element); - } - } else if (this.options.link == 'chain'){ - this.chain(this.dissolve.bind(this)); - } else if (this.options.link == 'cancel' && !this.hiding){ - this.cancel(); - this.dissolve(); - } - return this; - }, - - reveal: function(){ - if (!this.showing && !this.hiding){ - if (this.element.getStyle('display') == 'none'){ - this.hiding = false; - this.showing = true; - this.hidden = false; - this.cssText = this.element.style.cssText; - - var startStyles; - this.element.measure(function(){ - startStyles = this.element.getComputedSize({ - styles: this.options.styles, - mode: this.options.mode - }); - }.bind(this)); - if (this.options.heightOverride != null) startStyles.height = this.options.heightOverride.toInt(); - if (this.options.widthOverride != null) startStyles.width = this.options.widthOverride.toInt(); - if (this.options.transitionOpacity){ - this.element.setStyle('opacity', 0); - startStyles.opacity = this.options.opacity; - } - - var zero = { - height: 0, - display: Function.from(this.options.display).call(this) - }; - Object.each(startStyles, function(style, name){ - zero[name] = 0; - }); - zero.overflow = 'hidden'; - - this.element.setStyles(zero); - - var hideThese = hideTheseOf(this); - if (hideThese) hideThese.setStyle('visibility', 'hidden'); - - this.$chain.unshift(function(){ - this.element.style.cssText = this.cssText; - this.element.setStyle('display', Function.from(this.options.display).call(this)); - if (!this.hidden) this.showing = false; - if (hideThese) hideThese.setStyle('visibility', 'visible'); - this.callChain(); - this.fireEvent('show', this.element); - }.bind(this)); - - this.start(startStyles); - } else { - this.callChain(); - this.fireEvent('complete', this.element); - this.fireEvent('show', this.element); - } - } else if (this.options.link == 'chain'){ - this.chain(this.reveal.bind(this)); - } else if (this.options.link == 'cancel' && !this.showing){ - this.cancel(); - this.reveal(); - } - return this; - }, - - toggle: function(){ - if (this.element.getStyle('display') == 'none'){ - this.reveal(); - } else { - this.dissolve(); - } - return this; - }, - - cancel: function(){ - this.parent.apply(this, arguments); - if (this.cssText != null) this.element.style.cssText = this.cssText; - this.hiding = false; - this.showing = false; - return this; - } - -}); - -Element.Properties.reveal = { - - set: function(options){ - this.get('reveal').cancel().setOptions(options); - return this; - }, - - get: function(){ - var reveal = this.retrieve('reveal'); - if (!reveal){ - reveal = new Fx.Reveal(this); - this.store('reveal', reveal); - } - return reveal; - } - -}; - -Element.Properties.dissolve = Element.Properties.reveal; - -Element.implement({ - - reveal: function(options){ - this.get('reveal').setOptions(options).reveal(); - return this; - }, - - dissolve: function(options){ - this.get('reveal').setOptions(options).dissolve(); - return this; - }, - - nix: function(options){ - var params = Array.link(arguments, {destroy: Type.isBoolean, options: Type.isObject}); - this.get('reveal').setOptions(options).dissolve().chain(function(){ - this[params.destroy ? 'destroy' : 'dispose'](); - }.bind(this)); - return this; - }, - - wink: function(){ - var params = Array.link(arguments, {duration: Type.isNumber, options: Type.isObject}); - var reveal = this.get('reveal').setOptions(params.options); - reveal.reveal().chain(function(){ - (function(){ - reveal.dissolve(); - }).delay(params.duration || 2000); - }); - } - -}); - -})(); - - -/* ---- - -script: Drag.js - -name: Drag - -description: The base Drag Class. Can be used to drag and resize Elements using mouse events. - -license: MIT-style license - -authors: - - Valerio Proietti - - Tom Occhinno - - Jan Kassens - -requires: - - Core/Events - - Core/Options - - Core/Element.Event - - Core/Element.Style - - Core/Element.Dimensions - - MooTools.More - -provides: [Drag] -... - -*/ - -var Drag = new Class({ - - Implements: [Events, Options], - - options: {/* - onBeforeStart: function(thisElement){}, - onStart: function(thisElement, event){}, - onSnap: function(thisElement){}, - onDrag: function(thisElement, event){}, - onCancel: function(thisElement){}, - onComplete: function(thisElement, event){},*/ - snap: 6, - unit: 'px', - grid: false, - style: true, - limit: false, - handle: false, - invert: false, - preventDefault: false, - stopPropagation: false, - modifiers: {x: 'left', y: 'top'} - }, - - initialize: function(){ - var params = Array.link(arguments, { - 'options': Type.isObject, - 'element': function(obj){ - return obj != null; - } - }); - - this.element = document.id(params.element); - this.document = this.element.getDocument(); - this.setOptions(params.options || {}); - var htype = typeOf(this.options.handle); - this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element; - this.mouse = {'now': {}, 'pos': {}}; - this.value = {'start': {}, 'now': {}}; - - this.selection = 'selectstart' in document ? 'selectstart' : 'mousedown'; - - - if ('ondragstart' in document && !('FileReader' in window) && !Drag.ondragstartFixed){ - document.ondragstart = Function.from(false); - Drag.ondragstartFixed = true; - } - - this.bound = { - start: this.start.bind(this), - check: this.check.bind(this), - drag: this.drag.bind(this), - stop: this.stop.bind(this), - cancel: this.cancel.bind(this), - eventStop: Function.from(false) - }; - this.attach(); - }, - - attach: function(){ - this.handles.addEvent('mousedown', this.bound.start); - return this; - }, - - detach: function(){ - this.handles.removeEvent('mousedown', this.bound.start); - return this; - }, - - start: function(event){ - var options = this.options; - - if (event.rightClick) return; - - if (options.preventDefault) event.preventDefault(); - if (options.stopPropagation) event.stopPropagation(); - this.mouse.start = event.page; - - this.fireEvent('beforeStart', this.element); - - var limit = options.limit; - this.limit = {x: [], y: []}; - - var z, coordinates; - for (z in options.modifiers){ - if (!options.modifiers[z]) continue; - - var style = this.element.getStyle(options.modifiers[z]); - - // Some browsers (IE and Opera) don't always return pixels. - if (style && !style.match(/px$/)){ - if (!coordinates) coordinates = this.element.getCoordinates(this.element.getOffsetParent()); - style = coordinates[options.modifiers[z]]; - } - - if (options.style) this.value.now[z] = (style || 0).toInt(); - else this.value.now[z] = this.element[options.modifiers[z]]; - - if (options.invert) this.value.now[z] *= -1; - - this.mouse.pos[z] = event.page[z] - this.value.now[z]; - - if (limit && limit[z]){ - var i = 2; - while (i--){ - var limitZI = limit[z][i]; - if (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI == 'function') ? limitZI() : limitZI; - } - } - } - - if (typeOf(this.options.grid) == 'number') this.options.grid = { - x: this.options.grid, - y: this.options.grid - }; - - var events = { - mousemove: this.bound.check, - mouseup: this.bound.cancel - }; - events[this.selection] = this.bound.eventStop; - this.document.addEvents(events); - }, - - check: function(event){ - if (this.options.preventDefault) event.preventDefault(); - var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2))); - if (distance > this.options.snap){ - this.cancel(); - this.document.addEvents({ - mousemove: this.bound.drag, - mouseup: this.bound.stop - }); - this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element); - } - }, - - drag: function(event){ - var options = this.options; - - if (options.preventDefault) event.preventDefault(); - this.mouse.now = event.page; - - for (var z in options.modifiers){ - if (!options.modifiers[z]) continue; - this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z]; - - if (options.invert) this.value.now[z] *= -1; - - if (options.limit && this.limit[z]){ - if ((this.limit[z][1] || this.limit[z][1] === 0) && (this.value.now[z] > this.limit[z][1])){ - this.value.now[z] = this.limit[z][1]; - } else if ((this.limit[z][0] || this.limit[z][0] === 0) && (this.value.now[z] < this.limit[z][0])){ - this.value.now[z] = this.limit[z][0]; - } - } - - if (options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % options.grid[z]); - - if (options.style) this.element.setStyle(options.modifiers[z], this.value.now[z] + options.unit); - else this.element[options.modifiers[z]] = this.value.now[z]; - } - - this.fireEvent('drag', [this.element, event]); - }, - - cancel: function(event){ - this.document.removeEvents({ - mousemove: this.bound.check, - mouseup: this.bound.cancel - }); - if (event){ - this.document.removeEvent(this.selection, this.bound.eventStop); - this.fireEvent('cancel', this.element); - } - }, - - stop: function(event){ - var events = { - mousemove: this.bound.drag, - mouseup: this.bound.stop - }; - events[this.selection] = this.bound.eventStop; - this.document.removeEvents(events); - if (event) this.fireEvent('complete', [this.element, event]); - } - -}); - -Element.implement({ - - makeResizable: function(options){ - var drag = new Drag(this, Object.merge({ - modifiers: { - x: 'width', - y: 'height' - } - }, options)); - - this.store('resizer', drag); - return drag.addEvent('drag', function(){ - this.fireEvent('resize', drag); - }.bind(this)); - } - -}); - - -/* ---- - -script: Drag.Move.js - -name: Drag.Move - -description: A Drag extension that provides support for the constraining of draggables to containers and droppables. - -license: MIT-style license - -authors: - - Valerio Proietti - - Tom Occhinno - - Jan Kassens - - Aaron Newton - - Scott Kyle - -requires: - - Core/Element.Dimensions - - Drag - -provides: [Drag.Move] - -... -*/ - -Drag.Move = new Class({ - - Extends: Drag, - - options: {/* - onEnter: function(thisElement, overed){}, - onLeave: function(thisElement, overed){}, - onDrop: function(thisElement, overed, event){},*/ - droppables: [], - container: false, - precalculate: false, - includeMargins: true, - checkDroppables: true - }, - - initialize: function(element, options){ - this.parent(element, options); - element = this.element; - - this.droppables = $$(this.options.droppables); - this.setContainer(this.options.container); - - if (this.options.style){ - if (this.options.modifiers.x == 'left' && this.options.modifiers.y == 'top'){ - var parent = element.getOffsetParent(), - styles = element.getStyles('left', 'top'); - if (parent && (styles.left == 'auto' || styles.top == 'auto')){ - element.setPosition(element.getPosition(parent)); - } - } - - if (element.getStyle('position') == 'static') element.setStyle('position', 'absolute'); - } - - this.addEvent('start', this.checkDroppables, true); - this.overed = null; - }, - - setContainer: function(container) { - this.container = document.id(container); - if (this.container && typeOf(this.container) != 'element'){ - this.container = document.id(this.container.getDocument().body); - } - }, - - start: function(event){ - if (this.container) this.options.limit = this.calculateLimit(); - - if (this.options.precalculate){ - this.positions = this.droppables.map(function(el){ - return el.getCoordinates(); - }); - } - - this.parent(event); - }, - - calculateLimit: function(){ - var element = this.element, - container = this.container, - - offsetParent = document.id(element.getOffsetParent()) || document.body, - containerCoordinates = container.getCoordinates(offsetParent), - elementMargin = {}, - elementBorder = {}, - containerMargin = {}, - containerBorder = {}, - offsetParentPadding = {}; - - ['top', 'right', 'bottom', 'left'].each(function(pad){ - elementMargin[pad] = element.getStyle('margin-' + pad).toInt(); - elementBorder[pad] = element.getStyle('border-' + pad).toInt(); - containerMargin[pad] = container.getStyle('margin-' + pad).toInt(); - containerBorder[pad] = container.getStyle('border-' + pad).toInt(); - offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt(); - }, this); - - var width = element.offsetWidth + elementMargin.left + elementMargin.right, - height = element.offsetHeight + elementMargin.top + elementMargin.bottom, - left = 0, - top = 0, - right = containerCoordinates.right - containerBorder.right - width, - bottom = containerCoordinates.bottom - containerBorder.bottom - height; - - if (this.options.includeMargins){ - left += elementMargin.left; - top += elementMargin.top; - } else { - right += elementMargin.right; - bottom += elementMargin.bottom; - } - - if (element.getStyle('position') == 'relative'){ - var coords = element.getCoordinates(offsetParent); - coords.left -= element.getStyle('left').toInt(); - coords.top -= element.getStyle('top').toInt(); - - left -= coords.left; - top -= coords.top; - if (container.getStyle('position') != 'relative'){ - left += containerBorder.left; - top += containerBorder.top; - } - right += elementMargin.left - coords.left; - bottom += elementMargin.top - coords.top; - - if (container != offsetParent){ - left += containerMargin.left + offsetParentPadding.left; - if (!offsetParentPadding.left && left < 0) left = 0; - top += offsetParent == document.body ? 0 : containerMargin.top + offsetParentPadding.top; - if (!offsetParentPadding.top && top < 0) top = 0; - } - } else { - left -= elementMargin.left; - top -= elementMargin.top; - if (container != offsetParent){ - left += containerCoordinates.left + containerBorder.left; - top += containerCoordinates.top + containerBorder.top; - } - } - - return { - x: [left, right], - y: [top, bottom] - }; - }, - - getDroppableCoordinates: function(element){ - var position = element.getCoordinates(); - if (element.getStyle('position') == 'fixed'){ - var scroll = window.getScroll(); - position.left += scroll.x; - position.right += scroll.x; - position.top += scroll.y; - position.bottom += scroll.y; - } - return position; - }, - - checkDroppables: function(){ - var overed = this.droppables.filter(function(el, i){ - el = this.positions ? this.positions[i] : this.getDroppableCoordinates(el); - var now = this.mouse.now; - return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top); - }, this).getLast(); - - if (this.overed != overed){ - if (this.overed) this.fireEvent('leave', [this.element, this.overed]); - if (overed) this.fireEvent('enter', [this.element, overed]); - this.overed = overed; - } - }, - - drag: function(event){ - this.parent(event); - if (this.options.checkDroppables && this.droppables.length) this.checkDroppables(); - }, - - stop: function(event){ - this.checkDroppables(); - this.fireEvent('drop', [this.element, this.overed, event]); - this.overed = null; - return this.parent(event); - } - -}); - -Element.implement({ - - makeDraggable: function(options){ - var drag = new Drag.Move(this, options); - this.store('dragger', drag); - return drag; - } - -}); - - -/* ---- - -script: Sortables.js - -name: Sortables - -description: Class for creating a drag and drop sorting interface for lists of items. - -license: MIT-style license - -authors: - - Tom Occhino - -requires: - - Core/Fx.Morph - - Drag.Move - -provides: [Sortables] - -... -*/ - -var Sortables = new Class({ - - Implements: [Events, Options], - - options: {/* - onSort: function(element, clone){}, - onStart: function(element, clone){}, - onComplete: function(element){},*/ - opacity: 1, - clone: false, - revert: false, - handle: false, - dragOptions: {}, - unDraggableTags: ['button', 'input', 'a', 'textarea', 'select', 'option'] - }, - - initialize: function(lists, options){ - this.setOptions(options); - - this.elements = []; - this.lists = []; - this.idle = true; - - this.addLists($$(document.id(lists) || lists)); - - if (!this.options.clone) this.options.revert = false; - if (this.options.revert) this.effect = new Fx.Morph(null, Object.merge({ - duration: 250, - link: 'cancel' - }, this.options.revert)); - }, - - attach: function(){ - this.addLists(this.lists); - return this; - }, - - detach: function(){ - this.lists = this.removeLists(this.lists); - return this; - }, - - addItems: function(){ - Array.flatten(arguments).each(function(element){ - this.elements.push(element); - var start = element.retrieve('sortables:start', function(event){ - this.start.call(this, event, element); - }.bind(this)); - (this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start); - }, this); - return this; - }, - - addLists: function(){ - Array.flatten(arguments).each(function(list){ - this.lists.include(list); - this.addItems(list.getChildren()); - }, this); - return this; - }, - - removeItems: function(){ - return $$(Array.flatten(arguments).map(function(element){ - this.elements.erase(element); - var start = element.retrieve('sortables:start'); - (this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start); - - return element; - }, this)); - }, - - removeLists: function(){ - return $$(Array.flatten(arguments).map(function(list){ - this.lists.erase(list); - this.removeItems(list.getChildren()); - - return list; - }, this)); - }, - - getDroppableCoordinates: function (element){ - var offsetParent = element.getOffsetParent(); - var position = element.getPosition(offsetParent); - var scroll = { - w: window.getScroll(), - offsetParent: offsetParent.getScroll() - }; - position.x += scroll.offsetParent.x; - position.y += scroll.offsetParent.y; - - if (offsetParent.getStyle('position') == 'fixed'){ - position.x -= scroll.w.x; - position.y -= scroll.w.y; - } - - return position; - }, - - getClone: function(event, element){ - if (!this.options.clone) return new Element(element.tagName).inject(document.body); - if (typeOf(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list); - var clone = element.clone(true).setStyles({ - margin: 0, - position: 'absolute', - visibility: 'hidden', - width: element.getStyle('width') - }).addEvent('mousedown', function(event){ - element.fireEvent('mousedown', event); - }); - //prevent the duplicated radio inputs from unchecking the real one - if (clone.get('html').test('radio')){ - clone.getElements('input[type=radio]').each(function(input, i){ - input.set('name', 'clone_' + i); - if (input.get('checked')) element.getElements('input[type=radio]')[i].set('checked', true); - }); - } - - return clone.inject(this.list).setPosition(this.getDroppableCoordinates(this.element)); - }, - - getDroppables: function(){ - var droppables = this.list.getChildren().erase(this.clone).erase(this.element); - if (!this.options.constrain) droppables.append(this.lists).erase(this.list); - return droppables; - }, - - insert: function(dragging, element){ - var where = 'inside'; - if (this.lists.contains(element)){ - this.list = element; - this.drag.droppables = this.getDroppables(); - } else { - where = this.element.getAllPrevious().contains(element) ? 'before' : 'after'; - } - this.element.inject(element, where); - this.fireEvent('sort', [this.element, this.clone]); - }, - - start: function(event, element){ - if ( - !this.idle || - event.rightClick || - (!this.options.handle && this.options.unDraggableTags.contains(event.target.get('tag'))) - ) return; - - this.idle = false; - this.element = element; - this.opacity = element.getStyle('opacity'); - this.list = element.getParent(); - this.clone = this.getClone(event, element); - - this.drag = new Drag.Move(this.clone, Object.merge({ - - droppables: this.getDroppables() - }, this.options.dragOptions)).addEvents({ - onSnap: function(){ - event.stop(); - this.clone.setStyle('visibility', 'visible'); - this.element.setStyle('opacity', this.options.opacity || 0); - this.fireEvent('start', [this.element, this.clone]); - }.bind(this), - onEnter: this.insert.bind(this), - onCancel: this.end.bind(this), - onComplete: this.end.bind(this) - }); - - this.clone.inject(this.element, 'before'); - this.drag.start(event); - }, - - end: function(){ - this.drag.detach(); - this.element.setStyle('opacity', this.opacity); - var self = this; - if (this.effect){ - var dim = this.element.getStyles('width', 'height'), - clone = this.clone, - pos = clone.computePosition(this.getDroppableCoordinates(clone)); - - var destroy = function(){ - this.removeEvent('cancel', destroy); - clone.destroy(); - self.reset(); - }; - - this.effect.element = clone; - this.effect.start({ - top: pos.top, - left: pos.left, - width: dim.width, - height: dim.height, - opacity: 0.25 - }).addEvent('cancel', destroy).chain(destroy); - } else { - this.clone.destroy(); - self.reset(); - } - - }, - - reset: function(){ - this.idle = true; - this.fireEvent('complete', this.element); - }, - - serialize: function(){ - var params = Array.link(arguments, { - modifier: Type.isFunction, - index: function(obj){ - return obj != null; - } - }); - var serial = this.lists.map(function(list){ - return list.getChildren().map(params.modifier || function(element){ - return element.get('id'); - }, this); - }, this); - - var index = params.index; - if (this.lists.length == 1) index = 0; - return (index || index === 0) && index >= 0 && index < this.lists.length ? serial[index] : serial; - } - -}); - - -/* ---- - -script: Request.Periodical.js - -name: Request.Periodical - -description: Requests the same URL to pull data from a server but increases the intervals if no data is returned to reduce the load - -license: MIT-style license - -authors: - - Christoph Pojer - -requires: - - Core/Request - - MooTools.More - -provides: [Request.Periodical] - -... -*/ - -Request.implement({ - - options: { - initialDelay: 5000, - delay: 5000, - limit: 60000 - }, - - startTimer: function(data){ - var fn = function(){ - if (!this.running) this.send({data: data}); - }; - this.lastDelay = this.options.initialDelay; - this.timer = fn.delay(this.lastDelay, this); - this.completeCheck = function(response){ - clearTimeout(this.timer); - this.lastDelay = (response) ? this.options.delay : (this.lastDelay + this.options.delay).min(this.options.limit); - this.timer = fn.delay(this.lastDelay, this); - }; - return this.addEvent('complete', this.completeCheck); - }, - - stopTimer: function(){ - clearTimeout(this.timer); - return this.removeEvent('complete', this.completeCheck); - } - -}); - - -/* ---- - -script: Color.js - -name: Color - -description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa. - -license: MIT-style license - -authors: - - Valerio Proietti - -requires: - - Core/Array - - Core/String - - Core/Number - - Core/Hash - - Core/Function - - MooTools.More - -provides: [Color] - -... -*/ - -(function(){ - -var Color = this.Color = new Type('Color', function(color, type){ - if (arguments.length >= 3){ - type = 'rgb'; color = Array.slice(arguments, 0, 3); - } else if (typeof color == 'string'){ - if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true); - else if (color.match(/hsb/)) color = color.hsbToRgb(); - else color = color.hexToRgb(true); - } - type = type || 'rgb'; - switch (type){ - case 'hsb': - var old = color; - color = color.hsbToRgb(); - color.hsb = old; - break; - case 'hex': color = color.hexToRgb(true); break; - } - color.rgb = color.slice(0, 3); - color.hsb = color.hsb || color.rgbToHsb(); - color.hex = color.rgbToHex(); - return Object.append(color, this); -}); - -Color.implement({ - - mix: function(){ - var colors = Array.slice(arguments); - var alpha = (typeOf(colors.getLast()) == 'number') ? colors.pop() : 50; - var rgb = this.slice(); - colors.each(function(color){ - color = new Color(color); - for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha)); - }); - return new Color(rgb, 'rgb'); - }, - - invert: function(){ - return new Color(this.map(function(value){ - return 255 - value; - })); - }, - - setHue: function(value){ - return new Color([value, this.hsb[1], this.hsb[2]], 'hsb'); - }, - - setSaturation: function(percent){ - return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb'); - }, - - setBrightness: function(percent){ - return new Color([this.hsb[0], this.hsb[1], percent], 'hsb'); - } - -}); - -this.$RGB = function(r, g, b){ - return new Color([r, g, b], 'rgb'); -}; - -this.$HSB = function(h, s, b){ - return new Color([h, s, b], 'hsb'); -}; - -this.$HEX = function(hex){ - return new Color(hex, 'hex'); -}; - -Array.implement({ - - rgbToHsb: function(){ - var red = this[0], - green = this[1], - blue = this[2], - hue = 0; - var max = Math.max(red, green, blue), - min = Math.min(red, green, blue); - var delta = max - min; - var brightness = max / 255, - saturation = (max != 0) ? delta / max : 0; - if (saturation != 0){ - var rr = (max - red) / delta; - var gr = (max - green) / delta; - var br = (max - blue) / delta; - if (red == max) hue = br - gr; - else if (green == max) hue = 2 + rr - br; - else hue = 4 + gr - rr; - hue /= 6; - if (hue < 0) hue++; - } - return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)]; - }, - - hsbToRgb: function(){ - var br = Math.round(this[2] / 100 * 255); - if (this[1] == 0){ - return [br, br, br]; - } else { - var hue = this[0] % 360; - var f = hue % 60; - var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255); - var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255); - var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255); - switch (Math.floor(hue / 60)){ - case 0: return [br, t, p]; - case 1: return [q, br, p]; - case 2: return [p, br, t]; - case 3: return [p, q, br]; - case 4: return [t, p, br]; - case 5: return [br, p, q]; - } - } - return false; - } - -}); - -String.implement({ - - rgbToHsb: function(){ - var rgb = this.match(/\d{1,3}/g); - return (rgb) ? rgb.rgbToHsb() : null; - }, - - hsbToRgb: function(){ - var hsb = this.match(/\d{1,3}/g); - return (hsb) ? hsb.hsbToRgb() : null; - } - -}); - -})(); - - diff --git a/module/webui/themes/flat/js/static/mootools-more.min.js b/module/webui/themes/flat/js/static/mootools-more.min.js deleted file mode 100644 index ce03a60fd..000000000 --- a/module/webui/themes/flat/js/static/mootools-more.min.js +++ /dev/null @@ -1,226 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/more/c1cc18c2fff04bcc58921b4dff80a6f1 - -packager build: - - packager build More/Form.Request More/Fx.Reveal More/Sortables More/Request.Periodical More/Color - -copyrights: - - [MooTools](http://mootools.net) - -licenses: - - [MIT License](http://mootools.net/license.txt) -... -*/ - -MooTools.More={version:"1.5.0",build:"73db5e24e6e9c5c87b3a27aebef2248053f7db37"};Class.Mutators.Binds=function(a){if(!this.prototype.initialize){this.implement("initialize",function(){}); -}return Array.from(a).concat(this.prototype.Binds||[]);};Class.Mutators.initialize=function(a){return function(){Array.from(this.Binds).each(function(b){var c=this[b]; -if(c){this[b]=c.bind(this);}},this);return a.apply(this,arguments);};};Class.Occlude=new Class({occlude:function(c,b){b=document.id(b||this.element);var a=b.retrieve(c||this.property); -if(a&&!this.occluded){return(this.occluded=a);}this.occluded=false;b.store(c||this.property,this);return this.occluded;}});Class.refactor=function(b,a){Object.each(a,function(e,d){var c=b.prototype[d]; -c=(c&&c.$origin)||c||function(){};b.implement(d,(typeof e=="function")?function(){var f=this.previous;this.previous=c;var g=e.apply(this,arguments);this.previous=f; -return g;}:e);});return b;};(function(){var b=function(e,d){var f=[];Object.each(d,function(g){Object.each(g,function(h){e.each(function(i){f.push(i+"-"+h+(i=="border"?"-width":"")); -});});});return f;};var c=function(f,e){var d=0;Object.each(e,function(h,g){if(g.test(f)){d=d+h.toInt();}});return d;};var a=function(d){return !!(!d||d.offsetHeight||d.offsetWidth); -};Element.implement({measure:function(h){if(a(this)){return h.call(this);}var g=this.getParent(),e=[];while(!a(g)&&g!=document.body){e.push(g.expose()); -g=g.getParent();}var f=this.expose(),d=h.call(this);f();e.each(function(i){i();});return d;},expose:function(){if(this.getStyle("display")!="none"){return function(){}; -}var d=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=d;}.bind(this); -},getDimensions:function(d){d=Object.merge({computeSize:false},d);var i={x:0,y:0};var h=function(j,e){return(e.computeSize)?j.getComputedSize(e):j.getSize(); -};var f=this.getParent("body");if(f&&this.getStyle("display")=="none"){i=this.measure(function(){return h(this,d);});}else{if(f){try{i=h(this,d);}catch(g){}}}return Object.append(i,(i.x||i.x===0)?{width:i.x,height:i.y}:{x:i.width,y:i.height}); -},getComputedSize:function(d){d=Object.merge({styles:["padding","border"],planes:{height:["top","bottom"],width:["left","right"]},mode:"both"},d);var g={},e={width:0,height:0},f; -if(d.mode=="vertical"){delete e.width;delete d.planes.width;}else{if(d.mode=="horizontal"){delete e.height;delete d.planes.height;}}b(d.styles,d.planes).each(function(h){g[h]=this.getStyle(h).toInt(); -},this);Object.each(d.planes,function(i,h){var k=h.capitalize(),j=this.getStyle(h);if(j=="auto"&&!f){f=this.getDimensions();}j=g[h]=(j=="auto")?f[h]:j.toInt(); -e["total"+k]=j;i.each(function(m){var l=c(m,g);e["computed"+m.capitalize()]=l;e["total"+k]+=l;});},this);return Object.append(e,g);}});})();(function(b){var a=Element.Position={options:{relativeTo:document.body,position:{x:"center",y:"center"},offset:{x:0,y:0}},getOptions:function(d,c){c=Object.merge({},a.options,c); -a.setPositionOption(c);a.setEdgeOption(c);a.setOffsetOption(d,c);a.setDimensionsOption(d,c);return c;},setPositionOption:function(c){c.position=a.getCoordinateFromValue(c.position); -},setEdgeOption:function(d){var c=a.getCoordinateFromValue(d.edge);d.edge=c?c:(d.position.x=="center"&&d.position.y=="center")?{x:"center",y:"center"}:{x:"left",y:"top"}; -},setOffsetOption:function(f,d){var c={x:0,y:0};var e={x:0,y:0};var g=f.measure(function(){return document.id(this.getOffsetParent());});if(!g||g==f.getDocument().body){return; -}e=g.getScroll();c=g.measure(function(){var i=this.getPosition();if(this.getStyle("position")=="fixed"){var h=window.getScroll();i.x+=h.x;i.y+=h.y;}return i; -});d.offset={parentPositioned:g!=document.id(d.relativeTo),x:d.offset.x-c.x+e.x,y:d.offset.y-c.y+e.y};},setDimensionsOption:function(d,c){c.dimensions=d.getDimensions({computeSize:true,styles:["padding","border","margin"]}); -},getPosition:function(e,d){var c={};d=a.getOptions(e,d);var f=document.id(d.relativeTo)||document.body;a.setPositionCoordinates(d,c,f);if(d.edge){a.toEdge(c,d); -}var g=d.offset;c.left=((c.x>=0||g.parentPositioned||d.allowNegative)?c.x:0).toInt();c.top=((c.y>=0||g.parentPositioned||d.allowNegative)?c.y:0).toInt(); -a.toMinMax(c,d);if(d.relFixedPosition||f.getStyle("position")=="fixed"){a.toRelFixedPosition(f,c);}if(d.ignoreScroll){a.toIgnoreScroll(f,c);}if(d.ignoreMargins){a.toIgnoreMargins(c,d); -}c.left=Math.ceil(c.left);c.top=Math.ceil(c.top);delete c.x;delete c.y;return c;},setPositionCoordinates:function(k,g,d){var f=k.offset.y,h=k.offset.x,e=(d==document.body)?window.getScroll():d.getPosition(),j=e.y,c=e.x,i=window.getSize(); -switch(k.position.x){case"left":g.x=c+h;break;case"right":g.x=c+h+d.offsetWidth;break;default:g.x=c+((d==document.body?i.x:d.offsetWidth)/2)+h;break;}switch(k.position.y){case"top":g.y=j+f; -break;case"bottom":g.y=j+f+d.offsetHeight;break;default:g.y=j+((d==document.body?i.y:d.offsetHeight)/2)+f;break;}},toMinMax:function(c,d){var f={left:"x",top:"y"},e; -["minimum","maximum"].each(function(g){["left","top"].each(function(h){e=d[g]?d[g][f[h]]:null;if(e!=null&&((g=="minimum")?c[h]e)){c[h]=e;}});}); -},toRelFixedPosition:function(e,c){var d=window.getScroll();c.top+=d.y;c.left+=d.x;},toIgnoreScroll:function(e,d){var c=e.getScroll();d.top-=c.y;d.left-=c.x; -},toIgnoreMargins:function(c,d){c.left+=d.edge.x=="right"?d.dimensions["margin-right"]:(d.edge.x!="center"?-d.dimensions["margin-left"]:-d.dimensions["margin-left"]+((d.dimensions["margin-right"]+d.dimensions["margin-left"])/2)); -c.top+=d.edge.y=="bottom"?d.dimensions["margin-bottom"]:(d.edge.y!="center"?-d.dimensions["margin-top"]:-d.dimensions["margin-top"]+((d.dimensions["margin-bottom"]+d.dimensions["margin-top"])/2)); -},toEdge:function(c,d){var e={},g=d.dimensions,f=d.edge;switch(f.x){case"left":e.x=0;break;case"right":e.x=-g.x-g.computedRight-g.computedLeft;break;default:e.x=-(Math.round(g.totalWidth/2)); -break;}switch(f.y){case"top":e.y=0;break;case"bottom":e.y=-g.y-g.computedTop-g.computedBottom;break;default:e.y=-(Math.round(g.totalHeight/2));break;}c.x+=e.x; -c.y+=e.y;},getCoordinateFromValue:function(c){if(typeOf(c)!="string"){return c;}c=c.toLowerCase();return{x:c.test("left")?"left":(c.test("right")?"right":"center"),y:c.test(/upper|top/)?"top":(c.test("bottom")?"bottom":"center")}; -}};Element.implement({position:function(d){if(d&&(d.x!=null||d.y!=null)){return(b?b.apply(this,arguments):this);}var c=this.setStyle("position","absolute").calculatePosition(d); -return(d&&d.returnPos)?c:this.setStyles(c);},calculatePosition:function(c){return a.getPosition(this,c);}});})(Element.prototype.position);(function(){var a=false; -this.IframeShim=new Class({Implements:[Options,Events,Class.Occlude],options:{className:"iframeShim",src:'javascript:false;document.write("");',display:false,zIndex:null,margin:0,offset:{x:0,y:0},browsers:a},property:"IframeShim",initialize:function(c,b){this.element=document.id(c); -if(this.occlude()){return this.occluded;}this.setOptions(b);this.makeShim();return this;},makeShim:function(){if(this.options.browsers){var d=this.element.getStyle("zIndex").toInt(); -if(!d){d=1;var c=this.element.getStyle("position");if(c=="static"||!c){this.element.setStyle("position","relative");}this.element.setStyle("zIndex",d); -}d=((this.options.zIndex!=null||this.options.zIndex===0)&&d>this.options.zIndex)?this.options.zIndex:d-1;if(d<0){d=1;}this.shim=new Element("iframe",{src:this.options.src,scrolling:"no",frameborder:0,styles:{zIndex:d,position:"absolute",border:"none",filter:"progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"},"class":this.options.className}).store("IframeShim",this); -var b=(function(){this.shim.inject(this.element,"after");this[this.options.display?"show":"hide"]();this.fireEvent("inject");}).bind(this);if(!IframeShim.ready){window.addEvent("load",b); -}else{b();}}else{this.position=this.hide=this.show=this.dispose=Function.from(this);}},position:function(){if(!IframeShim.ready||!this.shim){return this; -}var b=this.element.measure(function(){return this.getSize();});if(this.options.margin!=undefined){b.x=b.x-(this.options.margin*2);b.y=b.y-(this.options.margin*2); -this.options.offset.x+=this.options.margin;this.options.offset.y+=this.options.margin;}this.shim.set({width:b.x,height:b.y}).position({relativeTo:this.element,offset:this.options.offset}); -return this;},hide:function(){if(this.shim){this.shim.setStyle("display","none");}return this;},show:function(){if(this.shim){this.shim.setStyle("display","block"); -}return this.position();},dispose:function(){if(this.shim){this.shim.dispose();}return this;},destroy:function(){if(this.shim){this.shim.destroy();}return this; -}});})();window.addEvent("load",function(){IframeShim.ready=true;});var Mask=new Class({Implements:[Options,Events],Binds:["position"],options:{style:{},"class":"mask",maskMargins:false,useIframeShim:true,iframeShimOptions:{}},initialize:function(b,a){this.target=document.id(b)||document.id(document.body); -this.target.store("mask",this);this.setOptions(a);this.render();this.inject();},render:function(){this.element=new Element("div",{"class":this.options["class"],id:this.options.id||"mask-"+String.uniqueID(),styles:Object.merge({},this.options.style,{display:"none"}),events:{click:function(a){this.fireEvent("click",a); -if(this.options.hideOnClick){this.hide();}}.bind(this)}});this.hidden=true;},toElement:function(){return this.element;},inject:function(b,a){a=a||(this.options.inject?this.options.inject.where:"")||(this.target==document.body?"inside":"after"); -b=b||(this.options.inject&&this.options.inject.target)||this.target;this.element.inject(b,a);if(this.options.useIframeShim){this.shim=new IframeShim(this.element,this.options.iframeShimOptions); -this.addEvents({show:this.shim.show.bind(this.shim),hide:this.shim.hide.bind(this.shim),destroy:this.shim.destroy.bind(this.shim)});}},position:function(){this.resize(this.options.width,this.options.height); -this.element.position({relativeTo:this.target,position:"topLeft",ignoreMargins:!this.options.maskMargins,ignoreScroll:this.target==document.body});return this; -},resize:function(a,e){var b={styles:["padding","border"]};if(this.options.maskMargins){b.styles.push("margin");}var d=this.target.getComputedSize(b);if(this.target==document.body){this.element.setStyles({width:0,height:0}); -var c=window.getScrollSize();if(d.totalHeight0&&b>0)?true:this.style.display!="none";},toggle:function(){return this[this.isDisplayed()?"hide":"show"](); -},hide:function(){var b;try{b=this.getStyle("display");}catch(a){}if(b=="none"){return this;}return this.store("element:_originalDisplay",b||"").setStyle("display","none"); -},show:function(a){if(!a&&this.isDisplayed()){return this;}a=a||this.retrieve("element:_originalDisplay")||"block";return this.setStyle("display",(a=="none")?"block":a); -},swapClass:function(a,b){return this.removeClass(a).addClass(b);}});Document.implement({clearSelection:function(){if(window.getSelection){var a=window.getSelection(); -if(a&&a.removeAllRanges){a.removeAllRanges();}}else{if(document.selection&&document.selection.empty){try{document.selection.empty();}catch(b){}}}}});(function(){var a=function(d){var b=d.options.hideInputs; -if(window.OverText){var c=[null];OverText.each(function(e){c.include("."+e.options.labelClass);});if(c){b+=c.join(", ");}}return(b)?d.element.getElements(b):null; -};Fx.Reveal=new Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:"opacity" in document.documentElement,mode:"vertical",display:function(){return this.element.get("tag")!="tr"?"block":"table-row"; -},opacity:1,hideInputs:!("opacity" in document.documentElement)?"select, input, textarea, object, embed":null},dissolve:function(){if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true; -this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); -if(this.options.transitionOpacity){d.opacity=this.options.opacity;}var c={};Object.each(d,function(f,e){c[e]=[f,0];});this.element.setStyles({display:Function.from(this.options.display).call(this),overflow:"hidden"}); -var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){if(this.hidden){this.hiding=false;this.element.style.cssText=this.cssText; -this.element.setStyle("display","none");if(b){b.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);this.callChain();}.bind(this));this.start(c); -}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this)); -}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();this.dissolve();}}}return this;},reveal:function(){if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"){this.hiding=false; -this.showing=true;this.hidden=false;this.cssText=this.element.style.cssText;var d;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); -}.bind(this));if(this.options.heightOverride!=null){d.height=this.options.heightOverride.toInt();}if(this.options.widthOverride!=null){d.width=this.options.widthOverride.toInt(); -}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=this.options.opacity;}var c={height:0,display:Function.from(this.options.display).call(this)}; -Object.each(d,function(f,e){c[e]=0;});c.overflow="hidden";this.element.setStyles(c);var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){this.element.style.cssText=this.cssText; -this.element.setStyle("display",Function.from(this.options.display).call(this));if(!this.hidden){this.showing=false;}if(b){b.setStyle("visibility","visible"); -}this.callChain();this.fireEvent("show",this.element);}.bind(this));this.start(d);}else{this.callChain();this.fireEvent("complete",this.element);this.fireEvent("show",this.element); -}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();this.reveal(); -}}}return this;},toggle:function(){if(this.element.getStyle("display")=="none"){this.reveal();}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments); -if(this.cssText!=null){this.element.style.cssText=this.cssText;}this.hiding=false;this.showing=false;return this;}});Element.Properties.reveal={set:function(b){this.get("reveal").cancel().setOptions(b); -return this;},get:function(){var b=this.retrieve("reveal");if(!b){b=new Fx.Reveal(this);this.store("reveal",b);}return b;}};Element.Properties.dissolve=Element.Properties.reveal; -Element.implement({reveal:function(b){this.get("reveal").setOptions(b).reveal();return this;},dissolve:function(b){this.get("reveal").setOptions(b).dissolve(); -return this;},nix:function(b){var c=Array.link(arguments,{destroy:Type.isBoolean,options:Type.isObject});this.get("reveal").setOptions(b).dissolve().chain(function(){this[c.destroy?"destroy":"dispose"](); -}.bind(this));return this;},wink:function(){var c=Array.link(arguments,{duration:Type.isNumber,options:Type.isObject});var b=this.get("reveal").setOptions(c.options); -b.reveal().chain(function(){(function(){b.dissolve();}).delay(c.duration||2000);});}});})();var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var b=Array.link(arguments,{options:Type.isObject,element:function(c){return c!=null; -}});this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var a=typeOf(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element; -this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection="selectstart" in document?"selectstart":"mousedown";if("ondragstart" in document&&!("FileReader" in window)&&!Drag.ondragstartFixed){document.ondragstart=Function.from(false); -Drag.ondragstartFixed=true;}this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:Function.from(false)}; -this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start); -return this;},start:function(a){var j=this.options;if(a.rightClick){return;}if(j.preventDefault){a.preventDefault();}if(j.stopPropagation){a.stopPropagation(); -}this.mouse.start=a.page;this.fireEvent("beforeStart",this.element);var c=j.limit;this.limit={x:[],y:[]};var e,g;for(e in j.modifiers){if(!j.modifiers[e]){continue; -}var b=this.element.getStyle(j.modifiers[e]);if(b&&!b.match(/px$/)){if(!g){g=this.element.getCoordinates(this.element.getOffsetParent());}b=g[j.modifiers[e]]; -}if(j.style){this.value.now[e]=(b||0).toInt();}else{this.value.now[e]=this.element[j.modifiers[e]];}if(j.invert){this.value.now[e]*=-1;}this.mouse.pos[e]=a.page[e]-this.value.now[e]; -if(c&&c[e]){var d=2;while(d--){var f=c[e][d];if(f||f===0){this.limit[e][d]=(typeof f=="function")?f():f;}}}}if(typeOf(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid}; -}var h={mousemove:this.bound.check,mouseup:this.bound.cancel};h[this.selection]=this.bound.eventStop;this.document.addEvents(h);},check:function(a){if(this.options.preventDefault){a.preventDefault(); -}var b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop}); -this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element);}},drag:function(b){var a=this.options;if(a.preventDefault){b.preventDefault(); -}this.mouse.now=b.page;for(var c in a.modifiers){if(!a.modifiers[c]){continue;}this.value.now[c]=this.mouse.now[c]-this.mouse.pos[c];if(a.invert){this.value.now[c]*=-1; -}if(a.limit&&this.limit[c]){if((this.limit[c][1]||this.limit[c][1]===0)&&(this.value.now[c]>this.limit[c][1])){this.value.now[c]=this.limit[c][1];}else{if((this.limit[c][0]||this.limit[c][0]===0)&&(this.value.now[c]d.left&&b.xd.top);},this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed]); -}if(a){this.fireEvent("enter",[this.element,a]);}this.overed=a;}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables(); -}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return this.parent(a);}});Element.implement({makeDraggable:function(a){var b=new Drag.Move(this,a); -this.store("dragger",b);return b;}});var Sortables=new Class({Implements:[Events,Options],options:{opacity:1,clone:false,revert:false,handle:false,dragOptions:{},unDraggableTags:["button","input","a","textarea","select","option"]},initialize:function(a,b){this.setOptions(b); -this.elements=[];this.lists=[];this.idle=true;this.addLists($$(document.id(a)||a));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new Fx.Morph(null,Object.merge({duration:250,link:"cancel"},this.options.revert)); -}},attach:function(){this.addLists(this.lists);return this;},detach:function(){this.lists=this.removeLists(this.lists);return this;},addItems:function(){Array.flatten(arguments).each(function(a){this.elements.push(a); -var b=a.retrieve("sortables:start",function(c){this.start.call(this,c,a);}.bind(this));(this.options.handle?a.getElement(this.options.handle)||a:a).addEvent("mousedown",b); -},this);return this;},addLists:function(){Array.flatten(arguments).each(function(a){this.lists.include(a);this.addItems(a.getChildren());},this);return this; -},removeItems:function(){return $$(Array.flatten(arguments).map(function(a){this.elements.erase(a);var b=a.retrieve("sortables:start");(this.options.handle?a.getElement(this.options.handle)||a:a).removeEvent("mousedown",b); -return a;},this));},removeLists:function(){return $$(Array.flatten(arguments).map(function(a){this.lists.erase(a);this.removeItems(a.getChildren());return a; -},this));},getDroppableCoordinates:function(c){var d=c.getOffsetParent();var b=c.getPosition(d);var a={w:window.getScroll(),offsetParent:d.getScroll()}; -b.x+=a.offsetParent.x;b.y+=a.offsetParent.y;if(d.getStyle("position")=="fixed"){b.x-=a.w.x;b.y-=a.w.y;}return b;},getClone:function(b,a){if(!this.options.clone){return new Element(a.tagName).inject(document.body); -}if(typeOf(this.options.clone)=="function"){return this.options.clone.call(this,b,a,this.list);}var c=a.clone(true).setStyles({margin:0,position:"absolute",visibility:"hidden",width:a.getStyle("width")}).addEvent("mousedown",function(d){a.fireEvent("mousedown",d); -});if(c.get("html").test("radio")){c.getElements("input[type=radio]").each(function(d,e){d.set("name","clone_"+e);if(d.get("checked")){a.getElements("input[type=radio]")[e].set("checked",true); -}});}return c.inject(this.list).setPosition(this.getDroppableCoordinates(this.element));},getDroppables:function(){var a=this.list.getChildren().erase(this.clone).erase(this.element); -if(!this.options.constrain){a.append(this.lists).erase(this.list);}return a;},insert:function(c,b){var a="inside";if(this.lists.contains(b)){this.list=b; -this.drag.droppables=this.getDroppables();}else{a=this.element.getAllPrevious().contains(b)?"before":"after";}this.element.inject(b,a);this.fireEvent("sort",[this.element,this.clone]); -},start:function(b,a){if(!this.idle||b.rightClick||(!this.options.handle&&this.options.unDraggableTags.contains(b.target.get("tag")))){return;}this.idle=false; -this.element=a;this.opacity=a.getStyle("opacity");this.list=a.getParent();this.clone=this.getClone(b,a);this.drag=new Drag.Move(this.clone,Object.merge({droppables:this.getDroppables()},this.options.dragOptions)).addEvents({onSnap:function(){b.stop(); -this.clone.setStyle("visibility","visible");this.element.setStyle("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]); -}.bind(this),onEnter:this.insert.bind(this),onCancel:this.end.bind(this),onComplete:this.end.bind(this)});this.clone.inject(this.element,"before");this.drag.start(b); -},end:function(){this.drag.detach();this.element.setStyle("opacity",this.opacity);var a=this;if(this.effect){var c=this.element.getStyles("width","height"),e=this.clone,d=e.computePosition(this.getDroppableCoordinates(e)); -var b=function(){this.removeEvent("cancel",b);e.destroy();a.reset();};this.effect.element=e;this.effect.start({top:d.top,left:d.left,width:c.width,height:c.height,opacity:0.25}).addEvent("cancel",b).chain(b); -}else{this.clone.destroy();a.reset();}},reset:function(){this.idle=true;this.fireEvent("complete",this.element);},serialize:function(){var c=Array.link(arguments,{modifier:Type.isFunction,index:function(d){return d!=null; -}});var b=this.lists.map(function(d){return d.getChildren().map(c.modifier||function(e){return e.get("id");},this);},this);var a=c.index;if(this.lists.length==1){a=0; -}return(a||a===0)&&a>=0&&a=3){d="rgb";c=Array.slice(arguments,0,3);}else{if(typeof c=="string"){if(c.match(/rgb/)){c=c.rgbToHex().hexToRgb(true); -}else{if(c.match(/hsb/)){c=c.hsbToRgb();}else{c=c.hexToRgb(true);}}}}d=d||"rgb";switch(d){case"hsb":var b=c;c=c.hsbToRgb();c.hsb=b;break;case"hex":c=c.hexToRgb(true); -break;}c.rgb=c.slice(0,3);c.hsb=c.hsb||c.rgbToHsb();c.hex=c.rgbToHex();return Object.append(c,this);});a.implement({mix:function(){var b=Array.slice(arguments); -var d=(typeOf(b.getLast())=="number")?b.pop():50;var c=this.slice();b.each(function(e){e=new a(e);for(var f=0;f<3;f++){c[f]=Math.round((c[f]/100*(100-d))+(e[f]/100*d)); -}});return new a(c,"rgb");},invert:function(){return new a(this.map(function(b){return 255-b;}));},setHue:function(b){return new a([b,this.hsb[1],this.hsb[2]],"hsb"); -},setSaturation:function(b){return new a([this.hsb[0],b,this.hsb[2]],"hsb");},setBrightness:function(b){return new a([this.hsb[0],this.hsb[1],b],"hsb"); -}});this.$RGB=function(e,d,c){return new a([e,d,c],"rgb");};this.$HSB=function(e,d,c){return new a([e,d,c],"hsb");};this.$HEX=function(b){return new a(b,"hex"); -};Array.implement({rgbToHsb:function(){var c=this[0],d=this[1],k=this[2],h=0;var j=Math.max(c,d,k),f=Math.min(c,d,k);var l=j-f;var i=j/255,g=(j!=0)?l/j:0; -if(g!=0){var e=(j-c)/l;var b=(j-d)/l;var m=(j-k)/l;if(c==j){h=m-b;}else{if(d==j){h=2+e-m;}else{h=4+b-e;}}h/=6;if(h<0){h++;}}return[Math.round(h*360),Math.round(g*100),Math.round(i*100)]; -},hsbToRgb:function(){var d=Math.round(this[2]/100*255);if(this[1]==0){return[d,d,d];}else{var b=this[0]%360;var g=b%60;var h=Math.round((this[2]*(100-this[1]))/10000*255); -var e=Math.round((this[2]*(6000-this[1]*g))/600000*255);var c=Math.round((this[2]*(6000-this[1]*(60-g)))/600000*255);switch(Math.floor(b/60)){case 0:return[d,c,h]; -case 1:return[e,d,h];case 2:return[h,d,c];case 3:return[h,e,d];case 4:return[c,h,d];case 5:return[d,h,e];}}return false;}});String.implement({rgbToHsb:function(){var b=this.match(/\d{1,3}/g); -return(b)?b.rgbToHsb():null;},hsbToRgb:function(){var b=this.match(/\d{1,3}/g);return(b)?b.hsbToRgb():null;}});})(); \ No newline at end of file diff --git a/module/webui/themes/flat/js/static/purr.js b/module/webui/themes/flat/js/static/purr.js deleted file mode 100644 index 9cbc503d9..000000000 --- a/module/webui/themes/flat/js/static/purr.js +++ /dev/null @@ -1,309 +0,0 @@ -/* ---- -script: purr.js - -description: Class to create growl-style popup notifications. - -license: MIT-style - -authors: [atom smith] - -requires: -- core/1.3: [Core, Browser, Array, Function, Number, String, Hash, Event, Class.Extras, Element.Event, Element.Style, Element.Dimensions, Fx.CSS, FX.Tween, Fx.Morph] - -provides: [Purr, Element.alert] -... -*/ - - -var Purr = new Class({ - - 'options': { - 'mode': 'top', - 'position': 'left', - 'elementAlertClass': 'purr-element-alert', - 'elements': { - 'wrapper': 'div', - 'alert': 'div', - 'buttonWrapper': 'div', - 'button': 'button' - }, - 'elementOptions': { - 'wrapper': { - 'styles': { - 'position': 'fixed', - 'z-index': '9999' - }, - 'class': 'purr-wrapper' - }, - 'alert': { - 'class': 'purr-alert', - 'styles': { - 'opacity': '.85' - } - }, - 'buttonWrapper': { - 'class': 'purr-button-wrapper' - }, - 'button': { - 'class': 'purr-button' - } - }, - 'alert': { - 'buttons': [], - 'clickDismiss': true, - 'hoverWait': true, - 'hideAfter': 5000, - 'fx': { - 'duration': 500 - }, - 'highlight': false, - 'highlightRepeat': false, - 'highlight': { - 'start': '#FF0', - 'end': false - } - } - }, - - 'Implements': [Options, Events, Chain], - - 'initialize': function(options){ - this.setOptions(options); - this.createWrapper(); - return this; - }, - - 'bindAlert': function(){ - return this.alert.bind(this); - }, - - 'createWrapper': function(){ - this.wrapper = new Element(this.options.elements.wrapper, this.options.elementOptions.wrapper); - if(this.options.mode == 'top') - { - this.wrapper.setStyle('top', 0); - } - else - { - this.wrapper.setStyle('bottom', 0); - } - document.id(document.body).grab(this.wrapper); - this.positionWrapper(this.options.position); - }, - - 'positionWrapper': function(position){ - if(typeOf(position) == 'object') - { - - var wrapperCoords = this.getWrapperCoords(); - - this.wrapper.setStyles({ - 'bottom': '', - 'left': position.x, - 'top': position.y - wrapperCoords.height, - 'position': 'absolute' - }); - } - else if(position == 'left') - { - this.wrapper.setStyle('left', 0); - } - else if(position == 'right') - { - this.wrapper.setStyle('right', 0); - } - else - { - this.wrapper.setStyle('left', (window.innerWidth / 2) - (this.getWrapperCoords().width / 2)); - } - return this; - }, - - 'getWrapperCoords': function(){ - this.wrapper.setStyle('visibility', 'hidden'); - var measurer = this.alert('need something in here to measure'); - var coords = this.wrapper.getCoordinates(); - measurer.destroy(); - this.wrapper.setStyle('visibility',''); - return coords; - }, - - 'alert': function(msg, options){ - - options = Object.merge({}, this.options.alert, options || {}); - - var alert = new Element(this.options.elements.alert, this.options.elementOptions.alert); - - if(typeOf(msg) == 'string') - { - alert.set('html', msg); - } - else if(typeOf(msg) == 'element') - { - alert.grab(msg); - } - else if(typeOf(msg) == 'array') - { - var alerts = []; - msg.each(function(m){ - alerts.push(this.alert(m, options)); - }, this); - return alerts; - } - - alert.store('options', options); - - if(options.buttons.length > 0) - { - options.clickDismiss = false; - options.hideAfter = false; - options.hoverWait = false; - var buttonWrapper = new Element(this.options.elements.buttonWrapper, this.options.elementOptions.buttonWrapper); - alert.grab(buttonWrapper); - options.buttons.each(function(button){ - if(button.text != undefined) - { - var callbackButton = new Element(this.options.elements.button, this.options.elementOptions.button); - callbackButton.set('html', button.text); - if(button.callback != undefined) - { - callbackButton.addEvent('click', button.callback.pass(alert)); - } - if(button.dismiss != undefined && button.dismiss) - { - callbackButton.addEvent('click', this.dismiss.pass(alert, this)); - } - buttonWrapper.grab(callbackButton); - } - }, this); - } - if(options.className != undefined) - { - alert.addClass(options.className); - } - - this.wrapper.grab(alert, (this.options.mode == 'top') ? 'bottom' : 'top'); - - var fx = Object.merge(this.options.alert.fx, options.fx); - var alertFx = new Fx.Morph(alert, fx); - alert.store('fx', alertFx); - this.fadeIn(alert); - - if(options.highlight) - { - alertFx.addEvent('complete', function(){ - alert.highlight(options.highlight.start, options.highlight.end); - if(options.highlightRepeat) - { - alert.highlight.periodical(options.highlightRepeat, alert, [options.highlight.start, options.highlight.end]); - } - }); - } - if(options.hideAfter) - { - this.dismiss(alert); - } - - if(options.clickDismiss) - { - alert.addEvent('click', function(){ - this.holdUp = false; - this.dismiss(alert, true); - }.bind(this)); - } - - if(options.hoverWait) - { - alert.addEvents({ - 'mouseenter': function(){ - this.holdUp = true; - }.bind(this), - 'mouseleave': function(){ - this.holdUp = false; - }.bind(this) - }); - } - - return alert; - }, - - 'fadeIn': function(alert){ - var alertFx = alert.retrieve('fx'); - alertFx.set({ - 'opacity': 0 - }); - alertFx.start({ - 'opacity': [this.options.elementOptions.alert.styles.opacity, .9].pick(), - }); - }, - - 'dismiss': function(alert, now){ - now = now || false; - var options = alert.retrieve('options'); - if(now) - { - this.fadeOut(alert); - } - else - { - this.fadeOut.delay(options.hideAfter, this, alert); - } - }, - - 'fadeOut': function(alert){ - if(this.holdUp) - { - this.dismiss.delay(100, this, [alert, true]) - return null; - } - var alertFx = alert.retrieve('fx'); - if(!alertFx) - { - return null; - } - var to = { - 'opacity': 0 - } - if(this.options.mode == 'top') - { - to['margin-top'] = '-'+alert.offsetHeight+'px'; - } - else - { - to['margin-bottom'] = '-'+alert.offsetHeight+'px'; - } - alertFx.start(to); - alertFx.addEvent('complete', function(){ - alert.destroy(); - }); - } -}); - -Element.implement({ - - 'alert': function(msg, options){ - var alert = this.retrieve('alert'); - if(!alert) - { - options = options || { - 'mode':'top' - }; - alert = new Purr(options) - this.store('alert', alert); - } - - var coords = this.getCoordinates(); - - alert.alert(msg, options); - - alert.wrapper.setStyles({ - 'bottom': '', - 'left': (coords.left - (alert.wrapper.getWidth() / 2)) + (this.getWidth() / 2), - 'top': coords.top - (alert.wrapper.getHeight()), - 'position': 'absolute' - }); - - } - -}); \ No newline at end of file diff --git a/module/webui/themes/flat/js/static/purr.min.js b/module/webui/themes/flat/js/static/purr.min.js deleted file mode 100644 index bf70e357d..000000000 --- a/module/webui/themes/flat/js/static/purr.min.js +++ /dev/null @@ -1 +0,0 @@ -var Purr=new Class({options:{mode:"top",position:"left",elementAlertClass:"purr-element-alert",elements:{wrapper:"div",alert:"div",buttonWrapper:"div",button:"button"},elementOptions:{wrapper:{styles:{position:"fixed","z-index":"9999"},"class":"purr-wrapper"},alert:{"class":"purr-alert",styles:{opacity:".85"}},buttonWrapper:{"class":"purr-button-wrapper"},button:{"class":"purr-button"}},alert:{buttons:[],clickDismiss:!0,hoverWait:!0,hideAfter:5e3,fx:{duration:500},highlight:!1,highlightRepeat:!1,highlight:{start:"#FF0",end:!1}}},Implements:[Options,Events,Chain],initialize:function(t){return this.setOptions(t),this.createWrapper(),this},bindAlert:function(){return this.alert.bind(this)},createWrapper:function(){this.wrapper=new Element(this.options.elements.wrapper,this.options.elementOptions.wrapper),"top"==this.options.mode?this.wrapper.setStyle("top",0):this.wrapper.setStyle("bottom",0),document.id(document.body).grab(this.wrapper),this.positionWrapper(this.options.position)},positionWrapper:function(t){if("object"==typeOf(t)){var e=this.getWrapperCoords();this.wrapper.setStyles({bottom:"",left:t.x,top:t.y-e.height,position:"absolute"})}else"left"==t?this.wrapper.setStyle("left",0):"right"==t?this.wrapper.setStyle("right",0):this.wrapper.setStyle("left",window.innerWidth/2-this.getWrapperCoords().width/2);return this},getWrapperCoords:function(){this.wrapper.setStyle("visibility","hidden");var t=this.alert("need something in here to measure"),e=this.wrapper.getCoordinates();return t.destroy(),this.wrapper.setStyle("visibility",""),e},alert:function(t,e){e=Object.merge({},this.options.alert,e||{});var i=new Element(this.options.elements.alert,this.options.elementOptions.alert);if("string"==typeOf(t))i.set("html",t);else if("element"==typeOf(t))i.grab(t);else if("array"==typeOf(t)){var s=[];return t.each(function(t){s.push(this.alert(t,e))},this),s}if(i.store("options",e),e.buttons.length>0){e.clickDismiss=!1,e.hideAfter=!1,e.hoverWait=!1;var r=new Element(this.options.elements.buttonWrapper,this.options.elementOptions.buttonWrapper);i.grab(r),e.buttons.each(function(t){if(void 0!=t.text){var e=new Element(this.options.elements.button,this.options.elementOptions.button);e.set("html",t.text),void 0!=t.callback&&e.addEvent("click",t.callback.pass(i)),void 0!=t.dismiss&&t.dismiss&&e.addEvent("click",this.dismiss.pass(i,this)),r.grab(e)}},this)}void 0!=e.className&&i.addClass(e.className),this.wrapper.grab(i,"top"==this.options.mode?"bottom":"top");var o=Object.merge(this.options.alert.fx,e.fx),n=new Fx.Morph(i,o);return i.store("fx",n),this.fadeIn(i),e.highlight&&n.addEvent("complete",function(){i.highlight(e.highlight.start,e.highlight.end),e.highlightRepeat&&i.highlight.periodical(e.highlightRepeat,i,[e.highlight.start,e.highlight.end])}),e.hideAfter&&this.dismiss(i),e.clickDismiss&&i.addEvent("click",function(){this.holdUp=!1,this.dismiss(i,!0)}.bind(this)),e.hoverWait&&i.addEvents({mouseenter:function(){this.holdUp=!0}.bind(this),mouseleave:function(){this.holdUp=!1}.bind(this)}),i},fadeIn:function(t){var e=t.retrieve("fx");e.set({opacity:0}),e.start({opacity:[this.options.elementOptions.alert.styles.opacity,.9].pick()})},dismiss:function(t,e){e=e||!1;var i=t.retrieve("options");e?this.fadeOut(t):this.fadeOut.delay(i.hideAfter,this,t)},fadeOut:function(t){if(this.holdUp)return this.dismiss.delay(100,this,[t,!0]),null;var e=t.retrieve("fx");if(!e)return null;var i={opacity:0};"top"==this.options.mode?i["margin-top"]="-"+t.offsetHeight+"px":i["margin-bottom"]="-"+t.offsetHeight+"px",e.start(i),e.addEvent("complete",function(){t.destroy()})}});Element.implement({alert:function(t,e){var i=this.retrieve("alert");i||(e=e||{mode:"top"},i=new Purr(e),this.store("alert",i));var s=this.getCoordinates();i.alert(t,e),i.wrapper.setStyles({bottom:"",left:s.left-i.wrapper.getWidth()/2+this.getWidth()/2,top:s.top-i.wrapper.getHeight(),position:"absolute"})}}); \ No newline at end of file diff --git a/module/webui/themes/flat/js/static/tinytab.js b/module/webui/themes/flat/js/static/tinytab.js deleted file mode 100644 index de50279fc..000000000 --- a/module/webui/themes/flat/js/static/tinytab.js +++ /dev/null @@ -1,43 +0,0 @@ -/* ---- -description: TinyTab - Tiny and simple tab handler for Mootools. - -license: MIT-style - -authors: -- Danillo César de O. Melo - -requires: -- core/1.2.4: '*' - -provides: TinyTab - -... -*/ -(function($) { - this.TinyTab = new Class({ - Implements: Events, - initialize: function(tabs, contents, opt) { - this.tabs = tabs; - this.contents = contents; - if(!opt) opt = {}; - this.css = opt.selectedClass || 'selected'; - this.select(this.tabs[0]); - tabs.each(function(el){ - el.addEvent('click',function(e){ - this.select(el); - e.stop(); - }.bind(this)); - }.bind(this)); - }, - - select: function(el) { - this.tabs.removeClass(this.css); - el.addClass(this.css); - this.contents.setStyle('display','none'); - var content = this.contents[this.tabs.indexOf(el)]; - content.setStyle('display','block'); - this.fireEvent('change',[content,el]); - } - }); -})(document.id); \ No newline at end of file diff --git a/module/webui/themes/flat/js/static/tinytab.min.js b/module/webui/themes/flat/js/static/tinytab.min.js deleted file mode 100644 index 2f4fa0436..000000000 --- a/module/webui/themes/flat/js/static/tinytab.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){this.TinyTab=new Class({Implements:Events,initialize:function(s,t,e){this.tabs=s,this.contents=t,e||(e={}),this.css=e.selectedClass||"selected",this.select(this.tabs[0]),s.each(function(s){s.addEvent("click",function(t){this.select(s),t.stop()}.bind(this))}.bind(this))},select:function(s){this.tabs.removeClass(this.css),s.addClass(this.css),this.contents.setStyle("display","none");var t=this.contents[this.tabs.indexOf(s)];t.setStyle("display","block"),this.fireEvent("change",[t,s])}})}(document.id); \ No newline at end of file diff --git a/module/webui/themes/flat/tml/admin.html b/module/webui/themes/flat/tml/admin.html deleted file mode 100644 index c7bdd7894..000000000 --- a/module/webui/themes/flat/tml/admin.html +++ /dev/null @@ -1,98 +0,0 @@ -{% extends '/flat/tml/base.html' %} - -{% block head %} - -{% endblock %} - - -{% block title %}{{ _("Administrate") }} - {{ super() }} {% endblock %} -{% block subtitle %}{{ _("Administrate") }}{% endblock %} - -{% block content %} - - {{_("Quit pyLoad")}} | - {{_("Restart pyLoad")}} -
        -
        - - {{ _("To add user or change passwords use:") }} python pyload.py -u
        - {{ _("Important: Admin user have always all permissions!") }} - -
        - - - - - - - - - {% for name, data in users.iteritems() %} - - - - - - - {% endfor %} - - -
        - {{ _("Name") }} - - {{ _("Change Password") }} - - {{ _("Admin") }} - - {{ _("Permissions") }} -
        {{ name }}{{ _("change") }} - -
        - - -
        -{% endblock %} -{% block hidden %} -
        -
        -

        {{ _("Change Password") }}

        - -

        {{ _("Enter your current and desired Password.") }}

        - - - - - - - - - - - - - - - -
        - -
        - -
        -{% endblock %} diff --git a/module/webui/themes/flat/tml/base.html b/module/webui/themes/flat/tml/base.html deleted file mode 100644 index 17349c5f1..000000000 --- a/module/webui/themes/flat/tml/base.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - - - - - - - -{% block title %}pyLoad {{_("Webinterface")}}{% endblock %} - -{% block head %} -{% endblock %} - - - - -
        - - -
        - {% block headpanel %} - - {% if user.is_authenticated %} - - -{% if update %} - -{{_("pyLoad Update available!")}} - -{% endif %} - - -{% if plugins %} - -{{_("Plugins updated, please restart!")}} - -{% endif %} - - -Captcha: -{{_("Captcha waiting")}} - - - User:{{user.name}} - -{% else %} - {{_("Please Login!")}} -{% endif %} - - {% endblock %} -
        - - - -
        - -
        - -
        -
        - -{% if perms.STATUS %} - -{% endif %} - -{% if perms.LIST %} - -{% endif %} - -{% block pageactions %} -{% endblock %} -
        - -
        - -
        - -

        {% block subtitle %}pyLoad - {{_("Webinterface")}}{% endblock %}

        - -{% block statusbar %} -{% endblock %} - - -
        - -
        -
        - - -{% for message in messages %} -

        {{message}}

        -{% endfor %} - -
        - - {{_("loading")}} -
        - -{% block content %} -{% endblock content %} - -
        - - -
        -
        - -
        - {% include '/flat/tml/window.html' %} - {% include '/flat/tml/captcha.html' %} - {% block hidden %} - {% endblock %} -
        - - diff --git a/module/webui/themes/flat/tml/captcha.html b/module/webui/themes/flat/tml/captcha.html deleted file mode 100644 index ae1afe444..000000000 --- a/module/webui/themes/flat/tml/captcha.html +++ /dev/null @@ -1,42 +0,0 @@ - -
        - -
        - -

        {{_("Captcha reading")}}

        -

        {{_("Please read the text on the captcha.")}}

        - -
        - - - - - - - - - - - -
        - -
        - -
        - -
        - - - - -
        - -
        - -
        - -
        \ No newline at end of file diff --git a/module/webui/themes/flat/tml/downloads.html b/module/webui/themes/flat/tml/downloads.html deleted file mode 100644 index 445f8da37..000000000 --- a/module/webui/themes/flat/tml/downloads.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends '/flat/tml/base.html' %} - -{% block title %}Downloads - {{super()}} {% endblock %} - -{% block subtitle %} -{{_("Downloads")}} -{% endblock %} - -{% block content %} - -
          - {% for folder in files.folder %} -
        • - {{ folder.name }} -
            - {% for file in folder.files %} -
          • {{file}}
          • - {% endfor %} -
          -
        • - {% endfor %} - - {% for file in files.files %} -
        • {{ file }}
        • - {% endfor %} - -
        - -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/flat/tml/folder.html b/module/webui/themes/flat/tml/folder.html deleted file mode 100644 index 89b84e7bb..000000000 --- a/module/webui/themes/flat/tml/folder.html +++ /dev/null @@ -1,15 +0,0 @@ -
      • - - - - {{ name }} - - -    - -    - - - -
        {{ _("Folder is empty") }}
        -
      • \ No newline at end of file diff --git a/module/webui/themes/flat/tml/home.html b/module/webui/themes/flat/tml/home.html deleted file mode 100644 index 838a351ad..000000000 --- a/module/webui/themes/flat/tml/home.html +++ /dev/null @@ -1,263 +0,0 @@ -{% extends '/flat/tml/base.html' %} -{% block head %} - - - -{% endblock %} - -{% block subtitle %} -{{_("Active Downloads")}} -{% endblock %} - -{% block menu %} -
      • - {{_("Home")}} -
      • -
      • - {{_("Queue")}} -
      • -
      • - {{_("Collector")}} -
      • -
      • - {{_("Downloads")}} -
      • -
      • - {{_("Logs")}} -
      • -
      • - {{_("Config")}} -
      • -{% endblock %} - -{% block content %} - - - - - - - - - - - - - {% for link in content %} - - - - - - - - - - - {% endfor %} - - -
        {{_("Name")}}{{_("Status")}}{{_("Information")}}{{_("Size")}}{{_("Progress")}}
        -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/flat/tml/info.html b/module/webui/themes/flat/tml/info.html deleted file mode 100644 index 26b46736d..000000000 --- a/module/webui/themes/flat/tml/info.html +++ /dev/null @@ -1,81 +0,0 @@ -{% extends '/flat/tml/base.html' %} - -{% block head %} - -{% endblock %} - -{% block title %}{{ _("Information") }} - {{ super() }} {% endblock %} -{% block subtitle %}{{ _("Information") }}{% endblock %} - -{% block content %} -

        {{ _("News") }}

        -
        - -

        {{ _("Support") }}

        - - - -

        {{ _("System") }}

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        {{ _("Python:") }}{{ python }}
        {{ _("OS:") }}{{ os }}
        {{ _("pyLoad version:") }}{{ version }}
        {{ _("Installation Folder:") }}{{ folder }}
        {{ _("Config Folder:") }}{{ config }}
        {{ _("Download Folder:") }}{{ download }}
        {{ _("Free Space:") }}{{ freespace }}
        {{ _("Language:") }}{{ language }}
        {{ _("Webinterface Port:") }}{{ webif }}
        {{ _("Remote Interface Port:") }}{{ remote }}
        - -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/flat/tml/login.html b/module/webui/themes/flat/tml/login.html deleted file mode 100644 index 76365a79c..000000000 --- a/module/webui/themes/flat/tml/login.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends '/flat/tml/base.html' %} - -{% block title %}{{_("Login")}} - {{super()}} {% endblock %} - -{% block content %} - -
        -
        -
        - -
        - Login - -
        - -
        - -
        -
        -
        - -{% if errors %} -

        {{_("Your username and password didn't match. Please try again.")}}

        - {{ _("To reset your login data or add an user run:") }} python pyload.py -u -{% endif %} - -
        -
        - -{% endblock %} diff --git a/module/webui/themes/flat/tml/logout.html b/module/webui/themes/flat/tml/logout.html deleted file mode 100644 index 370031b25..000000000 --- a/module/webui/themes/flat/tml/logout.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends '/flat/tml/base.html' %} - -{% block head %} - -{% endblock %} - -{% block content %} -

        {{_("You were successfully logged out.")}}

        -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/flat/tml/logs.html b/module/webui/themes/flat/tml/logs.html deleted file mode 100644 index 87e5a0f30..000000000 --- a/module/webui/themes/flat/tml/logs.html +++ /dev/null @@ -1,41 +0,0 @@ -{% extends '/flat/tml/base.html' %} - -{% block title %}{{_("Logs")}} - {{super()}} {% endblock %} -{% block subtitle %}{{_("Logs")}}{% endblock %} -{% block head %} - -{% endblock %} - -{% block content %} -
        - - -
        -
        - -   - - -
        -
        -
        {{warning}}
        -
        -
        - - {% for line in log %} - - {% endfor %} -
        {{line.line}}{{line.date}}{{line.level}}{{line.message}}
        -
        -
        -
        - - -
        -
        -
         
        -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/flat/tml/pathchooser.html b/module/webui/themes/flat/tml/pathchooser.html deleted file mode 100644 index 95a1a3be5..000000000 --- a/module/webui/themes/flat/tml/pathchooser.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - -
        -
        -
        - - -
        - - {% if type == 'folder' %} - {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} - {% else %} - {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} - {% endif %} -
        - - - - - - - - {% if parentdir %} - - - - {% endif %} -{% for file in files %} - - {% if type == 'folder' %} - - {% else %} - - {% endif %} - - - - - -{% endfor %} -
        {{_("name")}}{{_("size")}}{{_("type")}}{{_("last modified")}}
        - {{_("parent directory")}} -
        {% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{{ file.size|float|filesizeformat }}{% if file.type == 'dir' %}directory{% else %}{{ file.ext|default("file") }}{% endif %}{{ file.modified|date("d.m.Y - H:i:s") }}
        -
        - - \ No newline at end of file diff --git a/module/webui/themes/flat/tml/queue.html b/module/webui/themes/flat/tml/queue.html deleted file mode 100644 index 0d3022ddd..000000000 --- a/module/webui/themes/flat/tml/queue.html +++ /dev/null @@ -1,104 +0,0 @@ -{% extends '/flat/tml/base.html' %} -{% block head %} - - - - -{% endblock %} - -{% if target %} - {% set name = _("Queue") %} -{% else %} - {% set name = _("Collector") %} -{% endif %} - -{% block title %}{{name}} - {{super()}} {% endblock %} -{% block subtitle %}{{name}}{% endblock %} - -{% block pageactions %} - -{% endblock %} - -{% block content %} -{% autoescape true %} - -
          -{% for package in content %} -
        • -
          - - -
          - - {{package.name}} -    - - -    - -    - -    - - -
          - {% set progress = (package.linksdone * 100) / package.linkstotal %} - -
          -
          - - -
          -
          - - -
          -
        • -{% endfor %} -
        -{% endautoescape %} -{% endblock %} - -{% block hidden %} -
        -
        -

        {{_("Edit Package")}}

        -

        {{_("Edit the package detais below.")}}

        - - - - - - - - - - - - -
        - -
        - -
        -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/flat/tml/settings.html b/module/webui/themes/flat/tml/settings.html deleted file mode 100644 index 1bd0d1e17..000000000 --- a/module/webui/themes/flat/tml/settings.html +++ /dev/null @@ -1,204 +0,0 @@ -{% extends '/flat/tml/base.html' %} - -{% block title %}{{ _("Config") }} - {{ super() }} {% endblock %} -{% block subtitle %}{{ _("Config") }}{% endblock %} - -{% block head %} - - - - -{% endblock %} - -{% block content %} - - - -
        - -
        - - - - - - -
        - -
        -

           {{ _("Choose a section from the menu") }}

        -
        -
        - - -
        -
        - - - - - - -
        - - -
        -

           {{ _("Choose a section from the menu") }}

        -
        -
        - -
        - -
        - - - -
        - - - - - - - - - - - - - - - - - - - - {% for account in conf.accs %} - {% set plugin = account.type %} - - - - - - - - - - - - - - {% endfor %} -
        {{ _("Plugin") }}{{ _("Name") }}{{ _("Password") }}{{ _("Status") }}{{ _("Premium") }}{{ _("Valid until") }}{{ _("Traffic left") }}{{ _("Time") }}{{ _("Max Parallel") }}{{ _("Delete?") }}
        - {{ plugin }} - - - - {% if account.valid %} - - {{ _("valid") }} - {% else %} - - {{ _("not valid") }} - {% endif %} - - - {% if account.premium %} - - {{ _("yes") }} - {% else %} - - {{ _("no") }} - {% endif %} - - - - {{ account.validuntil }} - - - - {{ account.trafficleft }} - - - - - - - -
        - - - -
        -
        -
        -{% endblock %} -{% block hidden %} -
        -
        -

        {{_("Add Account")}}

        -

        {{_("Enter your account data to use premium features.")}}

        - - - - - - - - - - - -
        - -
        - -
        -{% endblock %} \ No newline at end of file diff --git a/module/webui/themes/flat/tml/settings_item.html b/module/webui/themes/flat/tml/settings_item.html deleted file mode 100644 index 813383343..000000000 --- a/module/webui/themes/flat/tml/settings_item.html +++ /dev/null @@ -1,48 +0,0 @@ - - {% if section.outline %} - - {% endif %} - {% for okey, option in section.iteritems() %} - {% if okey not in ("desc","outline") %} - - - - - {% endif %} - {% endfor %} -
        {{ section.outline }}
        - {% if option.type == "bool" %} - - {% elif ";" in option.type %} - - {% elif option.type == "folder" %} - - - {% elif option.type == "file" %} - - - {% elif option.type == "password" %} - - {% else %} - - {% endif %} -
        \ No newline at end of file diff --git a/module/webui/themes/flat/tml/window.html b/module/webui/themes/flat/tml/window.html deleted file mode 100644 index 8f57843c6..000000000 --- a/module/webui/themes/flat/tml/window.html +++ /dev/null @@ -1,46 +0,0 @@ - - -
        -
        -

        {{_("Add Package")}}

        -

        {{_("Paste your links or upload a container.")}}

        - - - - - - - - - - - - - - - {{_("Queue")}} - - {{_("Collector")}} - - - - - -
        - -
        - -
        \ No newline at end of file diff --git a/pyload-cli.py b/pyload-cli.py index c1e2ff617..0ef70368b 100644 --- a/pyload-cli.py +++ b/pyload-cli.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -from module.cli.Cli import main +from pyload.cli.Cli import main if __name__ == "__main__": main() diff --git a/pyload.py b/pyload.py index b53bf4352..dc1957928 100644 --- a/pyload.py +++ b/pyload.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -from module.Core import main +from pyload.Core import main if __name__ == "__main__": main() diff --git a/pyload/Api.py b/pyload/Api.py new file mode 100644 index 000000000..066d490ec --- /dev/null +++ b/pyload/Api.py @@ -0,0 +1,1030 @@ +# -*- 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 . + + @author: RaNaN +""" + +from base64 import standard_b64encode +from os.path import join +from time import time +import re + +from PyFile import PyFile +from utils import freeSpace, compare_time +from common.packagetools import parseNames +from network.RequestFactory import getURL +from remote import activated + +if activated: + try: + from remote.thriftbackend.thriftgen.pyload.ttypes import * + from remote.thriftbackend.thriftgen.pyload.Pyload import Iface + BaseObject = TBase + except ImportError: + print "Thrift not imported" + from remote.socketbackend.ttypes import * +else: + from remote.socketbackend.ttypes import * + +# contains function names mapped to their permissions +# unlisted functions are for admins only +permMap = {} + +# decorator only called on init, never initialized, so has no effect on runtime +def permission(bits): + class _Dec(object): + def __new__(cls, func, *args, **kwargs): + permMap[func.__name__] = bits + return func + + return _Dec + + +urlmatcher = re.compile(r"((https?|ftps?|xdcc|sftp):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+\-=\\\.&]*)", re.IGNORECASE) + +class PERMS: + ALL = 0 # requires no permission, but login + ADD = 1 # can add packages + DELETE = 2 # can delete packages + STATUS = 4 # see and change server status + LIST = 16 # see queue and collector + MODIFY = 32 # moddify some attribute of downloads + DOWNLOAD = 64 # can download from webinterface + SETTINGS = 128 # can access settings + ACCOUNTS = 256 # can access accounts + LOGS = 512 # can see server logs + +class ROLE: + ADMIN = 0 #admin has all permissions implicit + USER = 1 + +def has_permission(userperms, perms): + # bytewise or perms before if needed + return perms == (userperms & perms) + + +class Api(Iface): + """ + **pyLoads API** + + This is accessible either internal via core.api or via thrift backend. + + see Thrift specification file remote/thriftbackend/pyload.thrift\ + for information about data structures and what methods are usuable with rpc. + + Most methods requires specific permissions, please look at the source code if you need to know.\ + These can be configured via webinterface. + Admin user have all permissions, and are the only ones who can access the methods with no specific permission. + """ + + EXTERNAL = Iface # let the json api know which methods are external + + def __init__(self, core): + self.core = core + + def _convertPyFile(self, p): + f = FileData(p["id"], p["url"], p["name"], p["plugin"], p["size"], + p["format_size"], p["status"], p["statusmsg"], + p["package"], p["error"], p["order"]) + return f + + def _convertConfigFormat(self, c): + sections = {} + for sectionName, sub in c.iteritems(): + section = ConfigSection(sectionName, sub["desc"]) + items = [] + for key, data in sub.iteritems(): + if key in ("desc", "outline"): + continue + item = ConfigItem() + item.name = key + item.description = data["desc"] + item.value = str(data["value"]) if not isinstance(data["value"], basestring) else data["value"] + item.type = data["type"] + items.append(item) + section.items = items + sections[sectionName] = section + if "outline" in sub: + section.outline = sub["outline"] + return sections + + @permission(PERMS.SETTINGS) + def getConfigValue(self, category, option, section="core"): + """Retrieve config value. + + :param category: name of category, or plugin + :param option: config option + :param section: 'plugin' or 'core' + :return: config value as string + """ + if section == "core": + value = self.core.config[category][option] + else: + value = self.core.config.getPlugin(category, option) + + return str(value) if not isinstance(value, basestring) else value + + @permission(PERMS.SETTINGS) + def setConfigValue(self, category, option, value, section="core"): + """Set new config value. + + :param category: + :param option: + :param value: new config value + :param section: 'plugin' or 'core + """ + self.core.hookManager.dispatchEvent("configChanged", category, option, value, section) + + if section == "core": + self.core.config[category][option] = value + + if option in ("limit_speed", "max_speed"): #not so nice to update the limit + self.core.requestFactory.updateBucket() + + elif section == "plugin": + self.core.config.setPlugin(category, option, value) + + @permission(PERMS.SETTINGS) + def getConfig(self): + """Retrieves complete config of core. + + :return: list of `ConfigSection` + """ + return self._convertConfigFormat(self.core.config.config) + + def getConfigDict(self): + """Retrieves complete config in dict format, not for RPC. + + :return: dict + """ + return self.core.config.config + + @permission(PERMS.SETTINGS) + def getPluginConfig(self): + """Retrieves complete config for all plugins. + + :return: list of `ConfigSection` + """ + return self._convertConfigFormat(self.core.config.plugin) + + def getPluginConfigDict(self): + """Plugin config as dict, not for RPC. + + :return: dict + """ + return self.core.config.plugin + + + @permission(PERMS.STATUS) + def pauseServer(self): + """Pause server: Tt wont start any new downloads, but nothing gets aborted.""" + self.core.threadManager.pause = True + + @permission(PERMS.STATUS) + def unpauseServer(self): + """Unpause server: New Downloads will be started.""" + self.core.threadManager.pause = False + + @permission(PERMS.STATUS) + def togglePause(self): + """Toggle pause state. + + :return: new pause state + """ + self.core.threadManager.pause ^= True + return self.core.threadManager.pause + + @permission(PERMS.STATUS) + def toggleReconnect(self): + """Toggle reconnect activation. + + :return: new reconnect state + """ + self.core.config["reconnect"]["activated"] ^= True + return self.core.config["reconnect"]["activated"] + + @permission(PERMS.LIST) + def statusServer(self): + """Some general information about the current status of pyLoad. + + :return: `ServerStatus` + """ + serverStatus = ServerStatus(self.core.threadManager.pause, len(self.core.threadManager.processingIds()), + self.core.files.getQueueCount(), self.core.files.getFileCount(), 0, + not self.core.threadManager.pause and self.isTimeDownload(), + self.core.config['reconnect']['activated'] and self.isTimeReconnect()) + + for pyfile in [x.active for x in self.core.threadManager.threads if x.active and isinstance(x.active, PyFile)]: + serverStatus.speed += pyfile.getSpeed() #bytes/s + + return serverStatus + + @permission(PERMS.STATUS) + def freeSpace(self): + """Available free space at download directory in bytes""" + return freeSpace(self.core.config["general"]["download_folder"]) + + @permission(PERMS.ALL) + def getServerVersion(self): + """pyLoad Core version """ + return self.core.version + + def kill(self): + """Clean way to quit pyLoad""" + self.core.do_kill = True + + def restart(self): + """Restart pyload core""" + self.core.do_restart = True + + @permission(PERMS.LOGS) + def getLog(self, offset=0): + """Returns most recent log entries. + + :param offset: line offset + :return: List of log entries + """ + filename = join(self.core.config['log']['log_folder'], 'log.txt') + try: + fh = open(filename, "r") + lines = fh.readlines() + fh.close() + if offset >= len(lines): + return [] + return lines[offset:] + except: + return ['No log available'] + + @permission(PERMS.STATUS) + def isTimeDownload(self): + """Checks if pyload will start new downloads according to time in config. + + :return: bool + """ + start = self.core.config['downloadTime']['start'].split(":") + end = self.core.config['downloadTime']['end'].split(":") + return compare_time(start, end) + + @permission(PERMS.STATUS) + def isTimeReconnect(self): + """Checks if pyload will try to make a reconnect + + :return: bool + """ + start = self.core.config['reconnect']['startTime'].split(":") + end = self.core.config['reconnect']['endTime'].split(":") + return compare_time(start, end) and self.core.config["reconnect"]["activated"] + + @permission(PERMS.LIST) + def statusDownloads(self): + """ Status off all currently running downloads. + + :return: list of `DownloadStatus` + """ + data = [] + for pyfile in self.core.threadManager.getActiveFiles(): + if not isinstance(pyfile, PyFile): + continue + + data.append(DownloadInfo( + pyfile.id, pyfile.name, pyfile.getSpeed(), pyfile.getETA(), pyfile.formatETA(), + pyfile.getBytesLeft(), pyfile.getSize(), pyfile.formatSize(), pyfile.getPercent(), + pyfile.status, pyfile.getStatusName(), pyfile.formatWait(), + pyfile.waitUntil, pyfile.packageid, pyfile.package().name, pyfile.pluginname)) + + return data + + @permission(PERMS.ADD) + def addPackage(self, name, links, dest=Destination.Queue): + """Adds a package, with links to desired destination. + + :param name: name of the new package + :param links: list of urls + :param dest: `Destination` + :return: package id of the new package + """ + if self.core.config['general']['folder_per_package']: + folder = name + else: + folder = "" + + folder = folder.replace("http://", "").replace(":", "").replace("/", "_").replace("\\", "_") + + pid = self.core.files.addPackage(name, folder, dest) + + self.core.files.addLinks(links, pid) + + self.core.log.info(_("Added package %(name)s containing %(count)d links") % {"name": name, "count": len(links)}) + + self.core.files.save() + + return pid + + @permission(PERMS.ADD) + def parseURLs(self, html=None, url=None): + """Parses html content or any arbitaty text for links and returns result of `checkURLs` + + :param html: html source + :return: + """ + urls = [] + + if html: + urls += [x[0] for x in urlmatcher.findall(html)] + + if url: + page = getURL(url) + urls += [x[0] for x in urlmatcher.findall(page)] + + # remove duplicates + return self.checkURLs(set(urls)) + + + @permission(PERMS.ADD) + def checkURLs(self, urls): + """ Gets urls and returns pluginname mapped to list of matches urls. + + :param urls: + :return: {plugin: urls} + """ + data = self.core.pluginManager.parseUrls(urls) + plugins = {} + + for url, plugin in data: + if plugin in plugins: + plugins[plugin].append(url) + else: + plugins[plugin] = [url] + + return plugins + + @permission(PERMS.ADD) + def checkOnlineStatus(self, urls): + """ initiates online status check + + :param urls: + :return: initial set of data as `OnlineCheck` instance containing the result id + """ + data = self.core.pluginManager.parseUrls(urls) + + rid = self.core.threadManager.createResultThread(data, False) + + tmp = [(url, (url, OnlineStatus(url, pluginname, "unknown", 3, 0))) for url, pluginname in data] + data = parseNames(tmp) + result = {} + + for k, v in data.iteritems(): + for url, status in v: + status.packagename = k + result[url] = status + + return OnlineCheck(rid, result) + + @permission(PERMS.ADD) + def checkOnlineStatusContainer(self, urls, container, data): + """ checks online status of urls and a submited container file + + :param urls: list of urls + :param container: container file name + :param data: file content + :return: online check + """ + th = open(join(self.core.config["general"]["download_folder"], "tmp_" + container), "wb") + th.write(str(data)) + th.close() + + return self.checkOnlineStatus(urls + [th.name]) + + @permission(PERMS.ADD) + def pollResults(self, rid): + """ Polls the result available for ResultID + + :param rid: `ResultID` + :return: `OnlineCheck`, if rid is -1 then no more data available + """ + result = self.core.threadManager.getInfoResult(rid) + + if "ALL_INFO_FETCHED" in result: + del result["ALL_INFO_FETCHED"] + return OnlineCheck(-1, result) + else: + return OnlineCheck(rid, result) + + + @permission(PERMS.ADD) + def generatePackages(self, links): + """ Parses links, generates packages names from urls + + :param links: list of urls + :return: package names mapped to urls + """ + result = parseNames((x, x) for x in links) + return result + + @permission(PERMS.ADD) + def generateAndAddPackages(self, links, dest=Destination.Queue): + """Generates and add packages + + :param links: list of urls + :param dest: `Destination` + :return: list of package ids + """ + return [self.addPackage(name, urls, dest) for name, urls + in self.generatePackages(links).iteritems()] + + @permission(PERMS.ADD) + def checkAndAddPackages(self, links, dest=Destination.Queue): + """Checks online status, retrieves names, and will add packages.\ + Because of this packages are not added immediatly, only for internal use. + + :param links: list of urls + :param dest: `Destination` + :return: None + """ + data = self.core.pluginManager.parseUrls(links) + self.core.threadManager.createResultThread(data, True) + + + @permission(PERMS.LIST) + def getPackageData(self, pid): + """Returns complete information about package, and included files. + + :param pid: package id + :return: `PackageData` with .links attribute + """ + data = self.core.files.getPackageData(int(pid)) + + if not data: + raise PackageDoesNotExists(pid) + + pdata = PackageData(data["id"], data["name"], data["folder"], data["site"], data["password"], + data["queue"], data["order"], + links=[self._convertPyFile(x) for x in data["links"].itervalues()]) + + return pdata + + @permission(PERMS.LIST) + def getPackageInfo(self, pid): + """Returns information about package, without detailed information about containing files + + :param pid: package id + :return: `PackageData` with .fid attribute + """ + data = self.core.files.getPackageData(int(pid)) + + if not data: + raise PackageDoesNotExists(pid) + + pdata = PackageData(data["id"], data["name"], data["folder"], data["site"], data["password"], + data["queue"], data["order"], + fids=[int(x) for x in data["links"]]) + + return pdata + + @permission(PERMS.LIST) + def getFileData(self, fid): + """Get complete information about a specific file. + + :param fid: file id + :return: `FileData` + """ + info = self.core.files.getFileData(int(fid)) + if not info: + raise FileDoesNotExists(fid) + + fdata = self._convertPyFile(info.values()[0]) + return fdata + + @permission(PERMS.DELETE) + def deleteFiles(self, fids): + """Deletes several file entries from pyload. + + :param fids: list of file ids + """ + for id in fids: + self.core.files.deleteLink(int(id)) + + self.core.files.save() + + @permission(PERMS.DELETE) + def deletePackages(self, pids): + """Deletes packages and containing links. + + :param pids: list of package ids + """ + for id in pids: + self.core.files.deletePackage(int(id)) + + self.core.files.save() + + @permission(PERMS.LIST) + def getQueue(self): + """Returns info about queue and packages, **not** about files, see `getQueueData` \ + or `getPackageData` instead. + + :return: list of `PackageInfo` + """ + return [PackageData(pack["id"], pack["name"], pack["folder"], pack["site"], + pack["password"], pack["queue"], pack["order"], + pack["linksdone"], pack["sizedone"], pack["sizetotal"], + pack["linkstotal"]) + for pack in self.core.files.getInfoData(Destination.Queue).itervalues()] + + @permission(PERMS.LIST) + def getQueueData(self): + """Return complete data about everything in queue, this is very expensive use it sparely.\ + See `getQueue` for alternative. + + :return: list of `PackageData` + """ + return [PackageData(pack["id"], pack["name"], pack["folder"], pack["site"], + pack["password"], pack["queue"], pack["order"], + pack["linksdone"], pack["sizedone"], pack["sizetotal"], + links=[self._convertPyFile(x) for x in pack["links"].itervalues()]) + for pack in self.core.files.getCompleteData(Destination.Queue).itervalues()] + + @permission(PERMS.LIST) + def getCollector(self): + """same as `getQueue` for collector. + + :return: list of `PackageInfo` + """ + return [PackageData(pack["id"], pack["name"], pack["folder"], pack["site"], + pack["password"], pack["queue"], pack["order"], + pack["linksdone"], pack["sizedone"], pack["sizetotal"], + pack["linkstotal"]) + for pack in self.core.files.getInfoData(Destination.Collector).itervalues()] + + @permission(PERMS.LIST) + def getCollectorData(self): + """same as `getQueueData` for collector. + + :return: list of `PackageInfo` + """ + return [PackageData(pack["id"], pack["name"], pack["folder"], pack["site"], + pack["password"], pack["queue"], pack["order"], + pack["linksdone"], pack["sizedone"], pack["sizetotal"], + links=[self._convertPyFile(x) for x in pack["links"].itervalues()]) + for pack in self.core.files.getCompleteData(Destination.Collector).itervalues()] + + + @permission(PERMS.ADD) + def addFiles(self, pid, links): + """Adds files to specific package. + + :param pid: package id + :param links: list of urls + """ + self.core.files.addLinks(links, int(pid)) + + self.core.log.info(_("Added %(count)d links to package #%(package)d ") % {"count": len(links), "package": pid}) + self.core.files.save() + + @permission(PERMS.MODIFY) + def pushToQueue(self, pid): + """Moves package from Collector to Queue. + + :param pid: package id + """ + self.core.files.setPackageLocation(pid, Destination.Queue) + + @permission(PERMS.MODIFY) + def pullFromQueue(self, pid): + """Moves package from Queue to Collector. + + :param pid: package id + """ + self.core.files.setPackageLocation(pid, Destination.Collector) + + @permission(PERMS.MODIFY) + def restartPackage(self, pid): + """Restarts a package, resets every containing files. + + :param pid: package id + """ + self.core.files.restartPackage(int(pid)) + + @permission(PERMS.MODIFY) + def restartFile(self, fid): + """Resets file status, so it will be downloaded again. + + :param fid: file id + """ + self.core.files.restartFile(int(fid)) + + @permission(PERMS.MODIFY) + def recheckPackage(self, pid): + """Proofes online status of all files in a package, also a default action when package is added. + + :param pid: + :return: + """ + self.core.files.reCheckPackage(int(pid)) + + @permission(PERMS.MODIFY) + def stopAllDownloads(self): + """Aborts all running downloads.""" + + pyfiles = self.core.files.cache.values() + for pyfile in pyfiles: + pyfile.abortDownload() + + @permission(PERMS.MODIFY) + def stopDownloads(self, fids): + """Aborts specific downloads. + + :param fids: list of file ids + :return: + """ + pyfiles = self.core.files.cache.values() + + for pyfile in pyfiles: + if pyfile.id in fids: + pyfile.abortDownload() + + @permission(PERMS.MODIFY) + def setPackageName(self, pid, name): + """Renames a package. + + :param pid: package id + :param name: new package name + """ + pack = self.core.files.getPackage(pid) + pack.name = name + pack.sync() + + @permission(PERMS.MODIFY) + def movePackage(self, destination, pid): + """Set a new package location. + + :param destination: `Destination` + :param pid: package id + """ + if destination not in (0, 1): return + self.core.files.setPackageLocation(pid, destination) + + @permission(PERMS.MODIFY) + def moveFiles(self, fids, pid): + """Move multiple files to another package + + :param fids: list of file ids + :param pid: destination package + :return: + """ + #TODO: implement + pass + + + @permission(PERMS.ADD) + def uploadContainer(self, filename, data): + """Uploads and adds a container file to pyLoad. + + :param filename: filename, extension is important so it can correctly decrypted + :param data: file content + """ + th = open(join(self.core.config["general"]["download_folder"], "tmp_" + filename), "wb") + th.write(str(data)) + th.close() + + self.addPackage(th.name, [th.name], Destination.Queue) + + @permission(PERMS.MODIFY) + def orderPackage(self, pid, position): + """Gives a package a new position. + + :param pid: package id + :param position: + """ + self.core.files.reorderPackage(pid, position) + + @permission(PERMS.MODIFY) + def orderFile(self, fid, position): + """Gives a new position to a file within its package. + + :param fid: file id + :param position: + """ + self.core.files.reorderFile(fid, position) + + @permission(PERMS.MODIFY) + def setPackageData(self, pid, data): + """Allows to modify several package attributes. + + :param pid: package id + :param data: dict that maps attribute to desired value + """ + p = self.core.files.getPackage(pid) + if not p: raise PackageDoesNotExists(pid) + + for key, value in data.iteritems(): + if key == "id": continue + setattr(p, key, value) + + p.sync() + self.core.files.save() + + @permission(PERMS.DELETE) + def deleteFinished(self): + """Deletes all finished files and completly finished packages. + + :return: list of deleted package ids + """ + return self.core.files.deleteFinishedLinks() + + @permission(PERMS.MODIFY) + def restartFailed(self): + """Restarts all failed failes.""" + self.core.files.restartFailed() + + @permission(PERMS.LIST) + def getPackageOrder(self, destination): + """Returns information about package order. + + :param destination: `Destination` + :return: dict mapping order to package id + """ + + packs = self.core.files.getInfoData(destination) + order = {} + + for pid in packs: + pack = self.core.files.getPackageData(int(pid)) + while pack["order"] in order.keys(): #just in case + pack["order"] += 1 + order[pack["order"]] = pack["id"] + return order + + @permission(PERMS.LIST) + def getFileOrder(self, pid): + """Information about file order within package. + + :param pid: + :return: dict mapping order to file id + """ + rawData = self.core.files.getPackageData(int(pid)) + order = {} + for id, pyfile in rawData["links"].iteritems(): + while pyfile["order"] in order.keys(): #just in case + pyfile["order"] += 1 + order[pyfile["order"]] = pyfile["id"] + return order + + + @permission(PERMS.STATUS) + def isCaptchaWaiting(self): + """Indicates wether a captcha task is available + + :return: bool + """ + self.core.lastClientConnected = time() + task = self.core.captchaManager.getTask() + return not task is None + + @permission(PERMS.STATUS) + def getCaptchaTask(self, exclusive=False): + """Returns a captcha task + + :param exclusive: unused + :return: `CaptchaTask` + """ + self.core.lastClientConnected = time() + task = self.core.captchaManager.getTask() + if task: + task.setWatingForUser(exclusive=exclusive) + data, type, result = task.getCaptcha() + t = CaptchaTask(int(task.id), standard_b64encode(data), type, result) + return t + else: + return CaptchaTask(-1) + + @permission(PERMS.STATUS) + def getCaptchaTaskStatus(self, tid): + """Get information about captcha task + + :param tid: task id + :return: string + """ + self.core.lastClientConnected = time() + t = self.core.captchaManager.getTaskByID(tid) + return t.getStatus() if t else "" + + @permission(PERMS.STATUS) + def setCaptchaResult(self, tid, result): + """Set result for a captcha task + + :param tid: task id + :param result: captcha result + """ + self.core.lastClientConnected = time() + task = self.core.captchaManager.getTaskByID(tid) + if task: + task.setResult(result) + self.core.captchaManager.removeTask(task) + + + @permission(PERMS.STATUS) + def getEvents(self, uuid): + """Lists occured events, may be affected to changes in future. + + :param uuid: + :return: list of `Events` + """ + events = self.core.pullManager.getEvents(uuid) + newEvents = [] + + def convDest(d): + return Destination.Queue if d == "queue" else Destination.Collector + + for e in events: + event = EventInfo() + event.eventname = e[0] + if e[0] in ("update", "remove", "insert"): + event.id = e[3] + event.type = ElementType.Package if e[2] == "pack" else ElementType.File + event.destination = convDest(e[1]) + elif e[0] == "order": + if e[1]: + event.id = e[1] + event.type = ElementType.Package if e[2] == "pack" else ElementType.File + event.destination = convDest(e[3]) + elif e[0] == "reload": + event.destination = convDest(e[1]) + newEvents.append(event) + return newEvents + + @permission(PERMS.ACCOUNTS) + def getAccounts(self, refresh): + """Get information about all entered accounts. + + :param refresh: reload account info + :return: list of `AccountInfo` + """ + accs = self.core.accountManager.getAccountInfos(False, refresh) + accounts = [] + for group in accs.values(): + accounts.extend([AccountInfo(acc["validuntil"], acc["login"], acc["options"], acc["valid"], + acc["trafficleft"], acc["maxtraffic"], acc["premium"], acc["type"]) + for acc in group]) + return accounts + + @permission(PERMS.ALL) + def getAccountTypes(self): + """All available account types. + + :return: list + """ + return self.core.accountManager.accounts.keys() + + @permission(PERMS.ACCOUNTS) + def updateAccount(self, plugin, account, password=None, options={}): + """Changes pw/options for specific account.""" + self.core.accountManager.updateAccount(plugin, account, password, options) + + @permission(PERMS.ACCOUNTS) + def removeAccount(self, plugin, account): + """Remove account from pyload. + + :param plugin: pluginname + :param account: accountname + """ + self.core.accountManager.removeAccount(plugin, account) + + @permission(PERMS.ALL) + def login(self, username, password, remoteip=None): + """Login into pyLoad, this **must** be called when using rpc before any methods can be used. + + :param username: + :param password: + :param remoteip: Omit this argument, its only used internal + :return: bool indicating login was successful + """ + return True if self.checkAuth(username, password, remoteip) else False + + def checkAuth(self, username, password, remoteip=None): + """Check authentication and returns details + + :param username: + :param password: + :param remoteip: + :return: dict with info, empty when login is incorrect + """ + if self.core.config["remote"]["nolocalauth"] and remoteip == "127.0.0.1": + return "local" + else: + return self.core.db.checkAuth(username, password) + + def isAuthorized(self, func, userdata): + """checks if the user is authorized for specific method + + :param func: function name + :param userdata: dictionary of user data + :return: boolean + """ + if userdata == "local" or userdata["role"] == ROLE.ADMIN: + return True + elif func in permMap and has_permission(userdata["permission"], permMap[func]): + return True + else: + return False + + + @permission(PERMS.ALL) + def getUserData(self, username, password): + """similar to `checkAuth` but returns UserData thrift type """ + user = self.checkAuth(username, password) + if user: + return UserData(user["name"], user["email"], user["role"], user["permission"], user["template"]) + else: + return UserData() + + + def getAllUserData(self): + """returns all known user and info""" + res = {} + for user, data in self.core.db.getAllUserData().iteritems(): + res[user] = UserData(user, data["email"], data["role"], data["permission"], data["template"]) + + return res + + @permission(PERMS.STATUS) + def getServices(self): + """ A dict of available services, these can be defined by hook plugins. + + :return: dict with this style: {"plugin": {"method": "description"}} + """ + data = {} + for plugin, funcs in self.core.hookManager.methods.iteritems(): + data[plugin] = funcs + + return data + + @permission(PERMS.STATUS) + def hasService(self, plugin, func): + """Checks wether a service is available. + + :param plugin: + :param func: + :return: bool + """ + cont = self.core.hookManager.methods + return plugin in cont and func in cont[plugin] + + @permission(PERMS.STATUS) + def call(self, info): + """Calls a service (a method in hook plugin). + + :param info: `ServiceCall` + :return: result + :raises: ServiceDoesNotExists, when its not available + :raises: ServiceException, when a exception was raised + """ + plugin = info.plugin + func = info.func + args = info.arguments + parse = info.parseArguments + + if not self.hasService(plugin, func): + raise ServiceDoesNotExists(plugin, func) + + try: + ret = self.core.hookManager.callRPC(plugin, func, args, parse) + return str(ret) + except Exception, e: + raise ServiceException(e.message) + + @permission(PERMS.STATUS) + def getAllInfo(self): + """Returns all information stored by hook plugins. Values are always strings + + :return: {"plugin": {"name": value}} + """ + return self.core.hookManager.getAllInfo() + + @permission(PERMS.STATUS) + def getInfoByPlugin(self, plugin): + """Returns information stored by a specific plugin. + + :param plugin: pluginname + :return: dict of attr names mapped to value {"name": value} + """ + return self.core.hookManager.getInfo(plugin) + + def changePassword(self, user, oldpw, newpw): + """ changes password for specific user """ + return self.core.db.changePassword(user, oldpw, newpw) + + def setUserPermission(self, user, permission, role): + self.core.db.setPermission(user, permission) + self.core.db.setRole(user, role) diff --git a/pyload/CaptchaManager.py b/pyload/CaptchaManager.py new file mode 100644 index 000000000..0ba876ae8 --- /dev/null +++ b/pyload/CaptchaManager.py @@ -0,0 +1,158 @@ +# -*- 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 . + + @author: mkaay, RaNaN +""" + +from time import time +from traceback import print_exc +from threading import Lock + +class CaptchaManager: + def __init__(self, core): + self.lock = Lock() + self.core = core + self.tasks = [] #task store, for outgoing tasks only + + self.ids = 0 #only for internal purpose + + def newTask(self, img, format, file, result_type): + task = CaptchaTask(self.ids, img, format, file, result_type) + self.ids += 1 + return task + + def removeTask(self, task): + self.lock.acquire() + if task in self.tasks: + self.tasks.remove(task) + self.lock.release() + + def getTask(self): + self.lock.acquire() + for task in self.tasks: + if task.status in ("waiting", "shared-user"): + self.lock.release() + return task + self.lock.release() + return None + + def getTaskByID(self, tid): + self.lock.acquire() + for task in self.tasks: + if task.id == str(tid): #task ids are strings + self.lock.release() + return task + self.lock.release() + return None + + def handleCaptcha(self, task): + cli = self.core.isClientConnected() + + if cli: #client connected -> should solve the captcha + task.setWaiting(50) #wait 50 sec for response + + for plugin in self.core.hookManager.activePlugins(): + try: + plugin.newCaptchaTask(task) + except: + if self.core.debug: + print_exc() + + if task.handler or cli: #the captcha was handled + self.tasks.append(task) + return True + + task.error = _("No Client connected for captcha decrypting") + + return False + + +class CaptchaTask: + def __init__(self, id, img, format, file, result_type='textual'): + self.id = str(id) + self.captchaImg = img + self.captchaFormat = format + self.captchaFile = file + self.captchaResultType = result_type + self.handler = [] #the hook plugins that will take care of the solution + self.result = None + self.waitUntil = None + self.error = None #error message + + self.status = "init" + self.data = {} #handler can store data here + + def getCaptcha(self): + return self.captchaImg, self.captchaFormat, self.captchaResultType + + def setResult(self, text): + if self.isTextual(): + self.result = text + if self.isPositional(): + try: + parts = text.split(',') + self.result = (int(parts[0]), int(parts[1])) + except: + self.result = None + + def getResult(self): + try: + res = self.result.encode("utf8", "replace") + except: + res = self.result + + return res + + def getStatus(self): + return self.status + + def setWaiting(self, sec): + """ let the captcha wait secs for the solution """ + self.waitUntil = max(time() + sec, self.waitUntil) + self.status = "waiting" + + def isWaiting(self): + if self.result or self.error or time() > self.waitUntil: + return False + + return True + + def isTextual(self): + """ returns if text is written on the captcha """ + return self.captchaResultType == 'textual' + + def isPositional(self): + """ returns if user have to click a specific region on the captcha """ + return self.captchaResultType == 'positional' + + def setWatingForUser(self, exclusive): + if exclusive: + self.status = "user" + else: + self.status = "shared-user" + + def timedOut(self): + return time() > self.waitUntil + + def invalid(self): + """ indicates the captcha was not correct """ + [x.captchaInvalid(self) for x in self.handler] + + def correct(self): + [x.captchaCorrect(self) for x in self.handler] + + def __str__(self): + return "" % self.id diff --git a/pyload/ConfigParser.py b/pyload/ConfigParser.py new file mode 100644 index 000000000..64ce6b10e --- /dev/null +++ b/pyload/ConfigParser.py @@ -0,0 +1,373 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement +from time import sleep +from os.path import exists, join +from shutil import copy + +from traceback import print_exc +from utils import chmod + +# ignore these plugin configs, mainly because plugins were wiped out +IGNORE = ( + "FreakshareNet", "SpeedManager", "ArchiveTo", "ShareCx", ('hooks', 'UnRar'), + 'EasyShareCom', 'FlyshareCz' + ) + +CONF_VERSION = 1 + +class ConfigParser: + """ + holds and manage the configuration + + current dict layout: + + { + + section: { + option: { + value: + type: + desc: + } + desc: + + } + + """ + + + def __init__(self): + """Constructor""" + self.config = {} # the config values + self.plugin = {} # the config for plugins + self.oldRemoteData = {} + + self.pluginCB = None # callback when plugin config value is changed + + self.checkVersion() + + self.readConfig() + + self.deleteOldPlugins() + + + def checkVersion(self, n=0): + """determines if config need to be copied""" + try: + if not exists("pyload.conf"): + copy(join(pypath, "pyload", "config", "default.conf"), "pyload.conf") + + if not exists("plugin.conf"): + f = open("plugin.conf", "wb") + f.write("version: " + str(CONF_VERSION)) + f.close() + + f = open("pyload.conf", "rb") + v = f.readline() + f.close() + v = v[v.find(":") + 1:].strip() + + if not v or int(v) < CONF_VERSION: + copy(join(pypath, "pyload", "config", "default.conf"), "pyload.conf") + print "Old version of config was replaced" + + f = open("plugin.conf", "rb") + v = f.readline() + f.close() + v = v[v.find(":") + 1:].strip() + + if not v or int(v) < CONF_VERSION: + f = open("plugin.conf", "wb") + f.write("version: " + str(CONF_VERSION)) + f.close() + print "Old version of plugin-config replaced" + except: + if n < 3: + sleep(0.3) + self.checkVersion(n + 1) + else: + raise + + def readConfig(self): + """reads the config file""" + + self.config = self.parseConfig(join(pypath, "pyload", "config", "default.conf")) + self.plugin = self.parseConfig("plugin.conf") + + try: + homeconf = self.parseConfig("pyload.conf") + if "username" in homeconf["remote"]: + if "password" in homeconf["remote"]: + self.oldRemoteData = {"username": homeconf["remote"]["username"]["value"], + "password": homeconf["remote"]["username"]["value"]} + del homeconf["remote"]["password"] + del homeconf["remote"]["username"] + self.updateValues(homeconf, self.config) + + except Exception, e: + print "Config Warning" + print_exc() + + + def parseConfig(self, config): + """parses a given configfile""" + + f = open(config) + + config = f.read() + + config = config.splitlines()[1:] + + conf = {} + + section, option, value, typ, desc = "", "", "", "", "" + + listmode = False + + for line in config: + comment = line.rfind("#") + if line.find(":", comment) < 0 > line.find("=", comment) and comment > 0 and line[comment - 1].isspace(): + line = line.rpartition("#") # removes comments + if line[1]: + line = line[0] + else: + line = line[2] + + line = line.strip() + + try: + if line == "": + continue + elif line.endswith(":"): + section, none, desc = line[:-1].partition('-') + section = section.strip() + desc = desc.replace('"', "").strip() + conf[section] = {"desc": desc} + else: + if listmode: + if line.endswith("]"): + listmode = False + line = line.replace("]", "") + + value += [self.cast(typ, x.strip()) for x in line.split(",") if x] + + if not listmode: + conf[section][option] = {"desc": desc, + "type": typ, + "value": value} + + + else: + content, none, value = line.partition("=") + + content, none, desc = content.partition(":") + + desc = desc.replace('"', "").strip() + + typ, none, option = content.strip().rpartition(" ") + + value = value.strip() + + if value.startswith("["): + if value.endswith("]"): + listmode = False + value = value[:-1] + else: + listmode = True + + value = [self.cast(typ, x.strip()) for x in value[1:].split(",") if x] + else: + value = self.cast(typ, value) + + if not listmode: + conf[section][option] = {"desc": desc, + "type": typ, + "value": value} + + except Exception, e: + print "Config Warning" + print_exc() + + f.close() + return conf + + + def updateValues(self, config, dest): + """sets the config values from a parsed config file to values in destination""" + + for section in config.iterkeys(): + if section in dest: + for option in config[section].iterkeys(): + if option in ("desc", "outline"): continue + + if option in dest[section]: + dest[section][option]["value"] = config[section][option]["value"] + + #else: + # dest[section][option] = config[section][option] + + + #else: + # dest[section] = config[section] + + def saveConfig(self, config, filename): + """saves config to filename""" + with open(filename, "wb") as f: + chmod(filename, 0600) + f.write("version: %i \n" % CONF_VERSION) + for section in config.iterkeys(): + f.write('\n%s - "%s":\n' % (section, config[section]["desc"])) + + for option, data in config[section].iteritems(): + if option in ("desc", "outline"): continue + + if isinstance(data["value"], list): + value = "[ \n" + for x in data["value"]: + value += "\t\t" + str(x) + ",\n" + value += "\t\t]\n" + else: + if type(data["value"]) in (str, unicode): + value = data["value"] + "\n" + else: + value = str(data["value"]) + "\n" + try: + f.write('\t%s %s : "%s" = %s' % (data["type"], option, data["desc"], value)) + except UnicodeEncodeError: + f.write('\t%s %s : "%s" = %s' % (data["type"], option, data["desc"], value.encode("utf8"))) + + def cast(self, typ, value): + """cast value to given format""" + if type(value) not in (str, unicode): + return value + + elif typ == "int": + return int(value) + elif typ == "bool": + return True if value.lower() in ("1", "true", "on", "an", "yes") else False + elif typ == "time": + if not value: value = "0:00" + if not ":" in value: value += ":00" + return value + elif typ in ("str", "file", "folder"): + try: + return value.encode("utf8") + except: + return value + else: + return value + + + def save(self): + """saves the configs to disk""" + + self.saveConfig(self.config, "pyload.conf") + self.saveConfig(self.plugin, "plugin.conf") + + + def __getitem__(self, section): + """provides dictonary like access: c['section']['option']""" + return Section(self, section) + + + def get(self, section, option): + """get value""" + val = self.config[section][option]["value"] + try: + if type(val) in (str, unicode): + return val.decode("utf8") + else: + return val + except: + return val + + def set(self, section, option, value): + """set value""" + + value = self.cast(self.config[section][option]["type"], value) + + self.config[section][option]["value"] = value + self.save() + + def getPlugin(self, plugin, option): + """gets a value for a plugin""" + val = self.plugin[plugin][option]["value"] + try: + if type(val) in (str, unicode): + return val.decode("utf8") + else: + return val + except: + return val + + def setPlugin(self, plugin, option, value): + """sets a value for a plugin""" + + value = self.cast(self.plugin[plugin][option]["type"], value) + + if self.pluginCB: self.pluginCB(plugin, option, value) + + self.plugin[plugin][option]["value"] = value + self.save() + + def getMetaData(self, section, option): + """ get all config data for an option """ + return self.config[section][option] + + def addPluginConfig(self, name, config, outline=""): + """adds config options with tuples (name, type, desc, default)""" + if name not in self.plugin: + conf = {"desc": name, + "outline": outline} + self.plugin[name] = conf + else: + conf = self.plugin[name] + conf["outline"] = outline + + for item in config: + if item[0] in conf: + conf[item[0]]["type"] = item[1] + conf[item[0]]["desc"] = item[2] + else: + conf[item[0]] = { + "desc": item[2], + "type": item[1], + "value": self.cast(item[1], item[3]) + } + + values = [x[0] for x in config] + ["desc", "outline"] + #delete old values + for item in conf.keys(): + if item not in values: + del conf[item] + + def deleteConfig(self, name): + """Removes a plugin config""" + if name in self.plugin: + del self.plugin[name] + + + def deleteOldPlugins(self): + """ remove old plugins from config """ + + for name in IGNORE: + if name in self.plugin: + del self.plugin[name] + + +class Section: + """provides dictionary like access for configparser""" + + def __init__(self, parser, section): + """Constructor""" + self.parser = parser + self.section = section + + def __getitem__(self, item): + """getitem""" + return self.parser.get(self.section, item) + + def __setitem__(self, item, value): + """setitem""" + self.parser.set(self.section, item, value) diff --git a/pyload/Core.py b/pyload/Core.py new file mode 100644 index 000000000..5f506b980 --- /dev/null +++ b/pyload/Core.py @@ -0,0 +1,663 @@ +#!/usr/bin/env python +# -*- 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 . + + @author: spoob + @author: sebnapi + @author: RaNaN + @author: mkaay + @version: v0.4.10 +""" +CURRENT_VERSION = '0.4.10' + +import __builtin__ + +from getopt import getopt, GetoptError +import pyload.common.pylgettext as gettext +from imp import find_module +import logging +import logging.handlers +import os +from os import _exit, execl, getcwd, makedirs, remove, sep, walk, chdir, close +from os.path import exists, join +import signal +import subprocess +import sys +from sys import argv, executable, exit +from time import time, sleep +from traceback import print_exc + +from pyload import InitHomeDir +from pyload.plugins.AccountManager import AccountManager +from pyload.CaptchaManager import CaptchaManager +from pyload.ConfigParser import ConfigParser +from pyload.plugins.PluginManager import PluginManager +from pyload.PullEvents import PullManager +from pyload.network.RequestFactory import RequestFactory +from pyload.threads.ServerThread import WebServer +from pyload.Scheduler import Scheduler +from pyload.common.JsEngine import JsEngine +from pyload import remote +from pyload.remote.RemoteManager import RemoteManager +from pyload.database import DatabaseBackend, FileHandler + +from pyload.utils import freeSpace, formatSize, get_console_encoding + +from codecs import getwriter + +enc = get_console_encoding(sys.stdout.encoding) +sys.stdout = getwriter(enc)(sys.stdout, errors="replace") + +# TODO List +# - configurable auth system ldap/mysql +# - cron job like sheduler + +class Core(object): + """pyLoad Core, one tool to rule them all... (the filehosters) :D""" + + def __init__(self): + self.doDebug = False + self.running = False + self.daemon = False + self.remote = True + self.arg_links = [] + self.pidfile = "pyload.pid" + self.deleteLinks = False # will delete links on startup + + if len(argv) > 1: + try: + options, args = getopt(argv[1:], 'vchdusqp:', + ["version", "clear", "clean", "help", "debug", "user", + "setup", "configdir=", "changedir", "daemon", + "quit", "status", "no-remote","pidfile="]) + + for option, argument in options: + if option in ("-v", "--version"): + print "pyLoad", CURRENT_VERSION + exit() + elif option in ("-p", "--pidfile"): + self.pidfile = argument + elif option == "--daemon": + self.daemon = True + elif option in ("-c", "--clear"): + self.deleteLinks = True + elif option in ("-h", "--help"): + self.print_help() + exit() + elif option in ("-d", "--debug"): + self.doDebug = True + elif option in ("-u", "--user"): + from pyload.setup import Setup + + self.config = ConfigParser() + s = Setup(pypath, self.config) + s.set_user() + exit() + elif option in ("-s", "--setup"): + from pyload.setup import Setup + + self.config = ConfigParser() + s = Setup(pypath, self.config) + s.start() + exit() + elif option == "--changedir": + from pyload.setup import Setup + + self.config = ConfigParser() + s = Setup(pypath, self.config) + s.conf_path(True) + exit() + elif option in ("-q", "--quit"): + self.quitInstance() + exit() + elif option == "--status": + pid = self.isAlreadyRunning() + if self.isAlreadyRunning(): + print pid + exit(0) + else: + print "false" + exit(1) + elif option == "--clean": + self.cleanTree() + exit() + elif option == "--no-remote": + self.remote = False + + except GetoptError: + print 'Unknown Argument(s) "%s"' % " ".join(argv[1:]) + self.print_help() + exit() + + def print_help(self): + print + print "pyLoad v%s 2008-2014 the pyLoad Team" % CURRENT_VERSION + print + if sys.argv[0].endswith(".py"): + print "Usage: python pyload.py [options]" + else: + print "Usage: pyload [options]" + print + print "" + print " -v, --version", " " * 10, "Print version to terminal" + print " -c, --clear", " " * 12, "Delete all saved packages/links" + #print " -a, --add=", " " * 2, "Add the specified links" + print " -u, --user", " " * 13, "Manages users" + print " -d, --debug", " " * 12, "Enable debug mode" + print " -s, --setup", " " * 12, "Run Setup Assistant" + print " --configdir=", " " * 6, "Run with as config directory" + print " -p, --pidfile=", " " * 3, "Set pidfile to " + print " --changedir", " " * 12, "Change config dir permanently" + print " --daemon", " " * 15, "Daemonmize after start" + print " --no-remote", " " * 12, "Disable remote access (saves RAM)" + print " --status", " " * 15, "Display pid if running or False" + print " --clean", " " * 16, "Remove .pyc/.pyo files" + print " -q, --quit", " " * 13, "Quit running pyLoad instance" + print " -h, --help", " " * 13, "Display this help screen" + print + + def toggle_pause(self): + if self.threadManager.pause: + self.threadManager.pause = False + return False + elif not self.threadManager.pause: + self.threadManager.pause = True + return True + + def quit(self, a, b): + self.shutdown() + self.log.info(_("Received Quit signal")) + _exit(1) + + def writePidFile(self): + self.deletePidFile() + pid = os.getpid() + f = open(self.pidfile, "wb") + f.write(str(pid)) + f.close() + + def deletePidFile(self): + if self.checkPidFile(): + self.log.debug("Deleting old pidfile %s" % self.pidfile) + os.remove(self.pidfile) + + def checkPidFile(self): + """ return pid as int or 0""" + if os.path.isfile(self.pidfile): + f = open(self.pidfile, "rb") + pid = f.read().strip() + f.close() + if pid: + pid = int(pid) + return pid + + return 0 + + def isAlreadyRunning(self): + pid = self.checkPidFile() + if not pid or os.name == "nt": return False + try: + os.kill(pid, 0) # 0 - default signal (does nothing) + except: + return 0 + + return pid + + def quitInstance(self): + if os.name == "nt": + print "Not supported on windows." + return + + pid = self.isAlreadyRunning() + if not pid: + print "No pyLoad running." + return + + try: + os.kill(pid, 3) #SIGUIT + + t = time() + print "waiting for pyLoad to quit" + + while exists(self.pidfile) and t + 10 > time(): + sleep(0.25) + + if not exists(self.pidfile): + print "pyLoad successfully stopped" + else: + os.kill(pid, 9) #SIGKILL + print "pyLoad did not respond" + print "Kill signal was send to process with id %s" % pid + + except: + print "Error quitting pyLoad" + + + def cleanTree(self): + for path, dirs, files in walk(self.path("")): + for f in files: + if not f.endswith(".pyo") and not f.endswith(".pyc"): + continue + + if "_25" in f or "_26" in f or "_27" in f: + continue + + print join(path, f) + remove(join(path, f)) + + def start(self, rpc=True, web=True): + """ starts the fun :D """ + + self.version = CURRENT_VERSION + + if not exists("pyload.conf"): + from pyload.setup import Setup + + print "This is your first start, running configuration assistent now." + self.config = ConfigParser() + s = Setup(pypath, self.config) + res = False + try: + res = s.start() + except SystemExit: + pass + except KeyboardInterrupt: + print "\nSetup interrupted" + except: + res = False + print_exc() + print "Setup failed" + if not res: + remove("pyload.conf") + + exit() + + try: signal.signal(signal.SIGQUIT, self.quit) + except: pass + + self.config = ConfigParser() + + gettext.setpaths([join(os.sep, "usr", "share", "pyload", "locale"), None]) + translation = gettext.translation("pyLoad", self.path("locale"), + languages=[self.config['general']['language'], "en"], fallback=True) + translation.install(True) + + self.debug = self.doDebug or self.config['general']['debug_mode'] + self.remote &= self.config['remote']['activated'] + + pid = self.isAlreadyRunning() + if pid: + print _("pyLoad already running with pid %s") % pid + exit() + + if os.name != "nt" and self.config["general"]["renice"]: + os.system("renice %d %d" % (self.config["general"]["renice"], os.getpid())) + + if self.config["permission"]["change_group"]: + if os.name != "nt": + try: + from grp import getgrnam + + group = getgrnam(self.config["permission"]["group"]) + os.setgid(group[2]) + except Exception, e: + print _("Failed changing group: %s") % e + + if self.config["permission"]["change_user"]: + if os.name != "nt": + try: + from pwd import getpwnam + + user = getpwnam(self.config["permission"]["user"]) + os.setuid(user[2]) + except Exception, e: + print _("Failed changing user: %s") % e + + self.check_file(self.config['log']['log_folder'], _("folder for logs"), True) + + if self.debug: + self.init_logger(logging.DEBUG) # logging level + else: + self.init_logger(logging.INFO) # logging level + + self.do_kill = False + self.do_restart = False + self.shuttedDown = False + + self.log.info(_("Starting") + " pyLoad %s" % CURRENT_VERSION) + self.log.info(_("Using home directory: %s") % getcwd()) + + self.writePidFile() + + #@TODO refractor + + remote.activated = self.remote + self.log.debug("Remote activated: %s" % self.remote) + + self.check_install("Crypto", _("pycrypto to decode container files")) + #img = self.check_install("Image", _("Python Image Library (PIL) for captcha reading")) + #self.check_install("pycurl", _("pycurl to download any files"), True, True) + self.check_file("tmp", _("folder for temporary files"), True) + #tesser = self.check_install("tesseract", _("tesseract for captcha reading"), False) if os.name != "nt" else True + + self.captcha = True # checks seems to fail, although tesseract is available + + self.check_file(self.config['general']['download_folder'], _("folder for downloads"), True) + + if self.config['ssl']['activated']: + self.check_install("OpenSSL", _("OpenSSL for secure connection")) + + self.setupDB() + if self.config.oldRemoteData: + self.log.info(_("Moving old user config to DB")) + self.db.addUser(self.config.oldRemoteData["username"], self.config.oldRemoteData["password"]) + + self.log.info(_("Please check your logindata with ./pyload.py -u")) + + if self.deleteLinks: + self.log.info(_("All links removed")) + self.db.purgeLinks() + + self.requestFactory = RequestFactory(self) + __builtin__.pyreq = self.requestFactory + + self.lastClientConnected = 0 + + # later imported because they would trigger api import, and remote value not set correctly + from pyload import Api + from pyload.HookManager import HookManager + from pyload.ThreadManager import ThreadManager + + if Api.activated != self.remote: + self.log.warning("Import error: API remote status not correct.") + + self.api = Api.Api(self) + + self.scheduler = Scheduler(self) + + #hell yeah, so many important managers :D + self.pluginManager = PluginManager(self) + self.pullManager = PullManager(self) + self.accountManager = AccountManager(self) + self.threadManager = ThreadManager(self) + self.captchaManager = CaptchaManager(self) + self.hookManager = HookManager(self) + self.remoteManager = RemoteManager(self) + + self.js = JsEngine() + + self.log.info(_("Downloadtime: %s") % self.api.isTimeDownload()) + + if rpc: + self.remoteManager.startBackends() + + if web: + self.init_webserver() + + spaceLeft = freeSpace(self.config["general"]["download_folder"]) + + self.log.info(_("Free space: %s") % formatSize(spaceLeft)) + + self.config.save() #save so config files gets filled + + link_file = join(pypath, "links.txt") + + if exists(link_file): + f = open(link_file, "rb") + if f.read().strip(): + self.api.addPackage("links.txt", [link_file], 1) + f.close() + + link_file = "links.txt" + if exists(link_file): + f = open(link_file, "rb") + if f.read().strip(): + self.api.addPackage("links.txt", [link_file], 1) + f.close() + + #self.scheduler.addJob(0, self.accountManager.getAccountInfos) + self.log.info(_("Activating Accounts...")) + self.accountManager.getAccountInfos() + + self.threadManager.pause = False + self.running = True + + self.log.info(_("Activating Plugins...")) + self.hookManager.coreReady() + + self.log.info(_("pyLoad is up and running")) + + #test api +# from pyload.common.APIExerciser import startApiExerciser +# startApiExerciser(self, 3) + + #some memory stats +# from guppy import hpy +# hp=hpy() +# import objgraph +# objgraph.show_most_common_types(limit=20) +# import memdebug +# memdebug.start(8002) + + locals().clear() + + while True: + sleep(2) + if self.do_restart: + self.log.info(_("restarting pyLoad")) + self.restart() + if self.do_kill: + self.shutdown() + self.log.info(_("pyLoad quits")) + self.removeLogger() + _exit(0) #@TODO thrift blocks shutdown + + self.threadManager.work() + self.scheduler.work() + + def setupDB(self): + self.db = DatabaseBackend(self) # the backend + self.db.setup() + + self.files = FileHandler(self) + self.db.manager = self.files #ugly? + + def init_webserver(self): + if self.config['webinterface']['activated']: + self.webserver = WebServer(self) + self.webserver.start() + + def init_logger(self, level): + console = logging.StreamHandler(sys.stdout) + 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 + + if self.config['log']['file_log']: + if self.config['log']['log_rotate']: + file_handler = logging.handlers.RotatingFileHandler(join(self.config['log']['log_folder'], 'log.txt'), + maxBytes=self.config['log']['log_size'] * 1024, + backupCount=int(self.config['log']['log_count']), + encoding="utf8") + else: + file_handler = logging.FileHandler(join(self.config['log']['log_folder'], 'log.txt'), encoding="utf8") + + file_handler.setFormatter(frm) + self.log.addHandler(file_handler) + + self.log.addHandler(console) #if console logging + self.log.setLevel(level) + + def removeLogger(self): + for h in list(self.log.handlers): + self.log.removeHandler(h) + h.close() + + def check_install(self, check_name, legend, python=True, essential=False): + """check wether needed tools are installed""" + try: + if python: + find_module(check_name) + else: + pipe = subprocess.PIPE + subprocess.Popen(check_name, stdout=pipe, stderr=pipe) + + return True + except: + if essential: + self.log.info(_("Install %s") % legend) + exit() + + return False + + def check_file(self, check_names, description="", folder=False, empty=True, essential=False, quiet=False): + """check wether needed files exists""" + tmp_names = [] + if not type(check_names) == list: + tmp_names.append(check_names) + else: + tmp_names.extend(check_names) + file_created = True + file_exists = True + for tmp_name in tmp_names: + if not exists(tmp_name): + file_exists = False + if empty: + try: + if folder: + tmp_name = tmp_name.replace("/", sep) + makedirs(tmp_name) + else: + open(tmp_name, "w") + except: + file_created = False + else: + file_created = False + + if not file_exists and not quiet: + if file_created: + #self.log.info( _("%s created") % description ) + pass + else: + if not empty: + self.log.warning( + _("could not find %(desc)s: %(name)s") % {"desc": description, "name": tmp_name}) + else: + print _("could not create %(desc)s: %(name)s") % {"desc": description, "name": tmp_name} + if essential: + exit() + + def isClientConnected(self): + return (self.lastClientConnected + 30) > time() + + def restart(self): + self.shutdown() + chdir(owd) + # close some open fds + for i in range(3, 50): + try: + close(i) + except : + pass + + execl(executable, executable, *sys.argv) + _exit(0) + + def shutdown(self): + self.log.info(_("shutting down...")) + try: + if self.config['webinterface']['activated'] and hasattr(self, "webserver"): + self.webserver.quit() + + for thread in self.threadManager.threads: + thread.put("quit") + pyfiles = self.files.cache.values() + + for pyfile in pyfiles: + pyfile.abortDownload() + + self.hookManager.coreExiting() + + except: + if self.debug: + print_exc() + self.log.info(_("error while shutting down")) + + finally: + self.files.syncSave() + self.shuttedDown = True + + self.deletePidFile() + + + def path(self, *args): + return join(pypath, *args) + + +def deamon(): + try: + pid = os.fork() + if pid > 0: + sys.exit(0) + except OSError, e: + print >> sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) + sys.exit(1) + + # decouple from parent environment + os.setsid() + os.umask(0) + + # do second fork + try: + pid = os.fork() + if pid > 0: + # exit from second parent, print eventual PID before + print "Daemon PID %d" % pid + sys.exit(0) + except OSError, e: + print >> sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) + sys.exit(1) + + # Iterate through and close some file descriptors. + for fd in range(0, 3): + try: + os.close(fd) + except OSError: # ERROR, fd wasn't open to begin with (ignored) + pass + + os.open(os.devnull, os.O_RDWR) # standard input (0) + os.dup2(0, 1) # standard output (1) + os.dup2(0, 2) + + pyload_core = Core() + pyload_core.start() + + +def main(): + if "--daemon" in sys.argv: + deamon() + else: + pyload_core = Core() + try: + pyload_core.start() + except KeyboardInterrupt: + pyload_core.shutdown() + pyload_core.log.info(_("killed pyLoad from Terminal")) + pyload_core.removeLogger() + _exit(1) + +# And so it begins... +if __name__ == "__main__": + main() diff --git a/pyload/HookManager.py b/pyload/HookManager.py new file mode 100644 index 000000000..7545b4d60 --- /dev/null +++ b/pyload/HookManager.py @@ -0,0 +1,305 @@ +# -*- 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 . + + @author: RaNaN, mkaay + @interface-version: 0.1 +""" +import __builtin__ + +import traceback +from thread import start_new_thread +from threading import RLock + +from types import MethodType + +from pyload.threads.PluginThread import HookThread +from pyload.plugins.PluginManager import literal_eval +from utils import lock + +class HookManager: + """Manages hooks, delegates and handles Events. + + Every plugin can define events, \ + but some very usefull events are called by the Core. + Contrary to overwriting hook methods you can use event listener, + which provides additional entry point in the control flow. + Only do very short tasks or use threads. + + **Known Events:** + Most hook methods exists as events. These are the additional known events. + + ===================== ============== ================================== + Name Arguments Description + ===================== ============== ================================== + downloadPreparing fid A download was just queued and will be prepared now. + downloadStarts fid A plugin will immediately starts the download afterwards. + linksAdded links, pid Someone just added links, you are able to modify the links. + allDownloadsProcessed Every link was handled, pyload would idle afterwards. + allDownloadsFinished Every download in queue is finished. + unrarFinished folder, fname An Unrar job finished + configChanged The config was changed via the api. + pluginConfigChanged The plugin config changed, due to api or internal process. + ===================== ============== ================================== + + | Notes: + | allDownloadsProcessed is *always* called before allDownloadsFinished. + | configChanged is *always* called before pluginConfigChanged. + + + """ + + def __init__(self, core): + self.core = core + self.config = self.core.config + + __builtin__.hookManager = self #needed to let hooks register themself + + self.log = self.core.log + self.plugins = [] + self.pluginMap = {} + self.methods = {} #dict of names and list of methods usable by rpc + + self.events = {} # contains events + + #registering callback for config event + self.config.pluginCB = MethodType(self.dispatchEvent, "pluginConfigChanged", basestring) + + self.addEvent("pluginConfigChanged", self.manageHooks) + + self.lock = RLock() + self.createIndex() + + def try_catch(func): + def new(*args): + try: + return func(*args) + except Exception, e: + args[0].log.error(_("Error executing hooks: %s") % str(e)) + if args[0].core.debug: + traceback.print_exc() + + return new + + + def addRPC(self, plugin, func, doc): + plugin = plugin.rpartition(".")[2] + doc = doc.strip() if doc else "" + + if plugin in self.methods: + self.methods[plugin][func] = doc + else: + self.methods[plugin] = {func: doc} + + def callRPC(self, plugin, func, args, parse): + if not args: args = tuple() + if parse: + args = tuple([literal_eval(x) for x in args]) + + plugin = self.pluginMap[plugin] + f = getattr(plugin, func) + return f(*args) + + + def createIndex(self): + plugins = [] + + active = [] + deactive = [] + + for pluginname in self.core.pluginManager.hookPlugins: + try: + #hookClass = getattr(plugin, plugin.__name__) + + if self.config.getPlugin(pluginname, "activated"): + pluginClass = self.core.pluginManager.loadClass("hooks", pluginname) + if not pluginClass: continue + + plugin = pluginClass(self.core, self) + plugins.append(plugin) + self.pluginMap[pluginClass.__name__] = plugin + if plugin.isActivated(): + active.append(pluginClass.__name__) + else: + deactive.append(pluginname) + + + except: + self.log.warning(_("Failed activating %(name)s") % {"name": pluginname}) + if self.core.debug: + traceback.print_exc() + + self.log.info(_("Activated plugins: %s") % ", ".join(sorted(active))) + self.log.info(_("Deactivate plugins: %s") % ", ".join(sorted(deactive))) + + self.plugins = plugins + + def manageHooks(self, plugin, name, value): + if name == "activated" and value: + self.activateHook(plugin) + elif name == "activated" and not value: + self.deactivateHook(plugin) + + def activateHook(self, plugin): + + #check if already loaded + for inst in self.plugins: + if inst.__name__ == plugin: + return + + pluginClass = self.core.pluginManager.loadClass("hooks", plugin) + + if not pluginClass: return + + self.log.debug("Plugin loaded: %s" % plugin) + + plugin = pluginClass(self.core, self) + self.plugins.append(plugin) + self.pluginMap[pluginClass.__name__] = plugin + + # call core Ready + start_new_thread(plugin.coreReady, tuple()) + + def deactivateHook(self, plugin): + + hook = None + for inst in self.plugins: + if inst.__name__ == plugin: + hook = inst + + if not hook: return + + self.log.debug("Plugin unloaded: %s" % plugin) + + hook.unload() + + #remove periodic call + self.log.debug("Removed callback %s" % self.core.scheduler.removeJob(hook.cb)) + self.plugins.remove(hook) + del self.pluginMap[hook.__name__] + + + @try_catch + def coreReady(self): + for plugin in self.plugins: + if plugin.isActivated(): + plugin.coreReady() + + self.dispatchEvent("coreReady") + + @try_catch + def coreExiting(self): + for plugin in self.plugins: + if plugin.isActivated(): + plugin.coreExiting() + + self.dispatchEvent("coreExiting") + + @lock + def downloadPreparing(self, pyfile): + for plugin in self.plugins: + if plugin.isActivated(): + plugin.downloadPreparing(pyfile) + + self.dispatchEvent("downloadPreparing", pyfile) + + @lock + def downloadFinished(self, pyfile): + for plugin in self.plugins: + if plugin.isActivated(): + plugin.downloadFinished(pyfile) + + self.dispatchEvent("downloadFinished", pyfile) + + @lock + @try_catch + def downloadFailed(self, pyfile): + for plugin in self.plugins: + if plugin.isActivated(): + plugin.downloadFailed(pyfile) + + self.dispatchEvent("downloadFailed", pyfile) + + @lock + def packageFinished(self, package): + for plugin in self.plugins: + if plugin.isActivated(): + plugin.packageFinished(package) + + self.dispatchEvent("packageFinished", package) + + @lock + def beforeReconnecting(self, ip): + for plugin in self.plugins: + plugin.beforeReconnecting(ip) + + self.dispatchEvent("beforeReconnecting", ip) + + @lock + def afterReconnecting(self, ip): + for plugin in self.plugins: + if plugin.isActivated(): + plugin.afterReconnecting(ip) + + self.dispatchEvent("afterReconnecting", ip) + + def startThread(self, function, *args, **kwargs): + t = HookThread(self.core.threadManager, function, args, kwargs) + + def activePlugins(self): + """ returns all active plugins """ + return [x for x in self.plugins if x.isActivated()] + + def getAllInfo(self): + """returns info stored by hook plugins""" + info = {} + for name, plugin in self.pluginMap.iteritems(): + if plugin.info: + #copy and convert so str + info[name] = dict([(x, str(y) if not isinstance(y, basestring) else y) for x, y in plugin.info.iteritems()]) + return info + + + def getInfo(self, plugin): + info = {} + if plugin in self.pluginMap and self.pluginMap[plugin].info: + info = dict([(x, str(y) if not isinstance(y, basestring) else y) + for x, y in self.pluginMap[plugin].info.iteritems()]) + + return info + + def addEvent(self, event, func): + """Adds an event listener for event name""" + if event in self.events: + self.events[event].append(func) + else: + self.events[event] = [func] + + def removeEvent(self, event, func): + """removes previously added event listener""" + if event in self.events: + self.events[event].remove(func) + + def dispatchEvent(self, event, *args): + """dispatches event with args""" + if event in self.events: + for f in self.events[event]: + try: + f(*args) + except Exception, e: + self.log.warning("Error calling event handler %s: %s, %s, %s" + % (event, f, args, str(e))) + if self.core.debug: + traceback.print_exc() diff --git a/pyload/InitHomeDir.py b/pyload/InitHomeDir.py new file mode 100644 index 000000000..ca229fb1e --- /dev/null +++ b/pyload/InitHomeDir.py @@ -0,0 +1,79 @@ +# -*- 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 . + + @author: RaNaN + + This modules inits working directories and global variables, pydir and homedir +""" + +from os import makedirs, path, chdir +from os.path import join +import sys +from sys import argv, platform + +import __builtin__ + +__builtin__.owd = path.abspath("") # original working directory +__builtin__.pypath = path.abspath(path.join(__file__, "..", "..")) + +sys.path.append(join(pypath, "pyload", "lib")) + +homedir = "" + +if platform == 'nt': + homedir = path.expanduser("~") + if homedir == "~": + import ctypes + + CSIDL_APPDATA = 26 + _SHGetFolderPath = ctypes.windll.shell32.SHGetFolderPathW + _SHGetFolderPath.argtypes = [ctypes.wintypes.HWND, + ctypes.c_int, + ctypes.wintypes.HANDLE, + ctypes.wintypes.DWORD, ctypes.wintypes.LPCWSTR] + + path_buf = ctypes.wintypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) + result = _SHGetFolderPath(0, CSIDL_APPDATA, 0, 0, path_buf) + homedir = path_buf.value +else: + homedir = path.expanduser("~") + +__builtin__.homedir = homedir + +args = " ".join(argv[1:]) + +# dirty method to set configdir from commandline arguments +if "--configdir=" in args: + for aa in argv: + if aa.startswith("--configdir="): + configdir = aa.replace("--configdir=", "", 1).strip() +elif path.exists(path.join(pypath, "pyload", "config", "configdir")): + f = open(path.join(pypath, "pyload", "config", "configdir"), "rb") + c = f.read().strip() + f.close() + configdir = path.join(pypath, c) +else: + if platform in ("posix", "linux2"): + configdir = path.join(homedir, ".pyload") + else: + configdir = path.join(homedir, "pyload") + +if not path.exists(configdir): + makedirs(configdir, 0700) + +__builtin__.configdir = configdir +chdir(configdir) + +#print "Using %s as working directory." % configdir diff --git a/pyload/PullEvents.py b/pyload/PullEvents.py new file mode 100644 index 000000000..0739b4ec8 --- /dev/null +++ b/pyload/PullEvents.py @@ -0,0 +1,120 @@ +# -*- 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 . + + @author: mkaay +""" + +from time import time +from pyload.utils import uniqify + +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("collector").toList()] + return uniqify(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" + 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" + 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" + 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" + self.destination = destination + + def toList(self): + return ["reload", self.destination] + +class AccountUpdateEvent: + def toList(self): + return ["account"] + +class ConfigUpdateEvent: + def toList(self): + return ["config"] diff --git a/pyload/PyFile.py b/pyload/PyFile.py new file mode 100644 index 000000000..c4ce71570 --- /dev/null +++ b/pyload/PyFile.py @@ -0,0 +1,284 @@ +""" + 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 . + + @author: RaNaN + @author: mkaay +""" + +from pyload.PullEvents import UpdateEvent +from pyload.utils import formatSize, lock + +from time import sleep, time + +from threading import RLock + +statusMap = { + "finished": 0, + "offline": 1, + "online": 2, + "queued": 3, + "skipped": 4, + "waiting": 5, + "temp. offline": 6, + "starting": 7, + "failed": 8, + "aborted": 9, + "decrypting": 10, + "custom": 11, + "downloading": 12, + "processing": 13, + "unknown": 14, +} + + +def setSize(self, value): + self._size = int(value) + +class PyFile(object): + """ + Represents a file object at runtime + """ + __slots__ = ("m", "id", "url", "name", "size", "_size", "status", "pluginname", "packageid", + "error", "order", "lock", "plugin", "waitUntil", "active", "abort", "statusname", + "reconnected", "progress", "maxprogress", "pluginmodule", "pluginclass") + + def __init__(self, manager, id, url, name, size, status, error, pluginname, package, order): + self.m = manager + + self.id = int(id) + self.url = url + self.name = name + self.size = size + self.status = status + self.pluginname = pluginname + self.packageid = package #should not be used, use package() instead + self.error = error + self.order = order + # database information ends here + + self.lock = RLock() + + self.plugin = None + #self.download = None + + self.waitUntil = 0 # time() + time to wait + + # status attributes + self.active = False #obsolete? + self.abort = False + self.reconnected = False + + self.statusname = None + + self.progress = 0 + self.maxprogress = 100 + + self.m.cache[int(id)] = self + + + # will convert all sizes to ints + size = property(lambda self: self._size, setSize) + + def __repr__(self): + return "PyFile %s: %s@%s" % (self.id, self.name, self.pluginname) + + @lock + def initPlugin(self): + """ inits plugin instance """ + if not self.plugin: + self.pluginmodule = self.m.core.pluginManager.getPlugin(self.pluginname) + self.pluginclass = getattr(self.pluginmodule, self.m.core.pluginManager.getPluginName(self.pluginname)) + self.plugin = self.pluginclass(self) + + @lock + def hasPlugin(self): + """Thread safe way to determine this file has initialized plugin attribute + + :return: + """ + return hasattr(self, "plugin") and self.plugin + + def package(self): + """ return package instance""" + return self.m.getPackage(self.packageid) + + def setStatus(self, status): + self.status = statusMap[status] + self.sync() #@TODO needed aslong no better job approving exists + + def setCustomStatus(self, msg, status="processing"): + self.statusname = msg + self.setStatus(status) + + def getStatusName(self): + if self.status not in (13, 14) or not self.statusname: + return self.m.statusMsg[self.status] + else: + return self.statusname + + def hasStatus(self, status): + return statusMap[status] == self.status + + def sync(self): + """sync PyFile instance with database""" + self.m.updateLink(self) + + @lock + def release(self): + """sync and remove from cache""" + # file has valid package + if self.packageid > 0: + self.sync() + + if hasattr(self, "plugin") and self.plugin: + self.plugin.clean() + del self.plugin + + self.m.releaseLink(self.id) + + def delete(self): + """delete pyfile from database""" + self.m.deleteLink(self.id) + + def toDict(self): + """return dict with all information for interface""" + return self.toDbDict() + + def toDbDict(self): + """return data as dict for databse + + format: + + { + id: {'url': url, 'name': name ... } + } + + """ + return { + self.id: { + 'id': self.id, + 'url': self.url, + 'name': self.name, + 'plugin': self.pluginname, + 'size': self.getSize(), + 'format_size': self.formatSize(), + 'status': self.status, + 'statusmsg': self.getStatusName(), + 'package': self.packageid, + 'error': self.error, + 'order': self.order + } + } + + def abortDownload(self): + """abort pyfile if possible""" + while self.id in self.m.core.threadManager.processingIds(): + self.abort = True + if self.plugin and self.plugin.req: + self.plugin.req.abortDownloads() + sleep(0.1) + + self.abort = False + if self.hasPlugin() and self.plugin.req: + self.plugin.req.abortDownloads() + + self.release() + + def finishIfDone(self): + """set status to finish and release file if every thread is finished with it""" + + if self.id in self.m.core.threadManager.processingIds(): + return False + + self.setStatus("finished") + self.release() + self.m.checkAllLinksFinished() + return True + + def checkIfProcessed(self): + self.m.checkAllLinksProcessed(self.id) + + def formatWait(self): + """ formats and return wait time in humanreadable format """ + seconds = self.waitUntil - time() + + if seconds < 0: return "00:00:00" + + hours, seconds = divmod(seconds, 3600) + minutes, seconds = divmod(seconds, 60) + return "%.2i:%.2i:%.2i" % (hours, minutes, seconds) + + def formatSize(self): + """ formats size to readable format """ + return formatSize(self.getSize()) + + def formatETA(self): + """ formats eta to readable format """ + seconds = self.getETA() + + if seconds < 0: return "00:00:00" + + hours, seconds = divmod(seconds, 3600) + minutes, seconds = divmod(seconds, 60) + return "%.2i:%.2i:%.2i" % (hours, minutes, seconds) + + def getSpeed(self): + """ calculates speed """ + try: + return self.plugin.req.speed + except: + return 0 + + def getETA(self): + """ gets established time of arrival""" + try: + return self.getBytesLeft() / self.getSpeed() + except: + return 0 + + def getBytesLeft(self): + """ gets bytes left """ + try: + return self.getSize() - self.plugin.req.arrived + except: + return 0 + + def getPercent(self): + """ get % of download """ + if self.status == 12: + try: + return self.plugin.req.percent + except: + return 0 + else: + return self.progress + + def getSize(self): + """ get size of download """ + try: + if self.plugin.req.size: + return self.plugin.req.size + else: + return self.size + except: + return self.size + + def notifyChange(self): + e = UpdateEvent("file", self.id, "collector" if not self.package().queue else "queue") + self.m.core.pullManager.addEvent(e) + + def setProgress(self, value): + if not value == self.progress: + self.progress = value + self.notifyChange() diff --git a/pyload/PyPackage.py b/pyload/PyPackage.py new file mode 100644 index 000000000..3961d8a70 --- /dev/null +++ b/pyload/PyPackage.py @@ -0,0 +1,79 @@ +""" + 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 . + + @author: RaNaN + @author: mkaay +""" + +from pyload.PullEvents import UpdateEvent +from pyload.utils import safe_filename + +class PyPackage: + """ + Represents a package object at runtime + """ + def __init__(self, manager, id, name, folder, site, password, queue, order): + self.m = manager + self.m.packageCache[int(id)] = self + + self.id = int(id) + self.name = name + self._folder = folder + self.site = site + self.password = password + self.queue = queue + self.order = order + self.setFinished = False + + @property + def folder(self): + return safe_filename(self._folder) + + def toDict(self): + """ Returns a dictionary representation of the data. + + :return: dict: {id: { attr: value }} + """ + return { + self.id: { + 'id': self.id, + 'name': self.name, + 'folder': self.folder, + 'site': self.site, + 'password': self.password, + 'queue': self.queue, + 'order': self.order, + 'links': {} + } + } + + def getChildren(self): + """get information about contained links""" + return self.m.getPackageData(self.id)["links"] + + def sync(self): + """sync with db""" + self.m.updatePackage(self) + + def release(self): + """sync and delete from cache""" + self.sync() + self.m.releasePackage(self.id) + + def delete(self): + self.m.deletePackage(self.id) + + def notifyChange(self): + e = UpdateEvent("pack", self.id, "collector" if not self.queue else "queue") + self.m.core.pullManager.addEvent(e) diff --git a/pyload/Scheduler.py b/pyload/Scheduler.py new file mode 100644 index 000000000..71b5f96af --- /dev/null +++ b/pyload/Scheduler.py @@ -0,0 +1,141 @@ +# -*- 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 . + + @author: mkaay +""" + +from time import time +from heapq import heappop, heappush +from thread import start_new_thread +from threading import Lock + +class AlreadyCalled(Exception): + pass + + +class Deferred: + def __init__(self): + self.call = [] + self.result = () + + def addCallback(self, f, *cargs, **ckwargs): + self.call.append((f, cargs, ckwargs)) + + def callback(self, *args, **kwargs): + if self.result: + raise AlreadyCalled + self.result = (args, kwargs) + for f, cargs, ckwargs in self.call: + args += tuple(cargs) + kwargs.update(ckwargs) + f(*args ** kwargs) + + +class Scheduler: + def __init__(self, core): + self.core = core + + self.queue = PriorityQueue() + + def addJob(self, t, call, args=[], kwargs={}, threaded=True): + d = Deferred() + t += time() + j = Job(t, call, args, kwargs, d, threaded) + self.queue.put((t, j)) + return d + + + def removeJob(self, d): + """ + :param d: defered object + :return: if job was deleted + """ + index = -1 + + for i, j in enumerate(self.queue): + if j[1].deferred == d: + index = i + + if index >= 0: + del self.queue[index] + return True + + return False + + def work(self): + while True: + t, j = self.queue.get() + if not j: + break + else: + if t <= time(): + j.start() + else: + self.queue.put((t, j)) + break + + +class Job: + def __init__(self, time, call, args=[], kwargs={}, deferred=None, threaded=True): + self.time = float(time) + self.call = call + self.args = args + self.kwargs = kwargs + self.deferred = deferred + self.threaded = threaded + + def run(self): + ret = self.call(*self.args, **self.kwargs) + if self.deferred is None: + return + else: + self.deferred.callback(ret) + + def start(self): + if self.threaded: + start_new_thread(self.run, ()) + else: + self.run() + + +class PriorityQueue: + """ a non blocking priority queue """ + + def __init__(self): + self.queue = [] + self.lock = Lock() + + def __iter__(self): + return iter(self.queue) + + def __delitem__(self, key): + del self.queue[key] + + def put(self, element): + self.lock.acquire() + heappush(self.queue, element) + self.lock.release() + + def get(self): + """ return element or None """ + self.lock.acquire() + try: + el = heappop(self.queue) + return el + except IndexError: + return None, None + finally: + self.lock.release() diff --git a/pyload/ThreadManager.py b/pyload/ThreadManager.py new file mode 100644 index 000000000..d9a6e1b8c --- /dev/null +++ b/pyload/ThreadManager.py @@ -0,0 +1,317 @@ +# -*- 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 . + + @author: RaNaN +""" + +from os.path import exists, join +import re +from subprocess import Popen +from threading import Event, Lock +from time import sleep, time +from traceback import print_exc +from random import choice + +import pycurl + +from pyload.threads import PluginThread +from pyload.PyFile import PyFile +from pyload.network.RequestFactory import getURL +from pyload.utils import freeSpace, lock + + +class ThreadManager: + """manages the download threads, assign jobs, reconnect etc""" + + + def __init__(self, core): + """Constructor""" + self.core = core + self.log = core.log + + self.threads = [] # thread list + self.localThreads = [] #hook+decrypter threads + + self.pause = True + + self.reconnecting = Event() + self.reconnecting.clear() + self.downloaded = 0 #number of files downloaded since last cleanup + + self.lock = Lock() + + # some operations require to fetch url info from hoster, so we caching them so it wont be done twice + # contains a timestamp and will be purged after timeout + self.infoCache = {} + + # pool of ids for online check + self.resultIDs = 0 + + # threads which are fetching hoster results + self.infoResults = {} + #timeout for cache purge + self.timestamp = 0 + + pycurl.global_init(pycurl.GLOBAL_DEFAULT) + + for i in range(0, self.core.config.get("download", "max_downloads")): + self.createThread() + + + def createThread(self): + """create a download thread""" + + thread = PluginThread.DownloadThread(self) + self.threads.append(thread) + + def createInfoThread(self, data, pid): + """ + start a thread whichs fetches online status and other infos + data = [ .. () .. ] + """ + self.timestamp = time() + 5 * 60 + + PluginThread.InfoThread(self, data, pid) + + @lock + def createResultThread(self, data, add=False): + """ creates a thread to fetch online status, returns result id """ + self.timestamp = time() + 5 * 60 + + rid = self.resultIDs + self.resultIDs += 1 + + PluginThread.InfoThread(self, data, rid=rid, add=add) + + return rid + + + @lock + def getInfoResult(self, rid): + """returns result and clears it""" + self.timestamp = time() + 5 * 60 + + if rid in self.infoResults: + data = self.infoResults[rid] + self.infoResults[rid] = {} + return data + else: + return {} + + @lock + def setInfoResults(self, rid, result): + self.infoResults[rid].update(result) + + def getActiveFiles(self): + active = [x.active for x in self.threads if x.active and isinstance(x.active, PyFile)] + + for t in self.localThreads: + active.extend(t.getActiveFiles()) + + return active + + def processingIds(self): + """get a id list of all pyfiles processed""" + return [x.id for x in self.getActiveFiles()] + + + def work(self): + """run all task which have to be done (this is for repetivive call by core)""" + try: + self.tryReconnect() + except Exception, e: + self.log.error(_("Reconnect Failed: %s") % str(e) ) + self.reconnecting.clear() + if self.core.debug: + print_exc() + self.checkThreadCount() + + try: + self.assignJob() + except Exception, e: + self.log.warning("Assign job error", e) + if self.core.debug: + print_exc() + + sleep(0.5) + self.assignJob() + #it may be failed non critical so we try it again + + if (self.infoCache or self.infoResults) and self.timestamp < time(): + self.infoCache.clear() + self.infoResults.clear() + self.log.debug("Cleared Result cache") + + #-------------------------------------------------------------------------- + def tryReconnect(self): + """checks if reconnect needed""" + + if not (self.core.config["reconnect"]["activated"] and self.core.api.isTimeReconnect()): + return False + + active = [x.active.plugin.wantReconnect and x.active.plugin.waiting for x in self.threads if x.active] + + if not (0 < active.count(True) == len(active)): + return False + + if not exists(self.core.config['reconnect']['method']): + if exists(join(pypath, self.core.config['reconnect']['method'])): + self.core.config['reconnect']['method'] = join(pypath, self.core.config['reconnect']['method']) + else: + self.core.config["reconnect"]["activated"] = False + self.log.warning(_("Reconnect script not found!")) + return + + self.reconnecting.set() + + #Do reconnect + self.log.info(_("Starting reconnect")) + + while [x.active.plugin.waiting for x in self.threads if x.active].count(True) != 0: + sleep(0.25) + + ip = self.getIP() + + self.core.hookManager.beforeReconnecting(ip) + + self.log.debug("Old IP: %s" % ip) + + try: + reconn = Popen(self.core.config['reconnect']['method'], bufsize=-1, shell=True)#, stdout=subprocess.PIPE) + except: + self.log.warning(_("Failed executing reconnect script!")) + self.core.config["reconnect"]["activated"] = False + self.reconnecting.clear() + if self.core.debug: + print_exc() + return + + reconn.wait() + sleep(1) + ip = self.getIP() + self.core.hookManager.afterReconnecting(ip) + + self.log.info(_("Reconnected, new IP: %s") % ip) + + self.reconnecting.clear() + + def getIP(self): + """retrieve current ip""" + services = [("http://automation.whatismyip.com/n09230945.asp", "(\S+)"), + ("http://checkip.dyndns.org/",".*Current IP Address: (\S+).*")] + + ip = "" + for i in range(10): + try: + sv = choice(services) + ip = getURL(sv[0]) + ip = re.match(sv[1], ip).group(1) + break + except: + ip = "" + sleep(1) + + return ip + + #-------------------------------------------------------------------------- + def checkThreadCount(self): + """checks if there are need for increasing or reducing thread count""" + + if len(self.threads) == self.core.config.get("download", "max_downloads"): + return True + elif len(self.threads) < self.core.config.get("download", "max_downloads"): + self.createThread() + else: + free = [x for x in self.threads if not x.active] + if free: + free[0].put("quit") + + + def cleanPycurl(self): + """ make a global curl cleanup (currently ununused) """ + if self.processingIds(): + return False + pycurl.global_cleanup() + pycurl.global_init(pycurl.GLOBAL_DEFAULT) + self.downloaded = 0 + self.log.debug("Cleaned up pycurl") + return True + + #-------------------------------------------------------------------------- + def assignJob(self): + """assing a job to a thread if possible""" + + if self.pause or not self.core.api.isTimeDownload(): return + + #if self.downloaded > 20: + # if not self.cleanPyCurl(): return + + free = [x for x in self.threads if not x.active] + + inuse = set([(x.active.pluginname, self.getLimit(x)) for x in self.threads if x.active and x.active.hasPlugin() and x.active.plugin.account]) + inuse = map(lambda x: (x[0], x[1], len([y for y in self.threads if y.active and y.active.pluginname == x[0]])) ,inuse) + onlimit = [x[0] for x in inuse if x[1] > 0 and x[2] >= x[1]] + + occ = [x.active.pluginname for x in self.threads if x.active and x.active.hasPlugin() and not x.active.plugin.multiDL] + onlimit + + occ.sort() + occ = tuple(set(occ)) + job = self.core.files.getJob(occ) + if job: + try: + job.initPlugin() + except Exception, e: + self.log.critical(str(e)) + print_exc() + job.setStatus("failed") + job.error = str(e) + job.release() + return + + if job.plugin.__type__ == "hoster": + spaceLeft = freeSpace(self.core.config["general"]["download_folder"]) / 1024 / 1024 + if spaceLeft < self.core.config["general"]["min_free_space"]: + self.log.warning(_("Not enough space left on device")) + self.pause = True + + if free and not self.pause: + thread = free[0] + #self.downloaded += 1 + + thread.put(job) + else: + #put job back + if occ not in self.core.files.jobCache: + self.core.files.jobCache[occ] = [] + self.core.files.jobCache[occ].append(job.id) + + #check for decrypt jobs + job = self.core.files.getDecryptJob() + if job: + job.initPlugin() + thread = PluginThread.DecrypterThread(self, job) + + + else: + thread = PluginThread.DecrypterThread(self, job) + + def getLimit(self, thread): + limit = thread.active.plugin.account.getAccountData(thread.active.plugin.user)["options"].get("limitDL", ["0"])[0] + return int(limit) + + def cleanup(self): + """do global cleanup, should be called when finished with pycurl""" + pycurl.global_cleanup() diff --git a/pyload/__init__.py b/pyload/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pyload/cli/AddPackage.py b/pyload/cli/AddPackage.py new file mode 100644 index 000000000..16b32b9ee --- /dev/null +++ b/pyload/cli/AddPackage.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# +#Copyright (C) 2011-2014 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 . +# +### + +from Handler import Handler +from printer import * + +class AddPackage(Handler): + """ let the user add packages """ + + def init(self): + self.name = "" + self.urls = [] + + def onEnter(self, inp): + if inp == "0": + self.cli.reset() + + if not self.name: + self.name = inp + self.setInput() + elif inp == "END": + #add package + self.client.addPackage(self.name, self.urls, 1) + self.cli.reset() + else: + if inp.strip(): + self.urls.append(inp) + self.setInput() + + def renderBody(self, line): + println(line, white(_("Add Package:"))) + println(line + 1, "") + line += 2 + + if not self.name: + println(line, _("Enter a name for the new package")) + println(line + 1, "") + line += 2 + else: + println(line, _("Package: %s") % self.name) + println(line + 1, _("Parse the links you want to add.")) + println(line + 2, _("Type %s when done.") % mag("END")) + println(line + 3, _("Links added: ") + mag(len(self.urls))) + line += 4 + + println(line, "") + println(line + 1, mag("0.") + _(" back to main menu")) + + return line + 2 diff --git a/pyload/cli/Cli.py b/pyload/cli/Cli.py new file mode 100644 index 000000000..20b82a0f2 --- /dev/null +++ b/pyload/cli/Cli.py @@ -0,0 +1,585 @@ +# -*- coding: utf-8 -*- +# +#Copyright (C) 2008-2014 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 . +# +### +from __future__ import with_statement +from getopt import GetoptError, getopt + +import pyload.common.pylgettext as gettext +import os +from os import _exit +from os.path import join, exists, abspath, basename +import sys +from sys import exit +from threading import Thread, Lock +from time import sleep +from traceback import print_exc + +import ConfigParser + +from codecs import getwriter + +if os.name == "nt": + enc = "cp850" +else: + enc = "utf8" + +sys.stdout = getwriter(enc)(sys.stdout, errors="replace") + +from pyload import InitHomeDir +from pyload.cli.printer import * +from pyload.cli import AddPackage, ManageFiles + +from pyload.Api import Destination +from pyload.utils import formatSize, decode +from pyload.remote.thriftbackend.ThriftClient import ThriftClient, NoConnection, NoSSL, WrongLogin, ConnectionClosed +from pyload.lib.Getch import Getch +from pyload.lib.rename_process import renameProcess + +class Cli: + def __init__(self, client, command): + self.client = client + self.command = command + + if not self.command: + renameProcess('pyload-cli') + self.getch = Getch() + self.input = "" + self.inputline = 0 + self.lastLowestLine = 0 + self.menuline = 0 + + self.lock = Lock() + + #processor funcions, these will be changed dynamically depending on control flow + self.headerHandler = self #the download status + self.bodyHandler = self #the menu section + self.inputHandler = self + + os.system("clear") + println(1, blue("py") + yellow("Load") + white(_(" Command Line Interface"))) + println(2, "") + + self.thread = RefreshThread(self) + self.thread.start() + + self.start() + else: + self.processCommand() + + def reset(self): + """ reset to initial main menu """ + self.input = "" + self.headerHandler = self.bodyHandler = self.inputHandler = self + + def start(self): + """ main loop. handle input """ + while True: + #inp = raw_input() + inp = self.getch.impl() + if ord(inp) == 3: + os.system("clear") + sys.exit() # ctrl + c + elif ord(inp) == 13: #enter + try: + self.lock.acquire() + self.inputHandler.onEnter(self.input) + + except Exception, e: + println(2, red(e)) + finally: + self.lock.release() + + elif ord(inp) == 127: + self.input = self.input[:-1] #backspace + try: + self.lock.acquire() + self.inputHandler.onBackSpace() + finally: + self.lock.release() + + elif ord(inp) == 27: #ugly symbol + pass + else: + self.input += inp + try: + self.lock.acquire() + self.inputHandler.onChar(inp) + finally: + self.lock.release() + + self.inputline = self.bodyHandler.renderBody(self.menuline) + self.renderFooter(self.inputline) + + + def refresh(self): + """refresh screen""" + + println(1, blue("py") + yellow("Load") + white(_(" Command Line Interface"))) + println(2, "") + + self.lock.acquire() + + self.menuline = self.headerHandler.renderHeader(3) + 1 + println(self.menuline - 1, "") + self.inputline = self.bodyHandler.renderBody(self.menuline) + self.renderFooter(self.inputline) + + self.lock.release() + + + def setInput(self, string=""): + self.input = string + + def setHandler(self, klass): + #create new handler with reference to cli + self.bodyHandler = self.inputHandler = klass(self) + self.input = "" + + def renderHeader(self, line): + """ prints download status """ + #print updated information + # print "\033[J" #clear screen + # self.println(1, blue("py") + yellow("Load") + white(_(" Command Line Interface"))) + # self.println(2, "") + # self.println(3, white(_("%s Downloads:") % (len(data)))) + + data = self.client.statusDownloads() + speed = 0 + + println(line, white(_("%s Downloads:") % (len(data)))) + line += 1 + + for download in data: + if download.status == 12: # downloading + percent = download.percent + z = percent / 4 + speed += download.speed + println(line, cyan(download.name)) + line += 1 + println(line, + blue("[") + yellow(z * "#" + (25 - z) * " ") + blue("] ") + green(str(percent) + "%") + _( + " Speed: ") + green(formatSize(download.speed) + "/s") + _(" Size: ") + green( + download.format_size) + _(" Finished in: ") + green(download.format_eta) + _( + " ID: ") + green(download.fid)) + line += 1 + if download.status == 5: + println(line, cyan(download.name)) + line += 1 + println(line, _("waiting: ") + green(download.format_wait)) + line += 1 + + println(line, "") + line += 1 + status = self.client.statusServer() + if status.pause: + paused = _("Status:") + " " + red(_("paused")) + else: + paused = _("Status:") + " " + red(_("running")) + + println(line,"%s %s: %s %s: %s %s: %s" % ( + paused, _("total Speed"), red(formatSize(speed) + "/s"), _("Files in queue"), red( + status.queue), _("Total"), red(status.total))) + + return line + 1 + + def renderBody(self, line): + """ prints initial menu """ + println(line, white(_("Menu:"))) + println(line + 1, "") + println(line + 2, mag("1.") + _(" Add Links")) + println(line + 3, mag("2.") + _(" Manage Queue")) + println(line + 4, mag("3.") + _(" Manage Collector")) + println(line + 5, mag("4.") + _(" (Un)Pause Server")) + println(line + 6, mag("5.") + _(" Kill Server")) + println(line + 7, mag("6.") + _(" Quit")) + + return line + 8 + + def renderFooter(self, line): + """ prints out the input line with input """ + println(line, "") + line += 1 + + println(line, white(" Input: ") + decode(self.input)) + + #clear old output + if line < self.lastLowestLine: + for i in range(line + 1, self.lastLowestLine + 1): + println(i, "") + + self.lastLowestLine = line + + #set cursor to position + print "\033[" + str(self.inputline) + ";0H" + + def onChar(self, char): + """ default no special handling for single chars """ + if char == "1": + self.setHandler(AddPackage) + elif char == "2": + self.setHandler(ManageFiles) + elif char == "3": + self.setHandler(ManageFiles) + self.bodyHandler.target = Destination.Collector + elif char == "4": + self.client.togglePause() + self.setInput() + elif char == "5": + self.client.kill() + self.client.close() + sys.exit() + elif char == "6": + os.system('clear') + sys.exit() + + def onEnter(self, inp): + pass + + def onBackSpace(self): + pass + + def processCommand(self): + command = self.command[0] + args = [] + if len(self.command) > 1: + args = self.command[1:] + + if command == "status": + files = self.client.statusDownloads() + + if not files: + print "No downloads running." + + for download in files: + if download.status == 12: # downloading + print print_status(download) + print "\tDownloading: %s @ %s/s\t %s (%s%%)" % ( + download.format_eta, formatSize(download.speed), formatSize(download.size - download.bleft), + download.percent) + elif download.status == 5: + print print_status(download) + print "\tWaiting: %s" % download.format_wait + else: + print print_status(download) + + elif command == "queue": + print_packages(self.client.getQueueData()) + + elif command == "collector": + print_packages(self.client.getCollectorData()) + + elif command == "add": + if len(args) < 2: + print _("Please use this syntax: add ...") + return + + self.client.addPackage(args[0], args[1:], Destination.Queue) + + elif command == "add_coll": + if len(args) < 2: + print _("Please use this syntax: add ...") + return + + self.client.addPackage(args[0], args[1:], Destination.Collector) + + elif command == "del_file": + self.client.deleteFiles([int(x) for x in args]) + print "Files deleted." + + elif command == "del_package": + self.client.deletePackages([int(x) for x in args]) + print "Packages deleted." + + elif command == "move": + for pid in args: + pack = self.client.getPackageInfo(int(pid)) + self.client.movePackage((pack.dest + 1) % 2, pack.pid) + + elif command == "check": + print _("Checking %d links:") % len(args) + print + rid = self.client.checkOnlineStatus(args).rid + self.printOnlineCheck(self.client, rid) + + + elif command == "check_container": + path = args[0] + if not exists(join(owd, path)): + print _("File does not exists.") + return + + f = open(join(owd, path), "rb") + content = f.read() + f.close() + + rid = self.client.checkOnlineStatusContainer([], basename(f.name), content).rid + self.printOnlineCheck(self.client, rid) + + + elif command == "pause": + self.client.pause() + + elif command == "unpause": + self.client.unpause() + + elif command == "toggle": + self.client.togglePause() + + elif command == "kill": + self.client.kill() + elif command == "restart_file": + for x in args: + self.client.restartFile(int(x)) + print "Files restarted." + elif command == "restart_package": + for pid in args: + self.client.restartPackage(int(pid)) + print "Packages restarted." + + else: + print_commands() + + def printOnlineCheck(self, client, rid): + while True: + sleep(1) + result = client.pollResults(rid) + for url, status in result.data.iteritems(): + if status.status == 2: check = "Online" + elif status.status == 1: check = "Offline" + else: check = "Unknown" + + print "%-45s %-12s\t %-15s\t %s" % (status.name, formatSize(status.size), status.plugin, check) + + if result.rid == -1: break + + +class RefreshThread(Thread): + def __init__(self, cli): + Thread.__init__(self) + self.setDaemon(True) + self.cli = cli + + def run(self): + while True: + sleep(1) + try: + self.cli.refresh() + except ConnectionClosed: + os.system("clear") + print _("pyLoad was terminated") + _exit(0) + except Exception, e: + println(2, red(str(e))) + self.cli.reset() + print_exc() + + +def print_help(config): + print + print "pyLoad CLI Copyright (c) 2008-2014 the pyLoad Team" + print + print "Usage: [python] pyload-cli.py [options] [command]" + print + print "" + print "See pyload-cli.py -c for a complete listing." + print + print "" + print " -i, --interactive", " Start in interactive mode" + print + print " -u, --username=", " " * 2, "Specify Username" + print " --pw=", " " * 2, "Password" + print " -a, --address=", " " * 3, "Specify address (current=%s)" % config["addr"] + print " -p, --port", " " * 7, "Specify port (current=%s)" % config["port"] + print + print " -l, --language", " " * 3, "Set user interface language (current=%s)" % config["language"] + print " -h, --help", " " * 7, "Display this help screen" + print " -c, --commands", " " * 3, "List all available commands" + print + + +def print_packages(data): + for pack in data: + print "Package %s (#%s):" % (pack.name, pack.pid) + for download in pack.links: + print "\t" + print_file(download) + print + + +def print_file(download): + return "#%(id)-6d %(name)-30s %(statusmsg)-10s %(plugin)-8s" % { + "id": download.fid, + "name": download.name, + "statusmsg": download.statusmsg, + "plugin": download.plugin + } + + +def print_status(download): + return "#%(id)-6s %(name)-40s Status: %(statusmsg)-10s Size: %(size)s" % { + "id": download.fid, + "name": download.name, + "statusmsg": download.statusmsg, + "size": download.format_size + } + + +def print_commands(): + commands = [("status", _("Prints server status")), + ("queue", _("Prints downloads in queue")), + ("collector", _("Prints downloads in collector")), + ("add ...", _("Adds package to queue")), + ("add_coll ...", _("Adds package to collector")), + ("del_file ...", _("Delete Files from Queue/Collector")), + ("del_package ...", _("Delete Packages from Queue/Collector")), + ("move ...", _("Move Packages from Queue to Collector or vice versa")), + ("restart_file ...", _("Restart files")), + ("restart_package ...", _("Restart packages")), + ("check ...", _("Check online status, works with local container")), + ("check_container path", _("Checks online status of a container file")), + ("pause", _("Pause the server")), + ("unpause", _("continue downloads")), + ("toggle", _("Toggle pause/unpause")), + ("kill", _("kill server")), ] + + print _("List of commands:") + print + for c in commands: + print "%-35s %s" % c + + +def writeConfig(opts): + try: + with open(join(homedir, ".pyload-cli"), "w") as cfgfile: + cfgfile.write("[cli]") + for opt in opts: + cfgfile.write("%s=%s\n" % (opt, opts[opt])) + except: + print _("Couldn't write user config file") + + +def main(): + config = {"addr": "127.0.0.1", "port": "7227", "language": "en"} + try: + config["language"] = os.environ["LANG"][0:2] + except: + pass + + if (not exists(join(pypath, "locale", config["language"]))) or config["language"] == "": + config["language"] = "en" + + configFile = ConfigParser.ConfigParser() + configFile.read(join(homedir, ".pyload-cli")) + + if configFile.has_section("cli"): + for opt in configFile.items("cli"): + config[opt[0]] = opt[1] + + gettext.setpaths([join(os.sep, "usr", "share", "pyload", "locale"), None]) + translation = gettext.translation("Cli", join(pypath, "locale"), + languages=[config["language"], "en"], fallback=True) + translation.install(unicode=True) + + interactive = False + command = None + username = "" + password = "" + + shortOptions = 'iu:p:a:hcl:' + longOptions = ['interactive', "username=", "pw=", "address=", "port=", "help", "commands", "language="] + + try: + opts, extraparams = getopt(sys.argv[1:], shortOptions, longOptions) + for option, params in opts: + if option in ("-i", "--interactive"): + interactive = True + elif option in ("-u", "--username"): + username = params + elif option in ("-a", "--address"): + config["addr"] = params + elif option in ("-p", "--port"): + config["port"] = params + elif option in ("-l", "--language"): + config["language"] = params + gettext.setpaths([join(os.sep, "usr", "share", "pyload", "locale"), None]) + translation = gettext.translation("Cli", join(pypath, "locale"), + languages=[config["language"], "en"], fallback=True) + translation.install(unicode=True) + elif option in ("-h", "--help"): + print_help(config) + exit() + elif option in ("--pw"): + password = params + elif option in ("-c", "--comands"): + print_commands() + exit() + + except GetoptError: + print 'Unknown Argument(s) "%s"' % " ".join(sys.argv[1:]) + print_help(config) + exit() + + if len(extraparams) >= 1: + command = extraparams + + client = False + + if interactive: + try: + client = ThriftClient(config["addr"], int(config["port"]), username, password) + except WrongLogin: + pass + except NoSSL: + print _("You need py-openssl to connect to this pyLoad Core.") + exit() + except NoConnection: + config["addr"] = False + config["port"] = False + + if not client: + if not config["addr"]: config["addr"] = raw_input(_("Address: ")) + if not config["port"]: config["port"] = raw_input(_("Port: ")) + if not username: username = raw_input(_("Username: ")) + if not password: + from getpass import getpass + + password = getpass(_("Password: ")) + + try: + client = ThriftClient(config["addr"], int(config["port"]), username, password) + except WrongLogin: + print _("Login data is wrong.") + except NoConnection: + print _("Could not establish connection to %(addr)s:%(port)s." % {"addr": config["addr"], + "port": config["port"]}) + + else: + try: + client = ThriftClient(config["addr"], int(config["port"]), username, password) + except WrongLogin: + print _("Login data is wrong.") + except NoConnection: + print _("Could not establish connection to %(addr)s:%(port)s." % {"addr": config["addr"], + "port": config["port"]}) + except NoSSL: + print _("You need py-openssl to connect to this pyLoad core.") + + if interactive and command: print _("Interactive mode ignored since you passed some commands.") + + if client: + writeConfig(config) + cli = Cli(client, command) diff --git a/pyload/cli/Handler.py b/pyload/cli/Handler.py new file mode 100644 index 000000000..37b0d7b99 --- /dev/null +++ b/pyload/cli/Handler.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# +#Copyright (C) 2011-2014 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 . +# +### +class Handler: + def __init__(self, cli): + self.cli = cli + self.init() + + client = property(lambda self: self.cli.client) + input = property(lambda self: self.cli.input) + + def init(self): + pass + + def onChar(self, char): + pass + + def onBackSpace(self): + pass + + def onEnter(self, inp): + pass + + def setInput(self, inp=""): + self.cli.setInput(inp) + + def backspace(self): + self.cli.setInput(self.input[:-1]) + + def renderBody(self, line): + """ gets the line where to render output and should return the line number below its content """ + return line + 1 diff --git a/pyload/cli/ManageFiles.py b/pyload/cli/ManageFiles.py new file mode 100644 index 000000000..fba96b990 --- /dev/null +++ b/pyload/cli/ManageFiles.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +# +#Copyright (C) 2011-2014 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 . +# +### + +from itertools import islice +from time import time + +from Handler import Handler +from printer import * + +from pyload.Api import Destination, PackageData + +class ManageFiles(Handler): + """ possibility to manage queue/collector """ + + def init(self): + self.target = Destination.Queue + self.pos = 0 #position in queue + self.package = -1 #choosen package + self.mode = "" # move/delete/restart + + self.cache = None + self.links = None + self.time = 0 + + def onChar(self, char): + if char in ("m", "d", "r"): + self.mode = char + self.setInput() + elif char == "p": + self.pos = max(0, self.pos - 5) + self.backspace() + elif char == "n": + self.pos += 5 + self.backspace() + + def onBackSpace(self): + if not self.input and self.mode: + self.mode = "" + if not self.input and self.package > -1: + self.package = -1 + + def onEnter(self, input): + if input == "0": + self.cli.reset() + elif self.package < 0 and self.mode: + #mode select + packs = self.parseInput(input) + if self.mode == "m": + [self.client.movePackage((self.target + 1) % 2, x) for x in packs] + elif self.mode == "d": + self.client.deletePackages(packs) + elif self.mode == "r": + [self.client.restartPackage(x) for x in packs] + + elif self.mode: + #edit links + links = self.parseInput(input, False) + + if self.mode == "d": + self.client.deleteFiles(links) + elif self.mode == "r": + map(self.client.restartFile, links) + + else: + #look into package + try: + self.package = int(input) + except: + pass + + self.cache = None + self.links = None + self.pos = 0 + self.mode = "" + self.setInput() + + + def renderBody(self, line): + if self.package < 0: + println(line, white(_("Manage Packages:"))) + else: + println(line, white((_("Manage Links:")))) + line += 1 + + if self.mode: + if self.mode == "m": + println(line, _("What do you want to move?")) + elif self.mode == "d": + println(line, _("What do you want to delete?")) + elif self.mode == "r": + println(line, _("What do you want to restart?")) + + println(line + 1, "Enter single number, comma seperated numbers or ranges. eg. 1, 2, 3 or 1-3.") + line += 2 + else: + println(line, _("Choose what yout want to do or enter package number.")) + println(line + 1, ("%s - %%s, %s - %%s, %s - %%s" % (mag("d"), mag("m"), mag("r"))) % ( + _("delete"), _("move"), _("restart"))) + line += 2 + + if self.package < 0: + #print package info + pack = self.getPackages() + i = 0 + for value in islice(pack, self.pos, self.pos + 5): + try: + println(line, mag(str(value.pid)) + ": " + value.name) + line += 1 + i += 1 + except Exception, e: + pass + for x in range(5 - i): + println(line, "") + line += 1 + else: + #print links info + pack = self.getLinks() + i = 0 + for value in islice(pack.links, self.pos, self.pos + 5): + try: + println(line, mag(value.fid) + ": %s | %s | %s" % ( + value.name, value.statusmsg, value.plugin)) + line += 1 + i += 1 + except Exception, e: + pass + for x in range(5 - i): + println(line, "") + line += 1 + + println(line, mag("p") + _(" - previous") + " | " + mag("n") + _(" - next")) + println(line + 1, mag("0.") + _(" back to main menu")) + + return line + 2 + + + def getPackages(self): + if self.cache and self.time + 2 < time(): + return self.cache + + if self.target == Destination.Queue: + data = self.client.getQueue() + else: + data = self.client.getCollector() + + + self.cache = data + self.time = time() + + return data + + def getLinks(self): + if self.links and self.time + 1 < time(): + return self.links + + try: + data = self.client.getPackageData(self.package) + except: + data = PackageData(links=[]) + + self.links = data + self.time = time() + + return data + + def parseInput(self, inp, package=True): + inp = inp.strip() + if "-" in inp: + l, n, h = inp.partition("-") + l = int(l) + h = int(h) + r = range(l, h + 1) + + ret = [] + if package: + for p in self.cache: + if p.pid in r: + ret.append(p.pid) + else: + for l in self.links.links: + if l.lid in r: + ret.append(l.lid) + + return ret + + else: + return [int(x) for x in inp.split(",")] diff --git a/pyload/cli/__init__.py b/pyload/cli/__init__.py new file mode 100644 index 000000000..413c6a638 --- /dev/null +++ b/pyload/cli/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from AddPackage import AddPackage +from ManageFiles import ManageFiles diff --git a/pyload/cli/printer.py b/pyload/cli/printer.py new file mode 100644 index 000000000..0b2f5a0e3 --- /dev/null +++ b/pyload/cli/printer.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +def blue(string): + return "\033[1;34m" + unicode(string) + "\033[0m" + +def green(string): + return "\033[1;32m" + unicode(string) + "\033[0m" + +def yellow(string): + return "\033[1;33m" + unicode(string) + "\033[0m" + +def red(string): + return "\033[1;31m" + unicode(string) + "\033[0m" + +def cyan(string): + return "\033[1;36m" + unicode(string) + "\033[0m" + +def mag(string): + return "\033[1;35m" + unicode(string) + "\033[0m" + +def white(string): + return "\033[1;37m" + unicode(string) + "\033[0m" + +def println(line, content): + print "\033[" + str(line) + ";0H\033[2K" + content diff --git a/pyload/common/APIExerciser.py b/pyload/common/APIExerciser.py new file mode 100644 index 000000000..886c72a4a --- /dev/null +++ b/pyload/common/APIExerciser.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- + +import string +from threading import Thread +from random import choice, random, sample, randint +from time import time, sleep +from math import floor +import gc + +from traceback import print_exc, format_exc + +from pyload.remote.thriftbackend.ThriftClient import ThriftClient, Destination + +def createURLs(): + """ create some urls, some may fail """ + urls = [] + for x in range(0, randint(20, 100)): + name = "DEBUG_API" + if randint(0, 5) == 5: + name = "" #this link will fail + + urls.append(name + "".join(sample(string.ascii_letters, randint(10, 20)))) + + return urls + +AVOID = (0, 3, 8) + +idPool = 0 +sumCalled = 0 + + +def startApiExerciser(core, n): + for i in range(n): + APIExerciser(core).start() + +class APIExerciser(Thread): + + + def __init__(self, core, thrift=False, user=None, pw=None): + global idPool + + Thread.__init__(self) + self.setDaemon(True) + self.core = core + self.count = 0 #number of methods + self.time = time() + + if thrift: + self.api = ThriftClient(user=user, password=pw) + else: + self.api = core.api + + + self.id = idPool + + idPool += 1 + + #self.start() + + def run(self): + + self.core.log.info("API Excerciser started %d" % self.id) + + out = open("error.log", "ab") + #core errors are not logged of course + out.write("\n" + "Starting\n") + out.flush() + + while True: + try: + self.testAPI() + except Exception: + self.core.log.error("Excerciser %d throw an execption" % self.id) + print_exc() + out.write(format_exc() + 2 * "\n") + out.flush() + + if not self.count % 100: + self.core.log.info("Exerciser %d tested %d api calls" % (self.id, self.count)) + if not self.count % 1000: + out.flush() + + if not sumCalled % 1000: #not thread safe + self.core.log.info("Exercisers tested %d api calls" % sumCalled) + persec = sumCalled / (time() - self.time) + self.core.log.info("Approx. %.2f calls per second." % persec) + self.core.log.info("Approx. %.2f ms per call." % (1000 / persec)) + self.core.log.info("Collected garbage: %d" % gc.collect()) + + + #sleep(random() / 500) + + def testAPI(self): + global sumCalled + + m = ["statusDownloads", "statusServer", "addPackage", "getPackageData", "getFileData", "deleteFiles", + "deletePackages", "getQueue", "getCollector", "getQueueData", "getCollectorData", "isCaptchaWaiting", + "getCaptchaTask", "stopAllDownloads", "getAllInfo", "getServices" , "getAccounts", "getAllUserData"] + + method = choice(m) + #print "Testing:", method + + if hasattr(self, method): + res = getattr(self, method)() + else: + res = getattr(self.api, method)() + + self.count += 1 + sumCalled += 1 + + #print res + + def addPackage(self): + name = "".join(sample(string.ascii_letters, 10)) + urls = createURLs() + + self.api.addPackage(name, urls, choice([Destination.Queue, Destination.Collector])) + + + def deleteFiles(self): + info = self.api.getQueueData() + if not info: return + + pack = choice(info) + fids = pack.links + + if len(fids): + fids = [f.fid for f in sample(fids, randint(1, max(len(fids) / 2, 1)))] + self.api.deleteFiles(fids) + + + def deletePackages(self): + info = choice([self.api.getQueue(), self.api.getCollector()]) + if not info: return + + pids = [p.pid for p in info] + if len(pids): + pids = sample(pids, randint(1, max(floor(len(pids) / 2.5), 1))) + self.api.deletePackages(pids) + + def getFileData(self): + info = self.api.getQueueData() + if info: + p = choice(info) + if p.links: + self.api.getFileData(choice(p.links).fid) + + def getPackageData(self): + info = self.api.getQueue() + if info: + self.api.getPackageData(choice(info).pid) + + def getAccounts(self): + self.api.getAccounts(False) + + def getCaptchaTask(self): + self.api.getCaptchaTask(False) diff --git a/pyload/common/ImportDebugger.py b/pyload/common/ImportDebugger.py new file mode 100644 index 000000000..ae3aef629 --- /dev/null +++ b/pyload/common/ImportDebugger.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +import sys + +class ImportDebugger(object): + + def __init__(self): + self.imported = {} + + def find_module(self, name, path=None): + + if name not in self.imported: + self.imported[name] = 0 + + self.imported[name] += 1 + + print name, path + +sys.meta_path.append(ImportDebugger()) diff --git a/pyload/common/JsEngine.py b/pyload/common/JsEngine.py new file mode 100644 index 000000000..46789f64d --- /dev/null +++ b/pyload/common/JsEngine.py @@ -0,0 +1,155 @@ +# -*- 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 . + + @author: RaNaN +""" + +from imp import find_module +from os.path import join, exists +from urllib import quote + + +ENGINE = "" + +DEBUG = False +JS = False +PYV8 = False +RHINO = False + + +if not ENGINE: + try: + import subprocess + + subprocess.Popen(["js", "-v"], bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + p = subprocess.Popen(["js", "-e", "print(23+19)"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = p.communicate() + #integrity check + if out.strip() == "42": + ENGINE = "js" + JS = True + except: + pass + +if not ENGINE or DEBUG: + try: + find_module("PyV8") + ENGINE = "pyv8" + PYV8 = True + except: + pass + +if not ENGINE or DEBUG: + try: + path = "" #path where to find rhino + + if exists("/usr/share/java/js.jar"): + path = "/usr/share/java/js.jar" + elif exists("js.jar"): + path = "js.jar" + elif exists(join(pypath, "js.jar")): #may raises an exception, but js.jar wasnt found anyway + path = join(pypath, "js.jar") + + if not path: + raise Exception + + import subprocess + + p = subprocess.Popen(["java", "-cp", path, "org.mozilla.javascript.tools.shell.Main", "-e", "print(23+19)"], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = p.communicate() + #integrity check + if out.strip() == "42": + ENGINE = "rhino" + RHINO = True + except: + pass + +class JsEngine: + def __init__(self): + self.engine = ENGINE + self.init = False + + def __nonzero__(self): + return False if not ENGINE else True + + def eval(self, script): + if not self.init: + if ENGINE == "pyv8" or (DEBUG and PYV8): + import PyV8 + global PyV8 + + self.init = True + + if type(script) == unicode: + script = script.encode("utf8") + + if not ENGINE: + raise Exception("No JS Engine") + + if not DEBUG: + if ENGINE == "pyv8": + return self.eval_pyv8(script) + elif ENGINE == "js": + return self.eval_js(script) + elif ENGINE == "rhino": + return self.eval_rhino(script) + else: + results = [] + if PYV8: + res = self.eval_pyv8(script) + print "PyV8:", res + results.append(res) + if JS: + res = self.eval_js(script) + print "JS:", res + results.append(res) + if RHINO: + res = self.eval_rhino(script) + print "Rhino:", res + results.append(res) + + warning = False + for x in results: + for y in results: + if x != y: + warning = True + + if warning: print "### WARNING ###: Different results" + + return results[0] + + def eval_pyv8(self, script): + rt = PyV8.JSContext() + rt.enter() + return rt.eval(script) + + def eval_js(self, script): + script = "print(eval(unescape('%s')))" % quote(script) + p = subprocess.Popen(["js", "-e", script], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1) + out, err = p.communicate() + res = out.strip() + return res + + def eval_rhino(self, script): + script = "print(eval(unescape('%s')))" % quote(script) + p = subprocess.Popen(["java", "-cp", path, "org.mozilla.javascript.tools.shell.Main", "-e", script], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1) + out, err = p.communicate() + res = out.strip() + return res.decode("utf8").encode("ISO-8859-1") + + def error(self): + return _("No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or rhino") diff --git a/pyload/common/__init__.py b/pyload/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pyload/common/json_layer.py b/pyload/common/json_layer.py new file mode 100644 index 000000000..bb3937cdc --- /dev/null +++ b/pyload/common/json_layer.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +# abstraction layer for json operations + +try: # since python 2.6 + import json + from json import loads as json_loads + from json import dumps as json_dumps +except ImportError: #use system simplejson if available + import simplejson as json + from simplejson import loads as json_loads + from simplejson import dumps as json_dumps diff --git a/pyload/common/packagetools.py b/pyload/common/packagetools.py new file mode 100644 index 000000000..d5ab4d182 --- /dev/null +++ b/pyload/common/packagetools.py @@ -0,0 +1,136 @@ +# JDownloader/src/jd/controlling/LinkGrabberPackager.java + +import re +from urlparse import urlparse + +def matchFirst(string, *args): + """ matches against list of regexp and returns first match""" + for patternlist in args: + for pattern in patternlist: + r = pattern.search(string) + if r is not None: + name = r.group(1) + return name + + return string + + +def parseNames(files): + """ Generates packages names from name, data lists + + :param files: list of (name, data) + :return: packagenames mapt to data lists (eg. urls) + """ + packs = {} + + endings = "\\.(3gp|7zip|7z|abr|ac3|aiff|aifc|aif|ai|au|avi|bin|bz2|cbr|cbz|ccf|cue|cvd|chm|dta|deb|divx|djvu|dlc|dmg|doc|docx|dot|eps|exe|ff|flv|f4v|gsd|gif|gz|iwd|iso|ipsw|java|jar|jpg|jpeg|jdeatme|load|mws|mw|m4v|m4a|mkv|mp2|mp3|mp4|mov|movie|mpeg|mpe|mpg|msi|msu|msp|nfo|npk|oga|ogg|ogv|otrkey|pkg|png|pdf|pptx|ppt|pps|ppz|pot|psd|qt|rmvb|rm|rar|ram|ra|rev|rnd|r\\d+|rpm|run|rsdf|rtf|sh(!?tml)|srt|snd|sfv|swf|tar|tif|tiff|ts|txt|viv|vivo|vob|wav|wmv|xla|xls|xpi|zeno|zip|z\\d+|_[_a-z]{2}|\\d+$)" + + rarPats = [re.compile("(.*)(\\.|_|-)pa?r?t?\\.?[0-9]+.(rar|exe)$", re.I), + re.compile("(.*)(\\.|_|-)part\\.?[0]*[1].(rar|exe)$", re.I), + re.compile("(.*)\\.rar$", re.I), + re.compile("(.*)\\.r\\d+$", re.I), + re.compile("(.*)(\\.|_|-)\\d+$", re.I)] + + zipPats = [re.compile("(.*)\\.zip$", re.I), + re.compile("(.*)\\.z\\d+$", re.I), + re.compile("(?is).*\\.7z\\.[\\d]+$", re.I), + re.compile("(.*)\\.a.$", re.I)] + + ffsjPats = [re.compile("(.*)\\._((_[a-z])|([a-z]{2}))(\\.|$)"), + re.compile("(.*)(\\.|_|-)[\\d]+(" + endings + "$)", re.I)] + + iszPats = [re.compile("(.*)\\.isz$", re.I), + re.compile("(.*)\\.i\\d{2}$", re.I)] + + pat1 = re.compile("(\\.?CD\\d+)", re.I) + pat2 = re.compile("(\\.?part\\d+)", re.I) + + pat3 = re.compile("(.+)[\\.\\-_]+$") + pat4 = re.compile("(.+)\\.\\d+\\.xtm$") + + for file, url in files: + patternMatch = False + + if file is None: + continue + + # remove trailing / + name = file.rstrip('/') + + # extract last path part .. if there is a path + split = name.rsplit("/", 1) + if len(split) > 1: + name = split.pop(1) + + #check if a already existing package may be ok for this file + # found = False + # for pack in packs: + # if pack in file: + # packs[pack].append(url) + # found = True + # break + # + # if found: continue + + # unrar pattern, 7zip/zip and hjmerge pattern, isz pattern, FFSJ pattern + before = name + name = matchFirst(name, rarPats, zipPats, iszPats, ffsjPats) + if before != name: + patternMatch = True + + # xtremsplit pattern + r = pat4.search(name) + if r is not None: + name = r.group(1) + + # remove part and cd pattern + r = pat1.search(name) + if r is not None: + name = name.replace(r.group(0), "") + patternMatch = True + + r = pat2.search(name) + if r is not None: + name = name.replace(r.group(0), "") + patternMatch = True + + # additional checks if extension pattern matched + if patternMatch: + # remove extension + index = name.rfind(".") + if index <= 0: + index = name.rfind("_") + if index > 0: + length = len(name) - index + if length <= 4: + name = name[:-length] + + # remove endings like . _ - + r = pat3.search(name) + if r is not None: + name = r.group(1) + + # replace . and _ with space + name = name.replace(".", " ") + name = name.replace("_", " ") + + name = name.strip() + else: + name = "" + + # fallback: package by hoster + if not name: + name = urlparse(file).hostname + if name: name = name.replace("www.", "") + + # fallback : default name + if not name: + name = "unknown" + + # build mapping + if name in packs: + packs[name].append(url) + else: + packs[name] = [url] + + return packs diff --git a/pyload/common/pavement.py b/pyload/common/pavement.py new file mode 100644 index 000000000..9b2dc98b3 --- /dev/null +++ b/pyload/common/pavement.py @@ -0,0 +1,412 @@ +# -*- coding: utf-8 -*- + +from paver.easy import * +from paver.setuputils import setup +from paver.doctools import cog + +import os +import sys +import shutil +import re +from glob import glob +from tempfile import mkdtemp +from urllib import urlretrieve +from subprocess import call, Popen, PIPE +from zipfile import ZipFile + +PROJECT_DIR = path(__file__).dirname() +sys.path.append(PROJECT_DIR) + +options = environment.options +path("pyload").mkdir() + +extradeps = [] +if sys.version_info <= (2, 5): + extradeps += 'simplejson' + +setup( + name="pyload", + version="0.4.10", + description='Fast, lightweight and full featured download manager.', + long_description=open(PROJECT_DIR / "README.md").read(), + keywords = ("pyload", "download-manager", "one-click-hoster", "download"), + url="http://pyload.org", + download_url='http://pyload.org/download', + license='GPL v3', + author="pyLoad Team", + author_email="support@pyload.org", + platforms = ('Any',), + #package_dir={'pyload': "src"}, + packages=["pyload"], + #package_data=find_package_data(), + #data_files=[], + include_package_data=True, + exclude_package_data={'pyload': ["docs*", "scripts*", "tests*"]}, #exluced from build but not from sdist + # 'bottle >= 0.10.0' not in list, because its small and contain little modifications + install_requires=['thrift >= 0.8.0', 'jinja2', 'pycurl', 'Beaker', 'BeautifulSoup >= 3.2, < 3.3'] + extradeps, + extras_require={ + 'SSL': ["pyOpenSSL"], + 'DLC': ['pycrypto'], + 'lightweight webserver': ['bjoern'], + 'RSS plugins': ['feedparser'], + }, + #setup_requires=["setuptools_hg"], + entry_points={ + 'console_scripts': [ + 'pyLoadCore = pyLoadCore:main', + 'pyLoadCli = pyLoadCli:main' + ]}, + zip_safe=False, + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Topic :: Internet :: WWW/HTTP", + "Environment :: Console", + "Environment :: Web Environment", + "Intended Audience :: End Users/Desktop", + "License :: OSI Approved :: GNU General Public License (GPL)", + "Operating System :: OS Independent", + "Programming Language :: Python :: 2" + ] +) + +options( + sphinx=Bunch( + builddir="_build", + sourcedir="" + ), + get_source=Bunch( + src="https://bitbucket.org/spoob/pyload/get/tip.zip", + rev=None, + clean=False + ), + thrift=Bunch( + path="../thrift/trunk/compiler/cpp/thrift", + gen="" + ), + virtualenv=Bunch( + dir="env", + python="python2", + virtual="virtualenv2", + ), + cog=Bunch( + pattern="*.py", + ) +) + +# xgettext args +xargs = ["--language=Python", "--add-comments=L10N", + "--from-code=utf-8", "--copyright-holder=pyLoad Team", "--package-name=pyLoad", + "--package-version=%s" % options.version, "--msgid-bugs-address='bugs@pyload.org'"] + +@task +@needs('cog') +def html(): + """Build html documentation""" + module = path("docs") / "pyload" + pyload.rmtree() + call_task('paver.doctools.html') + + +@task +@cmdopts([ + ('src=', 's', 'Url to source'), + ('rev=', 'r', "HG revision"), + ("clean", 'c', 'Delete old source folder') +]) +def get_source(options): + """ Downloads pyload source from bitbucket tip or given rev""" + if options.rev: options.url = "https://bitbucket.org/spoob/pyload/get/%s.zip" % options.rev + + pyload = path("pyload") + + if len(pyload.listdir()) and not options.clean: + return + elif pyload.exists(): + pyload.rmtree() + + urlretrieve(options.src, "pyload_src.zip") + zip = ZipFile("pyload_src.zip") + zip.extractall() + path("pyload_src.zip").remove() + + folder = [x for x in path(".").dirs() if x.name.startswith("spoob-pyload-")][0] + folder.move(pyload) + + change_mode(pyload, 0644) + change_mode(pyload, 0755, folder=True) + + for file in pyload.files(): + if file.name.endswith(".py"): + file.chmod(0755) + + (pyload / ".hgtags").remove() + (pyload / ".gitignore").remove() + #(pyload / "docs").rmtree() + + f = open(pyload / "__init__.py", "wb") + f.close() + + #options.setup.packages = find_packages() + #options.setup.package_data = find_package_data() + + +@task +@needs('clean', 'generate_setup', 'minilib', 'get_source', 'setuptools.command.sdist') +def sdist(): + """ Build source code package with distutils """ + + +@task +@cmdopts([ + ('path=', 'p', 'Thrift path'), + ('gen=', 'g', "Extra --gen option") +]) +def thrift(options): + """ Generate Thrift stubs """ + + print "add import for TApplicationException manually as long it is not fixed" + + outdir = path("pyload") / "remote" / "thriftbackend" + (outdir / "gen-py").rmtree() + + cmd = [options.thrift.path, "-strict", "-o", outdir, "--gen", "py:slots, dynamic", outdir / "pyload.thrift"] + + if options.gen: + cmd.insert(len(cmd) - 1, "--gen") + cmd.insert(len(cmd) - 1, options.gen) + + print "running", cmd + + p = Popen(cmd) + p.communicate() + + (outdir / "thriftgen").rmtree() + (outdir / "gen-py").move(outdir / "thriftgen") + + #create light ttypes + from pyload.remote.socketbackend.create_ttypes import main + main() + +@task +def compile_js(): + """ Compile .coffee files to javascript""" + + root = path("pyload") / "web" / "media" / "js" + for f in root.glob("*.coffee"): + print "generate", f + coffee = Popen(["coffee", "-cbs"], stdin=open(f, "rb"), stdout=PIPE) + yui = Popen(["yuicompressor", "--type", "js"], stdin=coffee.stdout, stdout=PIPE) + coffee.stdout.close() + content = yui.communicate()[0] + with open(root / f.name.replace(".coffee", ".js"), "wb") as js: + js.write("{% autoescape true %}\n") + js.write(content) + js.write("\n{% endautoescape %}") + + +@task +def generate_locale(): + """ Generates localization files """ + + EXCLUDE = ["BeautifulSoup.py", "pyload/cli", "web/locale", "web/ajax", "web/cnl", "web/pyload", + "setup.py"] + makepot("core", path("pyload"), EXCLUDE, "./pyload.py\n") + + makepot("cli", path("pyload") / "cli", [], includes="./pyload-cli.py\n") + makepot("setup", "", [], includes="./pyload/setup.py\n") + + EXCLUDE = ["ServerThread.py", "web/media/default"] + + # strings from js files + strings = set() + + for fi in path("pyload/web").walkfiles(): + if not fi.name.endswith(".js") and not fi.endswith(".coffee"): continue + with open(fi, "rb") as c: + content = c.read() + + strings.update(re.findall(r"_\s*\(\s*\"([^\"]+)", content)) + strings.update(re.findall(r"_\s*\(\s*\'([^\']+)", content)) + + trans = path("pyload") / "web" / "translations.js" + + with open(trans, "wb") as js: + for s in strings: + js.write('_("%s")\n' % s) + + makepot("django", path("pyload/web"), EXCLUDE, "./%s\n" % trans.relpath(), [".py", ".html"], ["--language=Python"]) + + trans.remove() + + path("includes.txt").remove() + + print "Locale generated" + + +@task +@cmdopts([ + ('key=', 'k', 'api key') +]) +def upload_translations(options): + """ Uploads the locale files to translation server """ + tmp = path(mkdtemp()) + + shutil.copy('locale/crowdin.yaml', tmp) + os.mkdir(tmp / 'pyLoad') + for f in glob('locale/*.pot'): + if os.path.isfile(f): + shutil.copy(f, tmp / 'pyLoad') + + config = tmp / 'crowdin.yaml' + content = open(config, 'rb').read() + content = content.format(key=options.key, tmp=tmp) + f = open(config, 'wb') + f.write(content) + f.close() + + call(['crowdin-cli', '-c', config, 'upload', 'source']) + + shutil.rmtree(tmp) + + print "Translations uploaded" + + +@task +@cmdopts([ + ('key=', 'k', 'api key') +]) +def download_translations(options): + """ Downloads the translated files from translation server """ + tmp = path(mkdtemp()) + + shutil.copy('locale/crowdin.yaml', tmp) + os.mkdir(tmp / 'pyLoad') + for f in glob('locale/*.pot'): + if os.path.isfile(f): + shutil.copy(f, tmp / 'pyLoad') + + config = tmp / 'crowdin.yaml' + content = open(config, 'rb').read() + content = content.format(key=options.key, tmp=tmp) + f = open(config, 'wb') + f.write(content) + f.close() + + call(['crowdin-cli', '-c', config, 'download']) + + for language in (tmp / 'pyLoad').listdir(): + if not language.isdir(): + continue + + target = path('locale') / language.basename() + print "Copy language %s" % target + if target.exists(): + shutil.rmtree(target) + + shutil.copytree(language, target) + + shutil.rmtree(tmp) + + +@task +def compile_translations(): + """ Compile PO files to MO """ + for language in path('locale').listdir(): + if not language.isdir(): + continue + + for f in glob(language / 'LC_MESSAGES' / '*.po'): + print "Compiling %s" % f + call(['msgfmt', '-o', f.replace('.po', '.mo'), f]) + + +@task +def tests(): + call(["nosetests2"]) + +@task +def virtualenv(options): + """Setup virtual environment""" + if path(options.dir).exists(): + return + + call([options.virtual, "--no-site-packages", "--python", options.python, options.dir]) + print "$ source %s/bin/activate" % options.dir + + +@task +def clean_env(): + """Deletes the virtual environment""" + env = path(options.virtualenv.dir) + if env.exists(): + env.rmtree() + + +@task +@needs('generate_setup', 'minilib', 'get_source', 'virtualenv') +def env_install(): + """Install pyLoad into the virtualenv""" + venv = options.virtualenv + call([path(venv.dir) / "bin" / "easy_install", "."]) + + +@task +def clean(): + """Cleans build directories""" + path("build").rmtree() + path("dist").rmtree() + + +#helper functions + +def walk_trans(path, EXCLUDE, endings=[".py"]): + result = "" + + for f in path.walkfiles(): + if [True for x in EXCLUDE if x in f.dirname().relpath()]: continue + if f.name in EXCLUDE: continue + + for e in endings: + if f.name.endswith(e): + result += "./%s\n" % f.relpath() + break + + return result + + +def makepot(domain, p, excludes=[], includes="", endings=[".py"], xxargs=[]): + print "Generate %s.pot" % domain + + f = open("includes.txt", "wb") + if includes: + f.write(includes) + + if p: + f.write(walk_trans(path(p), excludes, endings)) + + f.close() + + call(["xgettext", "--files-from=includes.txt", "--default-domain=%s" % domain] + xargs + xxargs) + + # replace charset und move file + with open("%s.po" % domain, "rb") as f: + content = f.read() + + path("%s.po" % domain).remove() + content = content.replace("charset=CHARSET", "charset=UTF-8") + + with open("locale/%s.pot" % domain, "wb") as f: + f.write(content) + + +def change_owner(dir, uid, gid): + for p in dir.walk(): + p.chown(uid, gid) + + +def change_mode(dir, mode, folder=False): + for p in dir.walk(): + if folder and p.isdir(): + p.chmod(mode) + elif p.isfile() and not folder: + p.chmod(mode) diff --git a/pyload/common/pylgettext.py b/pyload/common/pylgettext.py new file mode 100644 index 000000000..cab631cf4 --- /dev/null +++ b/pyload/common/pylgettext.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + +from gettext import * + +_searchdirs = None + +origfind = find + +def setpaths(pathlist): + global _searchdirs + if isinstance(pathlist, list): + _searchdirs = pathlist + else: + _searchdirs = list(pathlist) + + +def addpath(path): + global _searchdirs + if _searchdirs is None: + _searchdirs = list(path) + else: + if path not in _searchdirs: + _searchdirs.append(path) + + +def delpath(path): + global _searchdirs + if _searchdirs is not None: + if path in _searchdirs: + _searchdirs.remove(path) + + +def clearpath(): + global _searchdirs + if _searchdirs is not None: + _searchdirs = None + + +def find(domain, localedir=None, languages=None, all=False): + if _searchdirs is None: + return origfind(domain, localedir, languages, all) + searches = [localedir] + _searchdirs + results = list() + for dir in searches: + res = origfind(domain, dir, languages, all) + if all is False: + results.append(res) + else: + results.extend(res) + if all is False: + results = filter(lambda x: x is not None, results) + if len(results) == 0: + return None + else: + return results[0] + else: + return results + +#Is there a smarter/cleaner pythonic way for this? +translation.func_globals['find'] = find diff --git a/pyload/common/test_api.py b/pyload/common/test_api.py new file mode 100644 index 000000000..4efaa35d6 --- /dev/null +++ b/pyload/common/test_api.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +from pyload.common import APIExerciser +from nose.tools import nottest + + +class TestApi: + + def __init__(self): + self.api = APIExerciser.APIExerciser(None, True, "TestUser", "pwhere") + + def test_login(self): + assert self.api.api.login("crapp", "wrong pw") is False + + #takes really long, only test when needed + @nottest + def test_random(self): + + for i in range(0, 100): + self.api.testAPI() diff --git a/pyload/common/test_json.py b/pyload/common/test_json.py new file mode 100644 index 000000000..320a42d4f --- /dev/null +++ b/pyload/common/test_json.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +from urllib import urlencode +from urllib2 import urlopen, HTTPError +from json import loads + +from logging import log + +url = "http://localhost:8001/api/%s" + +class TestJson: + + def call(self, name, post=None): + if not post: post = {} + post["session"] = self.key + u = urlopen(url % name, data=urlencode(post)) + return loads(u.read()) + + def setUp(self): + u = urlopen(url % "login", data=urlencode({"username": "TestUser", "password": "pwhere"})) + self.key = loads(u.read()) + assert self.key is not False + + def test_wronglogin(self): + u = urlopen(url % "login", data=urlencode({"username": "crap", "password": "wrongpw"})) + assert loads(u.read()) is False + + def test_access(self): + try: + urlopen(url % "getServerVersion") + except HTTPError, e: + assert e.code == 403 + else: + assert False + + def test_status(self): + ret = self.call("statusServer") + log(1, str(ret)) + assert "pause" in ret + assert "queue" in ret + + def test_unknown_method(self): + try: + self.call("notExisting") + except HTTPError, e: + assert e.code == 404 + else: + assert False diff --git a/pyload/config/default.conf b/pyload/config/default.conf new file mode 100644 index 000000000..3a513f122 --- /dev/null +++ b/pyload/config/default.conf @@ -0,0 +1,64 @@ +version: 1 + +remote - "Remote": + int port : "Port" = 7227 + ip listenaddr : "Address" = 0.0.0.0 + bool nolocalauth : "No authentication on local connections" = True + bool activated : "Activated" = True +ssl - "SSL": + bool activated : "Activated"= False + file cert : "SSL Certificate" = ssl.crt + file key : "SSL Key" = ssl.key +webinterface - "Web UI": + bool activated : "Activated" = True + builtin;threaded;fastcgi;lightweight server : "Server" = builtin + bool https : "Use HTTPS" = False + ip host : "IP" = 0.0.0.0 + int port : "Port" = 8001 + default;dark;flat theme : "Theme" = flat + str prefix: "Path Prefix" = +log - "Log": + bool file_log : "File Log" = True + folder log_folder : "Folder" = Logs + int log_count : "Count" = 5 + int log_size : "Size in kb" = 100 + bool log_rotate : "Log Rotate" = True +general - "General": + en;de;fr;it;es;nl;sv;ru;pl;cs;sr;pt_BR language : "Language" = en + folder download_folder : "Download Folder" = Downloads + bool debug_mode : "Debug Mode" = False + int min_free_space : "Min Free Space (MB)" = 200 + bool folder_per_package : "Create folder for each package" = True + int renice : "CPU Priority" = 0 +download - "Download": + int chunks : "Max connections for one download" = 3 + int max_downloads : "Max Parallel Downloads" = 3 + int max_speed : "Max Download Speed in kb/s" = -1 + bool limit_speed : "Limit Download Speed" = False + str interface : "Download interface to bind (ip or Name)" = None + bool ipv6: "Allow IPv6" = False + bool skip_existing : "Skip already existing files" = False +permission - "Permissions": + bool change_user : "Change user of running process" = False + str user : "Username" = user + str folder : "Folder Permission mode" = 0755 + bool change_file : "Change file mode of downloads" = False + str file : "Filemode for Downloads" = 0644 + bool change_group : "Change group of running process" = False + str group : "Groupname" = users + bool change_dl : "Change Group and User of Downloads" = False +reconnect - "Reconnect": + bool activated : "Use Reconnect" = False + str method : "Method" = None + time startTime : "Start" = 0:00 + time endTime : "End" = 0:00 +downloadTime - "Download Time": + time start : "Start" = 0:00 + time end : "End" = 0:00 +proxy - "Proxy": + str address : "Address" = "localhost" + int port : "Port" = 7070 + http;socks4;socks5 type : "Protocol" = http + str username : "Username" = None + password password : "Password" = None + bool proxy : "Use Proxy" = False diff --git a/pyload/database/DatabaseBackend.py b/pyload/database/DatabaseBackend.py new file mode 100644 index 000000000..9ebe31701 --- /dev/null +++ b/pyload/database/DatabaseBackend.py @@ -0,0 +1,305 @@ +""" + 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 . + + @author: RaNaN + @author: mkaay +""" +from threading import Thread +from threading import Event +from os import remove +from os.path import exists +from shutil import move + +from Queue import Queue +from traceback import print_exc + +from pyload.utils import chmod + +try: + from pysqlite2 import dbapi2 as sqlite3 +except: + import sqlite3 + +DB_VERSION = 4 + +class style: + db = None + + @classmethod + def setDB(cls, db): + cls.db = db + + @classmethod + def inner(cls, f): + @staticmethod + def x(*args, **kwargs): + if cls.db: + return f(cls.db, *args, **kwargs) + return x + + @classmethod + def queue(cls, f): + @staticmethod + def x(*args, **kwargs): + if cls.db: + return cls.db.queue(f, *args, **kwargs) + return x + + @classmethod + def async(cls, f): + @staticmethod + def x(*args, **kwargs): + if cls.db: + return cls.db.async(f, *args, **kwargs) + return x + +class DatabaseJob: + def __init__(self, f, *args, **kwargs): + self.done = Event() + + self.f = f + self.args = args + self.kwargs = kwargs + + self.result = None + self.exception = False + +# import inspect +# self.frame = inspect.currentframe() + + def __repr__(self): + from os.path import basename + frame = self.frame.f_back + output = "" + for i in range(5): + output += "\t%s:%s, %s\n" % (basename(frame.f_code.co_filename), frame.f_lineno, frame.f_code.co_name) + frame = frame.f_back + del frame + del self.frame + + return "DataBase Job %s:%s\n%sResult: %s" % (self.f.__name__, self.args[1:], output, self.result) + + def processJob(self): + try: + self.result = self.f(*self.args, **self.kwargs) + except Exception, e: + print_exc() + try: + print "Database Error @", self.f.__name__, self.args[1:], self.kwargs, e + except: + pass + + self.exception = e + finally: + self.done.set() + + def wait(self): + self.done.wait() + +class DatabaseBackend(Thread): + subs = [] + def __init__(self, core): + Thread.__init__(self) + self.setDaemon(True) + self.core = core + + self.jobs = Queue() + + self.setuplock = Event() + + style.setDB(self) + + def setup(self): + self.start() + self.setuplock.wait() + + def run(self): + """main loop, which executes commands""" + convert = self._checkVersion() #returns None or current version + + self.conn = sqlite3.connect("files.db") + chmod("files.db", 0600) + + self.c = self.conn.cursor() #compatibility + + if convert is not None: + self._convertDB(convert) + + self._createTables() + self._migrateUser() + + self.conn.commit() + + self.setuplock.set() + + while True: + j = self.jobs.get() + if j == "quit": + self.c.close() + self.conn.close() + break + j.processJob() + + @style.queue + def shutdown(self): + self.conn.commit() + self.jobs.put("quit") + + def _checkVersion(self): + """ check db version and delete it if needed""" + if not exists("files.version"): + f = open("files.version", "wb") + f.write(str(DB_VERSION)) + f.close() + return + + f = open("files.version", "rb") + v = int(f.read().strip()) + f.close() + if v < DB_VERSION: + if v < 2: + try: + self.manager.core.log.warning(_("Filedatabase was deleted due to incompatible version.")) + except: + print "Filedatabase was deleted due to incompatible version." + remove("files.version") + move("files.db", "files.backup.db") + f = open("files.version", "wb") + f.write(str(DB_VERSION)) + f.close() + return v + + def _convertDB(self, v): + try: + getattr(self, "_convertV%i" % v)() + except: + try: + self.core.log.error(_("Filedatabase could NOT be converted.")) + except: + print "Filedatabase could NOT be converted." + + #convert scripts start----------------------------------------------------- + + def _convertV2(self): + self.c.execute('CREATE TABLE IF NOT EXISTS "storage" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "identifier" TEXT NOT NULL, "key" TEXT NOT NULL, "value" TEXT DEFAULT "")') + try: + self.manager.core.log.info(_("Database was converted from v2 to v3.")) + except: + print "Database was converted from v2 to v3." + self._convertV3() + + def _convertV3(self): + self.c.execute('CREATE TABLE IF NOT EXISTS "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "email" TEXT DEFAULT "" NOT NULL, "password" TEXT NOT NULL, "role" INTEGER DEFAULT 0 NOT NULL, "permission" INTEGER DEFAULT 0 NOT NULL, "template" TEXT DEFAULT "default" NOT NULL)') + try: + self.manager.core.log.info(_("Database was converted from v3 to v4.")) + except: + print "Database was converted from v3 to v4." + + #convert scripts end------------------------------------------------------- + + def _createTables(self): + """create tables for database""" + + self.c.execute('CREATE TABLE IF NOT EXISTS "packages" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "folder" TEXT, "password" TEXT DEFAULT "", "site" TEXT DEFAULT "", "queue" INTEGER DEFAULT 0 NOT NULL, "packageorder" INTEGER DEFAULT 0 NOT NULL)') + self.c.execute('CREATE TABLE IF NOT EXISTS "links" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "url" TEXT NOT NULL, "name" TEXT, "size" INTEGER DEFAULT 0 NOT NULL, "status" INTEGER DEFAULT 3 NOT NULL, "plugin" TEXT DEFAULT "BasePlugin" NOT NULL, "error" TEXT DEFAULT "", "linkorder" INTEGER DEFAULT 0 NOT NULL, "package" INTEGER DEFAULT 0 NOT NULL, FOREIGN KEY(package) REFERENCES packages(id))') + self.c.execute('CREATE INDEX IF NOT EXISTS "pIdIndex" ON links(package)') + self.c.execute('CREATE TABLE IF NOT EXISTS "storage" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "identifier" TEXT NOT NULL, "key" TEXT NOT NULL, "value" TEXT DEFAULT "")') + self.c.execute('CREATE TABLE IF NOT EXISTS "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "email" TEXT DEFAULT "" NOT NULL, "password" TEXT NOT NULL, "role" INTEGER DEFAULT 0 NOT NULL, "permission" INTEGER DEFAULT 0 NOT NULL, "template" TEXT DEFAULT "default" NOT NULL)') + + self.c.execute('CREATE VIEW IF NOT EXISTS "pstats" AS \ + SELECT p.id AS id, SUM(l.size) AS sizetotal, COUNT(l.id) AS linkstotal, linksdone, sizedone\ + FROM packages p JOIN links l ON p.id = l.package LEFT OUTER JOIN\ + (SELECT p.id AS id, COUNT(*) AS linksdone, SUM(l.size) AS sizedone \ + FROM packages p JOIN links l ON p.id = l.package AND l.status in (0, 4, 13) GROUP BY p.id) s ON s.id = p.id \ + GROUP BY p.id') + + #try to lower ids + self.c.execute('SELECT max(id) FROM LINKS') + fid = self.c.fetchone()[0] + if fid: + fid = int(fid) + else: + fid = 0 + self.c.execute('UPDATE SQLITE_SEQUENCE SET seq=? WHERE name=?', (fid, "links")) + + + self.c.execute('SELECT max(id) FROM packages') + pid = self.c.fetchone()[0] + if pid: + pid = int(pid) + else: + pid = 0 + self.c.execute('UPDATE SQLITE_SEQUENCE SET seq=? WHERE name=?', (pid, "packages")) + + self.c.execute('VACUUM') + + + def _migrateUser(self): + if exists("pyload.db"): + try: + self.core.log.info(_("Converting old Django DB")) + except: + print "Converting old Django DB" + conn = sqlite3.connect('pyload.db') + c = conn.cursor() + c.execute("SELECT username, password, email from auth_user WHERE is_superuser") + users = [] + for r in c: + pw = r[1].split("$") + users.append((r[0], pw[1] + pw[2], r[2])) + c.close() + conn.close() + + self.c.executemany("INSERT INTO users(name, password, email) VALUES (?, ?, ?)", users) + move("pyload.db", "pyload.old.db") + + def createCursor(self): + return self.conn.cursor() + + @style.async + def commit(self): + self.conn.commit() + + @style.queue + def syncSave(self): + self.conn.commit() + + @style.async + def rollback(self): + self.conn.rollback() + + def async(self, f, *args, **kwargs): + args = (self,) + args + job = DatabaseJob(f, *args, **kwargs) + self.jobs.put(job) + + def queue(self, f, *args, **kwargs): + args = (self,) + args + job = DatabaseJob(f, *args, **kwargs) + self.jobs.put(job) + job.wait() + return job.result + + @classmethod + def registerSub(cls, klass): + cls.subs.append(klass) + + @classmethod + def unregisterSub(cls, klass): + cls.subs.remove(klass) + + def __getattr__(self, attr): + for sub in DatabaseBackend.subs: + if hasattr(sub, attr): + return getattr(sub, attr) diff --git a/pyload/database/FileDatabase.py b/pyload/database/FileDatabase.py new file mode 100644 index 000000000..fb30735bb --- /dev/null +++ b/pyload/database/FileDatabase.py @@ -0,0 +1,891 @@ +""" + 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 . + + @author: RaNaN + @author: mkaay +""" + + +from threading import RLock +from time import time + +from pyload.utils import formatSize, lock +from pyload.PullEvents import InsertEvent, ReloadAllEvent, RemoveEvent, UpdateEvent +from pyload.PyPackage import PyPackage +from pyload.PyFile import PyFile +from pyload.database import style, DatabaseBackend + +try: + from pysqlite2 import dbapi2 as sqlite3 +except: + import sqlite3 + + +class FileHandler: + """Handles all request made to obtain information, + modify status or other request for links or packages""" + + def __init__(self, core): + """Constructor""" + self.core = core + + # translations + self.statusMsg = [_("finished"), _("offline"), _("online"), _("queued"), _("skipped"), _("waiting"), _("temp. offline"), _("starting"), _("failed"), _("aborted"), _("decrypting"), _("custom"), _("downloading"), _("processing"), _("unknown")] + + self.cache = {} #holds instances for files + self.packageCache = {} # same for packages + #@TODO: purge the cache + + self.jobCache = {} + + self.lock = RLock() #@TODO should be a Lock w/o R + #self.lock._Verbose__verbose = True + + self.filecount = -1 # if an invalid value is set get current value from db + self.queuecount = -1 #number of package to be loaded + self.unchanged = False #determines if any changes was made since last call + + self.db = self.core.db + + def change(func): + def new(*args): + args[0].unchanged = False + args[0].filecount = -1 + args[0].queuecount = -1 + args[0].jobCache = {} + return func(*args) + return new + + #-------------------------------------------------------------------------- + def save(self): + """saves all data to backend""" + self.db.commit() + + #-------------------------------------------------------------------------- + def syncSave(self): + """saves all data to backend and waits until all data are written""" + pyfiles = self.cache.values() + for pyfile in pyfiles: + pyfile.sync() + + pypacks = self.packageCache.values() + for pypack in pypacks: + pypack.sync() + + self.db.syncSave() + + @lock + def getCompleteData(self, queue=1): + """gets a complete data representation""" + + data = self.db.getAllLinks(queue) + packs = self.db.getAllPackages(queue) + + data.update([(x.id, x.toDbDict()[x.id]) for x in self.cache.values()]) + + for x in self.packageCache.itervalues(): + if x.queue != queue or x.id not in packs: continue + packs[x.id].update(x.toDict()[x.id]) + + for key, value in data.iteritems(): + if value["package"] in packs: + packs[value["package"]]["links"][key] = value + + return packs + + @lock + def getInfoData(self, queue=1): + """gets a data representation without links""" + + packs = self.db.getAllPackages(queue) + for x in self.packageCache.itervalues(): + if x.queue != queue or x.id not in packs: continue + packs[x.id].update(x.toDict()[x.id]) + + return packs + + @lock + @change + def addLinks(self, urls, package): + """adds links""" + + self.core.hookManager.dispatchEvent("linksAdded", urls, package) + + data = self.core.pluginManager.parseUrls(urls) + + self.db.addLinks(data, package) + self.core.threadManager.createInfoThread(data, package) + + #@TODO change from reloadAll event to package update event + self.core.pullManager.addEvent(ReloadAllEvent("collector")) + + #-------------------------------------------------------------------------- + @lock + @change + def addPackage(self, name, folder, queue=0): + """adds a package, default to link collector""" + lastID = self.db.addPackage(name, folder, queue) + p = self.db.getPackage(lastID) + e = InsertEvent("pack", lastID, p.order, "collector" if not queue else "queue") + self.core.pullManager.addEvent(e) + return lastID + + #-------------------------------------------------------------------------- + @lock + @change + def deletePackage(self, id): + """delete package and all contained links""" + + p = self.getPackage(id) + if not p: + if id in self.packageCache: del self.packageCache[id] + return + + oldorder = p.order + queue = p.queue + + e = RemoveEvent("pack", id, "collector" if not p.queue else "queue") + + pyfiles = self.cache.values() + + for pyfile in pyfiles: + if pyfile.packageid == id: + pyfile.abortDownload() + pyfile.release() + + self.db.deletePackage(p) + self.core.pullManager.addEvent(e) + self.core.hookManager.dispatchEvent("packageDeleted", id) + + if id in self.packageCache: + del self.packageCache[id] + + packs = self.packageCache.values() + for pack in packs: + if pack.queue == queue and pack.order > oldorder: + pack.order -= 1 + pack.notifyChange() + + #-------------------------------------------------------------------------- + @lock + @change + def deleteLink(self, id): + """deletes links""" + + f = self.getFile(id) + if not f: + return None + + pid = f.packageid + e = RemoveEvent("file", id, "collector" if not f.package().queue else "queue") + + oldorder = f.order + + if id in self.core.threadManager.processingIds(): + self.cache[id].abortDownload() + + if id in self.cache: + del self.cache[id] + + self.db.deleteLink(f) + + self.core.pullManager.addEvent(e) + + p = self.getPackage(pid) + if not len(p.getChildren()): + p.delete() + + pyfiles = self.cache.values() + for pyfile in pyfiles: + if pyfile.packageid == pid and pyfile.order > oldorder: + pyfile.order -= 1 + pyfile.notifyChange() + + #-------------------------------------------------------------------------- + def releaseLink(self, id): + """removes pyfile from cache""" + if id in self.cache: + del self.cache[id] + + #-------------------------------------------------------------------------- + def releasePackage(self, id): + """removes package from cache""" + if id in self.packageCache: + del self.packageCache[id] + + #-------------------------------------------------------------------------- + def updateLink(self, pyfile): + """updates link""" + self.db.updateLink(pyfile) + + e = UpdateEvent("file", pyfile.id, "collector" if not pyfile.package().queue else "queue") + self.core.pullManager.addEvent(e) + + #-------------------------------------------------------------------------- + def updatePackage(self, pypack): + """updates a package""" + self.db.updatePackage(pypack) + + e = UpdateEvent("pack", pypack.id, "collector" if not pypack.queue else "queue") + self.core.pullManager.addEvent(e) + + #-------------------------------------------------------------------------- + def getPackage(self, id): + """return package instance""" + + if id in self.packageCache: + return self.packageCache[id] + else: + return self.db.getPackage(id) + + #-------------------------------------------------------------------------- + def getPackageData(self, id): + """returns dict with package information""" + pack = self.getPackage(id) + + if not pack: + return None + + pack = pack.toDict()[id] + + data = self.db.getPackageData(id) + + tmplist = [] + + cache = self.cache.values() + for x in cache: + if int(x.toDbDict()[x.id]["package"]) == int(id): + tmplist.append((x.id, x.toDbDict()[x.id])) + data.update(tmplist) + + pack["links"] = data + + return pack + + #-------------------------------------------------------------------------- + def getFileData(self, id): + """returns dict with file information""" + if id in self.cache: + return self.cache[id].toDbDict() + + return self.db.getLinkData(id) + + #-------------------------------------------------------------------------- + def getFile(self, id): + """returns pyfile instance""" + if id in self.cache: + return self.cache[id] + else: + return self.db.getFile(id) + + #-------------------------------------------------------------------------- + @lock + def getJob(self, occ): + """get suitable job""" + + #@TODO clean mess + #@TODO improve selection of valid jobs + + if occ in self.jobCache: + if self.jobCache[occ]: + id = self.jobCache[occ].pop() + if id == "empty": + pyfile = None + self.jobCache[occ].append("empty") + else: + pyfile = self.getFile(id) + else: + jobs = self.db.getJob(occ) + jobs.reverse() + if not jobs: + self.jobCache[occ].append("empty") + pyfile = None + else: + self.jobCache[occ].extend(jobs) + pyfile = self.getFile(self.jobCache[occ].pop()) + + else: + self.jobCache = {} #better not caching to much + jobs = self.db.getJob(occ) + jobs.reverse() + self.jobCache[occ] = jobs + + if not jobs: + self.jobCache[occ].append("empty") + pyfile = None + else: + pyfile = self.getFile(self.jobCache[occ].pop()) + + #@TODO: maybe the new job has to be approved... + + + #pyfile = self.getFile(self.jobCache[occ].pop()) + return pyfile + + @lock + def getDecryptJob(self): + """return job for decrypting""" + if "decrypt" in self.jobCache: + return None + + plugins = self.core.pluginManager.crypterPlugins.keys() + self.core.pluginManager.containerPlugins.keys() + plugins = str(tuple(plugins)) + + jobs = self.db.getPluginJob(plugins) + if jobs: + return self.getFile(jobs[0]) + else: + self.jobCache["decrypt"] = "empty" + return None + + def getFileCount(self): + """returns number of files""" + + if self.filecount == -1: + self.filecount = self.db.filecount(1) + + return self.filecount + + def getQueueCount(self, force=False): + """number of files that have to be processed""" + if self.queuecount == -1 or force: + self.queuecount = self.db.queuecount(1) + + return self.queuecount + + def checkAllLinksFinished(self): + """checks if all files are finished and dispatch event""" + + if not self.getQueueCount(True): + self.core.hookManager.dispatchEvent("allDownloadsFinished") + self.core.log.debug("All downloads finished") + return True + + return False + + def checkAllLinksProcessed(self, fid): + """checks if all files was processed and pyload would idle now, needs fid which will be ignored when counting""" + + # reset count so statistic will update (this is called when dl was processed) + self.resetCount() + + if not self.db.processcount(1, fid): + self.core.hookManager.dispatchEvent("allDownloadsProcessed") + self.core.log.debug("All downloads processed") + return True + + return False + + def resetCount(self): + self.queuecount = -1 + + @lock + @change + def restartPackage(self, id): + """restart package""" + pyfiles = self.cache.values() + for pyfile in pyfiles: + if pyfile.packageid == id: + self.restartFile(pyfile.id) + + self.db.restartPackage(id) + + if id in self.packageCache: + self.packageCache[id].setFinished = False + + e = UpdateEvent("pack", id, "collector" if not self.getPackage(id).queue else "queue") + self.core.pullManager.addEvent(e) + + @lock + @change + def restartFile(self, id): + """ restart file""" + if id in self.cache: + self.cache[id].status = 3 + self.cache[id].name = self.cache[id].url + self.cache[id].error = "" + self.cache[id].abortDownload() + + + self.db.restartFile(id) + + e = UpdateEvent("file", id, "collector" if not self.getFile(id).package().queue else "queue") + self.core.pullManager.addEvent(e) + + @lock + @change + def setPackageLocation(self, id, queue): + """push package to queue""" + + p = self.db.getPackage(id) + oldorder = p.order + + e = RemoveEvent("pack", id, "collector" if not p.queue else "queue") + self.core.pullManager.addEvent(e) + + self.db.clearPackageOrder(p) + + p = self.db.getPackage(id) + + p.queue = queue + self.db.updatePackage(p) + + self.db.reorderPackage(p, -1, True) + + packs = self.packageCache.values() + for pack in packs: + if pack.queue != queue and pack.order > oldorder: + pack.order -= 1 + pack.notifyChange() + + self.db.commit() + self.releasePackage(id) + p = self.getPackage(id) + + e = InsertEvent("pack", id, p.order, "collector" if not p.queue else "queue") + self.core.pullManager.addEvent(e) + + @lock + @change + def reorderPackage(self, id, position): + p = self.getPackage(id) + + e = RemoveEvent("pack", id, "collector" if not p.queue else "queue") + self.core.pullManager.addEvent(e) + self.db.reorderPackage(p, position) + + packs = self.packageCache.values() + for pack in packs: + if pack.queue != p.queue or pack.order < 0 or pack == p: continue + if p.order > position: + if pack.order >= position and pack.order < p.order: + pack.order += 1 + pack.notifyChange() + elif p.order < position: + if pack.order <= position and pack.order > p.order: + pack.order -= 1 + pack.notifyChange() + + p.order = position + self.db.commit() + + e = InsertEvent("pack", id, position, "collector" if not p.queue else "queue") + self.core.pullManager.addEvent(e) + + @lock + @change + def reorderFile(self, id, position): + f = self.getFileData(id) + f = f[id] + + e = RemoveEvent("file", id, "collector" if not self.getPackage(f["package"]).queue else "queue") + self.core.pullManager.addEvent(e) + + self.db.reorderLink(f, position) + + pyfiles = self.cache.values() + for pyfile in pyfiles: + if pyfile.packageid != f["package"] or pyfile.order < 0: continue + if f["order"] > position: + if pyfile.order >= position and pyfile.order < f["order"]: + pyfile.order += 1 + pyfile.notifyChange() + elif f["order"] < position: + if pyfile.order <= position and pyfile.order > f["order"]: + pyfile.order -= 1 + pyfile.notifyChange() + + if id in self.cache: + self.cache[id].order = position + + self.db.commit() + + e = InsertEvent("file", id, position, "collector" if not self.getPackage(f["package"]).queue else "queue") + self.core.pullManager.addEvent(e) + + @change + def updateFileInfo(self, data, pid): + """ updates file info (name, size, status, url)""" + ids = self.db.updateLinkInfo(data) + e = UpdateEvent("pack", pid, "collector" if not self.getPackage(pid).queue else "queue") + self.core.pullManager.addEvent(e) + + def checkPackageFinished(self, pyfile): + """ checks if package is finished and calls hookmanager """ + + ids = self.db.getUnfinished(pyfile.packageid) + if not ids or (pyfile.id in ids and len(ids) == 1): + if not pyfile.package().setFinished: + self.core.log.info(_("Package finished: %s") % pyfile.package().name) + self.core.hookManager.packageFinished(pyfile.package()) + pyfile.package().setFinished = True + + + def reCheckPackage(self, pid): + """ recheck links in package """ + data = self.db.getPackageData(pid) + + urls = [] + + for pyfile in data.itervalues(): + if pyfile["status"] not in (0, 12, 13): + urls.append((pyfile["url"], pyfile["plugin"])) + + self.core.threadManager.createInfoThread(urls, pid) + + @lock + @change + def deleteFinishedLinks(self): + """ deletes finished links and packages, return deleted packages """ + + old_packs = self.getInfoData(0) + old_packs.update(self.getInfoData(1)) + + self.db.deleteFinished() + + new_packs = self.db.getAllPackages(0) + new_packs.update(self.db.getAllPackages(1)) + #get new packages only from db + + deleted = [] + for id in old_packs.iterkeys(): + if id not in new_packs: + deleted.append(id) + self.deletePackage(int(id)) + + return deleted + + @lock + @change + def restartFailed(self): + """ restart all failed links """ + self.db.restartFailed() + +class FileMethods: + @style.queue + def filecount(self, queue): + """returns number of files in queue""" + self.c.execute("SELECT COUNT(*) FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE p.queue=?", (queue,)) + return self.c.fetchone()[0] + + @style.queue + def queuecount(self, queue): + """ number of files in queue not finished yet""" + self.c.execute("SELECT COUNT(*) FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE p.queue=? AND l.status NOT IN (0, 4)", (queue,)) + return self.c.fetchone()[0] + + @style.queue + def processcount(self, queue, fid): + """ number of files which have to be proccessed """ + self.c.execute("SELECT COUNT(*) FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE p.queue=? AND l.status IN (2, 3, 5, 7, 12) AND l.id != ?", (queue, str(fid))) + return self.c.fetchone()[0] + + @style.inner + def _nextPackageOrder(self, queue=0): + self.c.execute('SELECT MAX(packageorder) FROM packages WHERE queue=?', (queue,)) + max = self.c.fetchone()[0] + if max is not None: + return max + 1 + else: + return 0 + + @style.inner + def _nextFileOrder(self, package): + self.c.execute('SELECT MAX(linkorder) FROM links WHERE package=?', (package,)) + max = self.c.fetchone()[0] + if max is not None: + return max + 1 + else: + return 0 + + @style.queue + def addLink(self, url, name, plugin, package): + order = self._nextFileOrder(package) + self.c.execute('INSERT INTO links(url, name, plugin, package, linkorder) VALUES(?,?,?,?,?)', (url, name, plugin, package, order)) + return self.c.lastrowid + + @style.queue + def addLinks(self, links, package): + """ links is a list of tupels (url, plugin)""" + order = self._nextFileOrder(package) + orders = [order + x for x in range(len(links))] + links = [(x[0], x[0], x[1], package, o) for x, o in zip(links, orders)] + self.c.executemany('INSERT INTO links(url, name, plugin, package, linkorder) VALUES(?,?,?,?,?)', links) + + @style.queue + def addPackage(self, name, folder, queue): + order = self._nextPackageOrder(queue) + self.c.execute('INSERT INTO packages(name, folder, queue, packageorder) VALUES(?,?,?,?)', (name, folder, queue, order)) + return self.c.lastrowid + + @style.queue + def deletePackage(self, p): + + self.c.execute('DELETE FROM links WHERE package=?', (str(p.id),)) + self.c.execute('DELETE FROM packages WHERE id=?', (str(p.id),)) + self.c.execute('UPDATE packages SET packageorder=packageorder-1 WHERE packageorder > ? AND queue=?', (p.order, p.queue)) + + @style.queue + def deleteLink(self, f): + + self.c.execute('DELETE FROM links WHERE id=?', (str(f.id),)) + self.c.execute('UPDATE links SET linkorder=linkorder-1 WHERE linkorder > ? AND package=?', (f.order, str(f.packageid))) + + + @style.queue + def getAllLinks(self, q): + """return information about all links in queue q + + q0 queue + q1 collector + + format: + + { + id: {'name': name, ... 'package': id }, ... + } + + """ + self.c.execute('SELECT l.id, l.url, l.name, l.size, l.status, l.error, l.plugin, l.package, l.linkorder FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE p.queue=? ORDER BY l.linkorder', (q,)) + data = {} + for r in self.c: + data[r[0]] = { + 'id': r[0], + 'url': r[1], + 'name': r[2], + 'size': r[3], + 'format_size': formatSize(r[3]), + 'status': r[4], + 'statusmsg': self.manager.statusMsg[r[4]], + 'error': r[5], + 'plugin': r[6], + 'package': r[7], + 'order': r[8], + } + + return data + + @style.queue + def getAllPackages(self, q): + """return information about packages in queue q + (only useful in get all data) + + q0 queue + q1 collector + + format: + + { + id: {'name': name ... 'links': {}}, ... + } + """ + self.c.execute('SELECT p.id, p.name, p.folder, p.site, p.password, p.queue, p.packageorder, s.sizetotal, s.sizedone, s.linksdone, s.linkstotal \ + FROM packages p JOIN pstats s ON p.id = s.id \ + WHERE p.queue=? ORDER BY p.packageorder', str(q)) + + data = {} + for r in self.c: + data[r[0]] = { + 'id': r[0], + 'name': r[1], + 'folder': r[2], + 'site': r[3], + 'password': r[4], + 'queue': r[5], + 'order': r[6], + 'sizetotal': int(r[7]), + 'sizedone': r[8] if r[8] else 0, #these can be None + 'linksdone': r[9] if r[9] else 0, + 'linkstotal': r[10], + 'links': {} + } + + return data + + @style.queue + def getLinkData(self, id): + """get link information as dict""" + self.c.execute('SELECT id, url, name, size, status, error, plugin, package, linkorder FROM links WHERE id=?', (str(id),)) + data = {} + r = self.c.fetchone() + if not r: + return None + data[r[0]] = { + 'id': r[0], + 'url': r[1], + 'name': r[2], + 'size': r[3], + 'format_size': formatSize(r[3]), + 'status': r[4], + 'statusmsg': self.manager.statusMsg[r[4]], + 'error': r[5], + 'plugin': r[6], + 'package': r[7], + 'order': r[8], + } + + return data + + @style.queue + def getPackageData(self, id): + """get data about links for a package""" + self.c.execute('SELECT id, url, name, size, status, error, plugin, package, linkorder FROM links WHERE package=? ORDER BY linkorder', (str(id),)) + + data = {} + for r in self.c: + data[r[0]] = { + 'id': r[0], + 'url': r[1], + 'name': r[2], + 'size': r[3], + 'format_size': formatSize(r[3]), + 'status': r[4], + 'statusmsg': self.manager.statusMsg[r[4]], + 'error': r[5], + 'plugin': r[6], + 'package': r[7], + 'order': r[8], + } + + return data + + + @style.async + def updateLink(self, f): + self.c.execute('UPDATE links SET url=?, name=?, size=?, status=?, error=?, package=? WHERE id=?', (f.url, f.name, f.size, f.status, f.error, str(f.packageid), str(f.id))) + + @style.queue + def updatePackage(self, p): + self.c.execute('UPDATE packages SET name=?, folder=?, site=?, password=?, queue=? WHERE id=?', (p.name, p.folder, p.site, p.password, p.queue, str(p.id))) + + @style.queue + def updateLinkInfo(self, data): + """ data is list of tupels (name, size, status, url) """ + self.c.executemany('UPDATE links SET name=?, size=?, status=? WHERE url=? AND status IN (1, 2, 3, 14)', data) + ids = [] + self.c.execute('SELECT id FROM links WHERE url IN (\'%s\')' % "','".join([x[3] for x in data])) + for r in self.c: + ids.append(int(r[0])) + return ids + + @style.queue + def reorderPackage(self, p, position, noMove=False): + if position == -1: + position = self._nextPackageOrder(p.queue) + if not noMove: + if p.order > position: + self.c.execute('UPDATE packages SET packageorder=packageorder+1 WHERE packageorder >= ? AND packageorder < ? AND queue=? AND packageorder >= 0', (position, p.order, p.queue)) + elif p.order < position: + self.c.execute('UPDATE packages SET packageorder=packageorder-1 WHERE packageorder <= ? AND packageorder > ? AND queue=? AND packageorder >= 0', (position, p.order, p.queue)) + + self.c.execute('UPDATE packages SET packageorder=? WHERE id=?', (position, str(p.id))) + + @style.queue + def reorderLink(self, f, position): + """ reorder link with f as dict for pyfile """ + if f["order"] > position: + self.c.execute('UPDATE links SET linkorder=linkorder+1 WHERE linkorder >= ? AND linkorder < ? AND package=?', (position, f["order"], f["package"])) + elif f["order"] < position: + self.c.execute('UPDATE links SET linkorder=linkorder-1 WHERE linkorder <= ? AND linkorder > ? AND package=?', (position, f["order"], f["package"])) + + self.c.execute('UPDATE links SET linkorder=? WHERE id=?', (position, f["id"])) + + @style.queue + def clearPackageOrder(self, p): + self.c.execute('UPDATE packages SET packageorder=? WHERE id=?', (-1, str(p.id))) + self.c.execute('UPDATE packages SET packageorder=packageorder-1 WHERE packageorder > ? AND queue=? AND id != ?', (p.order, p.queue, str(p.id))) + + @style.async + def restartFile(self, id): + self.c.execute('UPDATE links SET status=3, error="" WHERE id=?', (str(id),)) + + @style.async + def restartPackage(self, id): + self.c.execute('UPDATE links SET status=3 WHERE package=?', (str(id),)) + + @style.queue + def getPackage(self, id): + """return package instance from id""" + self.c.execute("SELECT name, folder, site, password, queue, packageorder FROM packages WHERE id=?", (str(id),)) + r = self.c.fetchone() + if not r: return None + return PyPackage(self.manager, id, * r) + + #-------------------------------------------------------------------------- + @style.queue + def getFile(self, id): + """return link instance from id""" + self.c.execute("SELECT url, name, size, status, error, plugin, package, linkorder FROM links WHERE id=?", (str(id),)) + r = self.c.fetchone() + if not r: return None + return PyFile(self.manager, id, * r) + + + @style.queue + def getJob(self, occ): + """return pyfile ids, which are suitable for download and dont use a occupied plugin""" + + #@TODO improve this hardcoded method + pre = "('DLC', 'LinkList', 'SerienjunkiesOrg', 'CCF', 'RSDF')" #plugins which are processed in collector + + cmd = "(" + for i, item in enumerate(occ): + if i: cmd += ", " + cmd += "'%s'" % item + + cmd += ")" + + cmd = "SELECT l.id FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE ((p.queue=1 AND l.plugin NOT IN %s) OR l.plugin IN %s) AND l.status IN (2, 3, 14) ORDER BY p.packageorder ASC, l.linkorder ASC LIMIT 5" % (cmd, pre) + + self.c.execute(cmd) # very bad! + + return [x[0] for x in self.c] + + @style.queue + def getPluginJob(self, plugins): + """returns pyfile ids with suited plugins""" + cmd = "SELECT l.id FROM links as l INNER JOIN packages as p ON l.package=p.id WHERE l.plugin IN %s AND l.status IN (2, 3, 14) ORDER BY p.packageorder ASC, l.linkorder ASC LIMIT 5" % plugins + + self.c.execute(cmd) # very bad! + + return [x[0] for x in self.c] + + @style.queue + def getUnfinished(self, pid): + """return list of max length 3 ids with pyfiles in package not finished or processed""" + + self.c.execute("SELECT id FROM links WHERE package=? AND status NOT IN (0, 4, 13) LIMIT 3", (str(pid),)) + return [r[0] for r in self.c] + + @style.queue + def deleteFinished(self): + self.c.execute("DELETE FROM links WHERE status IN (0, 4)") + self.c.execute("DELETE FROM packages WHERE NOT EXISTS(SELECT 1 FROM links WHERE packages.id=links.package)") + + @style.queue + def restartFailed(self): + self.c.execute("UPDATE links SET status=3, error='' WHERE status IN (6, 8, 9)") + + @style.queue + def findDuplicates(self, id, folder, filename): + """ checks if filename exists with different id and same package """ + self.c.execute("SELECT l.plugin FROM links as l INNER JOIN packages as p ON l.package=p.id AND p.folder=? WHERE l.id!=? AND l.status=0 AND l.name=?", (folder, id, filename)) + return self.c.fetchone() + + @style.queue + def purgeLinks(self): + self.c.execute("DELETE FROM links;") + self.c.execute("DELETE FROM packages;") + +DatabaseBackend.registerSub(FileMethods) diff --git a/pyload/database/StorageDatabase.py b/pyload/database/StorageDatabase.py new file mode 100644 index 000000000..c2473e7b7 --- /dev/null +++ b/pyload/database/StorageDatabase.py @@ -0,0 +1,49 @@ +# -*- 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 . + + @author: mkaay +""" + +from pyload.database import style +from pyload.database import DatabaseBackend + +class StorageMethods: + @style.queue + def setStorage(db, identifier, key, value): + db.c.execute("SELECT id FROM storage WHERE identifier=? AND key=?", (identifier, key)) + if db.c.fetchone() is not None: + db.c.execute("UPDATE storage SET value=? WHERE identifier=? AND key=?", (value, identifier, key)) + else: + db.c.execute("INSERT INTO storage (identifier, key, value) VALUES (?, ?, ?)", (identifier, key, value)) + + @style.queue + def getStorage(db, identifier, key=None): + if key is not None: + db.c.execute("SELECT value FROM storage WHERE identifier=? AND key=?", (identifier, key)) + row = db.c.fetchone() + if row is not None: + return row[0] + else: + db.c.execute("SELECT key, value FROM storage WHERE identifier=?", (identifier,)) + d = {} + for row in db.c: + d[row[0]] = row[1] + return d + + @style.queue + def delStorage(db, identifier, key): + db.c.execute("DELETE FROM storage WHERE identifier=? AND key=?", (identifier, key)) + +DatabaseBackend.registerSub(StorageMethods) diff --git a/pyload/database/UserDatabase.py b/pyload/database/UserDatabase.py new file mode 100644 index 000000000..59b0f6dbf --- /dev/null +++ b/pyload/database/UserDatabase.py @@ -0,0 +1,108 @@ +# -*- 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 . + + @author: mkaay +""" + +from hashlib import sha1 +import random + +from DatabaseBackend import DatabaseBackend +from DatabaseBackend import style + +class UserMethods: + @style.queue + def checkAuth(db, user, password): + c = db.c + c.execute('SELECT id, name, password, role, permission, template, email FROM "users" WHERE name=?', (user,)) + r = c.fetchone() + if not r: + return {} + + salt = r[2][:5] + pw = r[2][5:] + h = sha1(salt + password) + if h.hexdigest() == pw: + return {"id": r[0], "name": r[1], "role": r[3], + "permission": r[4], "template": r[5], "email": r[6]} + else: + return {} + + @style.queue + def addUser(db, user, password): + salt = reduce(lambda x, y: x + y, [str(random.randint(0, 9)) for i in range(0, 5)]) + h = sha1(salt + password) + password = salt + h.hexdigest() + + c = db.c + c.execute('SELECT name FROM users WHERE name=?', (user,)) + if c.fetchone() is not None: + c.execute('UPDATE users SET password=? WHERE name=?', (password, user)) + else: + c.execute('INSERT INTO users (name, password) VALUES (?, ?)', (user, password)) + + + @style.queue + def changePassword(db, user, oldpw, newpw): + db.c.execute('SELECT id, name, password FROM users WHERE name=?', (user,)) + r = db.c.fetchone() + if not r: + return False + + salt = r[2][:5] + pw = r[2][5:] + h = sha1(salt + oldpw) + if h.hexdigest() == pw: + salt = reduce(lambda x, y: x + y, [str(random.randint(0, 9)) for i in range(0, 5)]) + h = sha1(salt + newpw) + password = salt + h.hexdigest() + + db.c.execute("UPDATE users SET password=? WHERE name=?", (password, user)) + return True + + return False + + + @style.async + def setPermission(db, user, perms): + db.c.execute("UPDATE users SET permission=? WHERE name=?", (perms, user)) + + @style.async + def setRole(db, user, role): + db.c.execute("UPDATE users SET role=? WHERE name=?", (role, user)) + + + @style.queue + def listUsers(db): + db.c.execute('SELECT name FROM users') + users = [] + for row in db.c: + users.append(row[0]) + return users + + @style.queue + def getAllUserData(db): + db.c.execute("SELECT name, permission, role, template, email FROM users") + user = {} + for r in db.c: + user[r[0]] = {"permission": r[1], "role": r[2], "template": r[3], "email": r[4]} + + return user + + @style.queue + def removeUser(db, user): + db.c.execute('DELETE FROM users WHERE name=?', (user,)) + +DatabaseBackend.registerSub(UserMethods) diff --git a/pyload/database/__init__.py b/pyload/database/__init__.py new file mode 100644 index 000000000..5f287a47f --- /dev/null +++ b/pyload/database/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +from DatabaseBackend import DatabaseBackend +from DatabaseBackend import style + +from FileDatabase import FileHandler +from UserDatabase import UserMethods +from StorageDatabase import StorageMethods diff --git a/pyload/debug.py b/pyload/debug.py new file mode 100644 index 000000000..54a159e78 --- /dev/null +++ b/pyload/debug.py @@ -0,0 +1,94 @@ +#coding:utf-8 + +import re +import InitHomeDir +from os import listdir + +class Wrapper(object): + pass + +def filter_info(line): + if "object at 0x" in line: + return False + elif " at line " in line: + return False + elif " . + + @author: RaNaN +""" + +from sys import argv +from sys import exit + +import socket +import thread + +from traceback import print_exc + +class Forwarder: + + def __init__(self, extip, extport=9666): + print "Start portforwarding to %s:%s" % (extip, extport) + proxy(extip, extport, 9666) + + +def proxy(*settings): + while True: + server(*settings) + +def server(*settings): + try: + dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + dock_socket.bind(("127.0.0.1", settings[2])) + dock_socket.listen(5) + while True: + client_socket = dock_socket.accept()[0] + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_socket.connect((settings[0], settings[1])) + thread.start_new_thread(forward, (client_socket, server_socket)) + thread.start_new_thread(forward, (server_socket, client_socket)) + except Exception: + print_exc() + +def forward(source, destination): + string = ' ' + while string: + string = source.recv(1024) + if string: + destination.sendall(string) + else: + #source.shutdown(socket.SHUT_RD) + destination.shutdown(socket.SHUT_WR) diff --git a/pyload/lib/BeautifulSoup.py b/pyload/lib/BeautifulSoup.py new file mode 100644 index 000000000..7278215ca --- /dev/null +++ b/pyload/lib/BeautifulSoup.py @@ -0,0 +1,2017 @@ +"""Beautiful Soup +Elixir and Tonic +"The Screen-Scraper's Friend" +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup parses a (possibly invalid) XML or HTML document into a +tree representation. It provides methods and Pythonic idioms that make +it easy to navigate, search, and modify the tree. + +A well-formed XML/HTML document yields a well-formed data +structure. An ill-formed XML/HTML document yields a correspondingly +ill-formed data structure. If your document is only locally +well-formed, you can use this library to find and process the +well-formed part of it. + +Beautiful Soup works with Python 2.2 and up. It has no external +dependencies, but you'll have more success at converting data to UTF-8 +if you also install these three packages: + +* chardet, for auto-detecting character encodings + http://chardet.feedparser.org/ +* cjkcodecs and iconv_codec, which add more encodings to the ones supported + by stock Python. + http://cjkpython.i18n.org/ + +Beautiful Soup defines classes for two main parsing strategies: + + * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific + language that kind of looks like XML. + + * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid + or invalid. This class has web browser-like heuristics for + obtaining a sensible parse tree in the face of common HTML errors. + +Beautiful Soup also defines a class (UnicodeDammit) for autodetecting +the encoding of an HTML or XML document, and converting it to +Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: +http://www.crummy.com/software/BeautifulSoup/documentation.html + +Here, have some legalese: + +Copyright (c) 2004-2010, Leonard Richardson + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the the Beautiful Soup Consortium and All + Night Kosher Bakery nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE, DAMMIT. + +""" +from __future__ import generators + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "3.2.1" +__copyright__ = "Copyright (c) 2004-2012 Leonard Richardson" +__license__ = "New-style BSD" + +from sgmllib import SGMLParser, SGMLParseError +import codecs +import markupbase +import types +import re +import sgmllib +try: + from htmlentitydefs import name2codepoint +except ImportError: + name2codepoint = {} +try: + set +except NameError: + from sets import Set as set + +#These hacks make Beautiful Soup able to parse XML with namespaces +sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') +markupbase._declname_match = re.compile(r'[a-zA-Z][-_.:a-zA-Z0-9]*\s*').match + +DEFAULT_OUTPUT_ENCODING = "utf-8" + +def _match_css_class(str): + """Build a RE to match the given CSS class.""" + return re.compile(r"(^|.*\s)%s($|\s)" % str) + +# First, the classes that represent markup elements. + +class PageElement(object): + """Contains the navigational information for some part of the page + (either a tag or a piece of text)""" + + def _invert(h): + "Cheap function to invert a hash." + i = {} + for k,v in h.items(): + i[v] = k + return i + + XML_ENTITIES_TO_SPECIAL_CHARS = { "apos" : "'", + "quot" : '"', + "amp" : "&", + "lt" : "<", + "gt" : ">" } + + XML_SPECIAL_CHARS_TO_ENTITIES = _invert(XML_ENTITIES_TO_SPECIAL_CHARS) + + def setup(self, parent=None, previous=None): + """Sets up the initial relations between this element and + other elements.""" + self.parent = parent + self.previous = previous + self.next = None + self.previousSibling = None + self.nextSibling = None + if self.parent and self.parent.contents: + self.previousSibling = self.parent.contents[-1] + self.previousSibling.nextSibling = self + + def replaceWith(self, replaceWith): + oldParent = self.parent + myIndex = self.parent.index(self) + if hasattr(replaceWith, "parent")\ + and replaceWith.parent is self.parent: + # We're replacing this element with one of its siblings. + index = replaceWith.parent.index(replaceWith) + if index and index < myIndex: + # Furthermore, it comes before this element. That + # means that when we extract it, the index of this + # element will change. + myIndex = myIndex - 1 + self.extract() + oldParent.insert(myIndex, replaceWith) + + def replaceWithChildren(self): + myParent = self.parent + myIndex = self.parent.index(self) + self.extract() + reversedChildren = list(self.contents) + reversedChildren.reverse() + for child in reversedChildren: + myParent.insert(myIndex, child) + + def extract(self): + """Destructively rips this element out of the tree.""" + if self.parent: + try: + del self.parent.contents[self.parent.index(self)] + except ValueError: + pass + + #Find the two elements that would be next to each other if + #this element (and any children) hadn't been parsed. Connect + #the two. + lastChild = self._lastRecursiveChild() + nextElement = lastChild.next + + if self.previous: + self.previous.next = nextElement + if nextElement: + nextElement.previous = self.previous + self.previous = None + lastChild.next = None + + self.parent = None + if self.previousSibling: + self.previousSibling.nextSibling = self.nextSibling + if self.nextSibling: + self.nextSibling.previousSibling = self.previousSibling + self.previousSibling = self.nextSibling = None + return self + + def _lastRecursiveChild(self): + "Finds the last element beneath this object to be parsed." + lastChild = self + while hasattr(lastChild, 'contents') and lastChild.contents: + lastChild = lastChild.contents[-1] + return lastChild + + def insert(self, position, newChild): + if isinstance(newChild, basestring) \ + and not isinstance(newChild, NavigableString): + newChild = NavigableString(newChild) + + position = min(position, len(self.contents)) + if hasattr(newChild, 'parent') and newChild.parent is not None: + # We're 'inserting' an element that's already one + # of this object's children. + if newChild.parent is self: + index = self.index(newChild) + if index > position: + # Furthermore we're moving it further down the + # list of this object's children. That means that + # when we extract this element, our target index + # will jump down one. + position = position - 1 + newChild.extract() + + newChild.parent = self + previousChild = None + if position == 0: + newChild.previousSibling = None + newChild.previous = self + else: + previousChild = self.contents[position-1] + newChild.previousSibling = previousChild + newChild.previousSibling.nextSibling = newChild + newChild.previous = previousChild._lastRecursiveChild() + if newChild.previous: + newChild.previous.next = newChild + + newChildsLastElement = newChild._lastRecursiveChild() + + if position >= len(self.contents): + newChild.nextSibling = None + + parent = self + parentsNextSibling = None + while not parentsNextSibling: + parentsNextSibling = parent.nextSibling + parent = parent.parent + if not parent: # This is the last element in the document. + break + if parentsNextSibling: + newChildsLastElement.next = parentsNextSibling + else: + newChildsLastElement.next = None + else: + nextChild = self.contents[position] + newChild.nextSibling = nextChild + if newChild.nextSibling: + newChild.nextSibling.previousSibling = newChild + newChildsLastElement.next = nextChild + + if newChildsLastElement.next: + newChildsLastElement.next.previous = newChildsLastElement + self.contents.insert(position, newChild) + + def append(self, tag): + """Appends the given tag to the contents of this tag.""" + self.insert(len(self.contents), tag) + + def findNext(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears after this Tag in the document.""" + return self._findOne(self.findAllNext, name, attrs, text, **kwargs) + + def findAllNext(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + after this Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.nextGenerator, + **kwargs) + + def findNextSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears after this Tag in the document.""" + return self._findOne(self.findNextSiblings, name, attrs, text, + **kwargs) + + def findNextSiblings(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear after this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.nextSiblingGenerator, **kwargs) + fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x + + def findPrevious(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears before this Tag in the document.""" + return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs) + + def findAllPrevious(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.previousGenerator, + **kwargs) + fetchPrevious = findAllPrevious # Compatibility with pre-3.x + + def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears before this Tag in the document.""" + return self._findOne(self.findPreviousSiblings, name, attrs, text, + **kwargs) + + def findPreviousSiblings(self, name=None, attrs={}, text=None, + limit=None, **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.previousSiblingGenerator, **kwargs) + fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x + + def findParent(self, name=None, attrs={}, **kwargs): + """Returns the closest parent of this Tag that matches the given + criteria.""" + # NOTE: We can't use _findOne because findParents takes a different + # set of arguments. + r = None + l = self.findParents(name, attrs, 1) + if l: + r = l[0] + return r + + def findParents(self, name=None, attrs={}, limit=None, **kwargs): + """Returns the parents of this Tag that match the given + criteria.""" + + return self._findAll(name, attrs, None, limit, self.parentGenerator, + **kwargs) + fetchParents = findParents # Compatibility with pre-3.x + + #These methods do the real heavy lifting. + + def _findOne(self, method, name, attrs, text, **kwargs): + r = None + l = method(name, attrs, text, 1, **kwargs) + if l: + r = l[0] + return r + + def _findAll(self, name, attrs, text, limit, generator, **kwargs): + "Iterates over a generator looking for things that match." + + if isinstance(name, SoupStrainer): + strainer = name + # (Possibly) special case some findAll*(...) searches + elif text is None and not limit and not attrs and not kwargs: + # findAll*(True) + if name is True: + return [element for element in generator() + if isinstance(element, Tag)] + # findAll*('tag-name') + elif isinstance(name, basestring): + return [element for element in generator() + if isinstance(element, Tag) and + element.name == name] + else: + strainer = SoupStrainer(name, attrs, text, **kwargs) + # Build a SoupStrainer + else: + strainer = SoupStrainer(name, attrs, text, **kwargs) + results = ResultSet(strainer) + g = generator() + while True: + try: + i = g.next() + except StopIteration: + break + if i: + found = strainer.search(i) + if found: + results.append(found) + if limit and len(results) >= limit: + break + return results + + #These Generators can be used to navigate starting from both + #NavigableStrings and Tags. + def nextGenerator(self): + i = self + while i is not None: + i = i.next + yield i + + def nextSiblingGenerator(self): + i = self + while i is not None: + i = i.nextSibling + yield i + + def previousGenerator(self): + i = self + while i is not None: + i = i.previous + yield i + + def previousSiblingGenerator(self): + i = self + while i is not None: + i = i.previousSibling + yield i + + def parentGenerator(self): + i = self + while i is not None: + i = i.parent + yield i + + # Utility methods + def substituteEncoding(self, str, encoding=None): + encoding = encoding or "utf-8" + return str.replace("%SOUP-ENCODING%", encoding) + + def toEncoding(self, s, encoding=None): + """Encodes an object to a string in some encoding, or to Unicode. + .""" + if isinstance(s, unicode): + if encoding: + s = s.encode(encoding) + elif isinstance(s, str): + if encoding: + s = s.encode(encoding) + else: + s = unicode(s) + else: + if encoding: + s = self.toEncoding(str(s), encoding) + else: + s = unicode(s) + return s + + BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|" + + "&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)" + + ")") + + def _sub_entity(self, x): + """Used with a regular expression to substitute the + appropriate XML entity for an XML special character.""" + return "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";" + + +class NavigableString(unicode, PageElement): + + def __new__(cls, value): + """Create a new NavigableString. + + When unpickling a NavigableString, this method is called with + the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be + passed in to the superclass's __new__ or the superclass won't know + how to handle non-ASCII characters. + """ + if isinstance(value, unicode): + return unicode.__new__(cls, value) + return unicode.__new__(cls, value, DEFAULT_OUTPUT_ENCODING) + + def __getnewargs__(self): + return (NavigableString.__str__(self),) + + def __getattr__(self, attr): + """text.string gives you text. This is for backwards + compatibility for Navigable*String, but for CData* it lets you + get the string without the CData wrapper.""" + if attr == 'string': + return self + else: + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr) + + def __unicode__(self): + return str(self).decode(DEFAULT_OUTPUT_ENCODING) + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + # Substitute outgoing XML entities. + data = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, self) + if encoding: + return data.encode(encoding) + else: + return data + +class CData(NavigableString): + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class ProcessingInstruction(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + output = self + if "%SOUP-ENCODING%" in output: + output = self.substituteEncoding(output, encoding) + return "" % self.toEncoding(output, encoding) + +class Comment(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class Declaration(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class Tag(PageElement): + + """Represents a found HTML tag with its attributes and contents.""" + + def _convertEntities(self, match): + """Used in a call to re.sub to replace HTML, XML, and numeric + entities with the appropriate Unicode characters. If HTML + entities are being converted, any unrecognized entities are + escaped.""" + x = match.group(1) + if self.convertHTMLEntities and x in name2codepoint: + return unichr(name2codepoint[x]) + elif x in self.XML_ENTITIES_TO_SPECIAL_CHARS: + if self.convertXMLEntities: + return self.XML_ENTITIES_TO_SPECIAL_CHARS[x] + else: + return u'&%s;' % x + elif len(x) > 0 and x[0] == '#': + # Handle numeric entities + if len(x) > 1 and x[1] == 'x': + return unichr(int(x[2:], 16)) + else: + return unichr(int(x[1:])) + + elif self.escapeUnrecognizedEntities: + return u'&%s;' % x + else: + return u'&%s;' % x + + def __init__(self, parser, name, attrs=None, parent=None, + previous=None): + "Basic constructor." + + # We don't actually store the parser object: that lets extracted + # chunks be garbage-collected + self.parserClass = parser.__class__ + self.isSelfClosing = parser.isSelfClosingTag(name) + self.name = name + if attrs is None: + attrs = [] + elif isinstance(attrs, dict): + attrs = attrs.items() + self.attrs = attrs + self.contents = [] + self.setup(parent, previous) + self.hidden = False + self.containsSubstitutions = False + self.convertHTMLEntities = parser.convertHTMLEntities + self.convertXMLEntities = parser.convertXMLEntities + self.escapeUnrecognizedEntities = parser.escapeUnrecognizedEntities + + # Convert any HTML, XML, or numeric entities in the attribute values. + convert = lambda(k, val): (k, + re.sub("&(#\d+|#x[0-9a-fA-F]+|\w+);", + self._convertEntities, + val)) + self.attrs = map(convert, self.attrs) + + def getString(self): + if (len(self.contents) == 1 + and isinstance(self.contents[0], NavigableString)): + return self.contents[0] + + def setString(self, string): + """Replace the contents of the tag with a string""" + self.clear() + self.append(string) + + string = property(getString, setString) + + def getText(self, separator=u""): + if not len(self.contents): + return u"" + stopNode = self._lastRecursiveChild().next + strings = [] + current = self.contents[0] + while current is not stopNode: + if isinstance(current, NavigableString): + strings.append(current.strip()) + current = current.next + return separator.join(strings) + + text = property(getText) + + def get(self, key, default=None): + """Returns the value of the 'key' attribute for the tag, or + the value given for 'default' if it doesn't have that + attribute.""" + return self._getAttrMap().get(key, default) + + def clear(self): + """Extract all children.""" + for child in self.contents[:]: + child.extract() + + def index(self, element): + for i, child in enumerate(self.contents): + if child is element: + return i + raise ValueError("Tag.index: element not in tag") + + def has_key(self, key): + return self._getAttrMap().has_key(key) + + def __getitem__(self, key): + """tag[key] returns the value of the 'key' attribute for the tag, + and throws an exception if it's not there.""" + return self._getAttrMap()[key] + + def __iter__(self): + "Iterating over a tag iterates over its contents." + return iter(self.contents) + + def __len__(self): + "The length of a tag is the length of its list of contents." + return len(self.contents) + + def __contains__(self, x): + return x in self.contents + + def __nonzero__(self): + "A tag is non-None even if it has no contents." + return True + + def __setitem__(self, key, value): + """Setting tag[key] sets the value of the 'key' attribute for the + tag.""" + self._getAttrMap() + self.attrMap[key] = value + found = False + for i in range(0, len(self.attrs)): + if self.attrs[i][0] == key: + self.attrs[i] = (key, value) + found = True + if not found: + self.attrs.append((key, value)) + self._getAttrMap()[key] = value + + def __delitem__(self, key): + "Deleting tag[key] deletes all 'key' attributes for the tag." + for item in self.attrs: + if item[0] == key: + self.attrs.remove(item) + #We don't break because bad HTML can define the same + #attribute multiple times. + self._getAttrMap() + if self.attrMap.has_key(key): + del self.attrMap[key] + + def __call__(self, *args, **kwargs): + """Calling a tag like a function is the same as calling its + findAll() method. Eg. tag('a') returns a list of all the A tags + found within this tag.""" + return apply(self.findAll, args, kwargs) + + def __getattr__(self, tag): + #print "Getattr %s.%s" % (self.__class__, tag) + if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3: + return self.find(tag[:-3]) + elif tag.find('__') != 0: + return self.find(tag) + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__, tag) + + def __eq__(self, other): + """Returns true iff this tag has the same name, the same attributes, + and the same contents (recursively) as the given tag. + + NOTE: right now this will return false if two tags have the + same attributes in a different order. Should this be fixed?""" + if other is self: + return True + if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other): + return False + for i in range(0, len(self.contents)): + if self.contents[i] != other.contents[i]: + return False + return True + + def __ne__(self, other): + """Returns true iff this tag is not identical to the other tag, + as defined in __eq__.""" + return not self == other + + def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING): + """Renders this tag as a string.""" + return self.__str__(encoding) + + def __unicode__(self): + return self.__str__(None) + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Returns a string or Unicode representation of this tag and + its contents. To get Unicode, pass None for encoding. + + NOTE: since Python's HTML parser consumes whitespace, this + method is not certain to reproduce the whitespace present in + the original string.""" + + encodedName = self.toEncoding(self.name, encoding) + + attrs = [] + if self.attrs: + for key, val in self.attrs: + fmt = '%s="%s"' + if isinstance(val, basestring): + if self.containsSubstitutions and '%SOUP-ENCODING%' in val: + val = self.substituteEncoding(val, encoding) + + # The attribute value either: + # + # * Contains no embedded double quotes or single quotes. + # No problem: we enclose it in double quotes. + # * Contains embedded single quotes. No problem: + # double quotes work here too. + # * Contains embedded double quotes. No problem: + # we enclose it in single quotes. + # * Embeds both single _and_ double quotes. This + # can't happen naturally, but it can happen if + # you modify an attribute value after parsing + # the document. Now we have a bit of a + # problem. We solve it by enclosing the + # attribute in single quotes, and escaping any + # embedded single quotes to XML entities. + if '"' in val: + fmt = "%s='%s'" + if "'" in val: + # TODO: replace with apos when + # appropriate. + val = val.replace("'", "&squot;") + + # Now we're okay w/r/t quotes. But the attribute + # value might also contain angle brackets, or + # ampersands that aren't part of entities. We need + # to escape those to XML entities too. + val = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, val) + + attrs.append(fmt % (self.toEncoding(key, encoding), + self.toEncoding(val, encoding))) + close = '' + closeTag = '' + if self.isSelfClosing: + close = ' /' + else: + closeTag = '' % encodedName + + indentTag, indentContents = 0, 0 + if prettyPrint: + indentTag = indentLevel + space = (' ' * (indentTag-1)) + indentContents = indentTag + 1 + contents = self.renderContents(encoding, prettyPrint, indentContents) + if self.hidden: + s = contents + else: + s = [] + attributeString = '' + if attrs: + attributeString = ' ' + ' '.join(attrs) + if prettyPrint: + s.append(space) + s.append('<%s%s%s>' % (encodedName, attributeString, close)) + if prettyPrint: + s.append("\n") + s.append(contents) + if prettyPrint and contents and contents[-1] != "\n": + s.append("\n") + if prettyPrint and closeTag: + s.append(space) + s.append(closeTag) + if prettyPrint and closeTag and self.nextSibling: + s.append("\n") + s = ''.join(s) + return s + + def decompose(self): + """Recursively destroys the contents of this tree.""" + self.extract() + if len(self.contents) == 0: + return + current = self.contents[0] + while current is not None: + next = current.next + if isinstance(current, Tag): + del current.contents[:] + current.parent = None + current.previous = None + current.previousSibling = None + current.next = None + current.nextSibling = None + current = next + + def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING): + return self.__str__(encoding, True) + + def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Renders the contents of this tag as a string in the given + encoding. If encoding is None, returns a Unicode string..""" + s=[] + for c in self: + text = None + if isinstance(c, NavigableString): + text = c.__str__(encoding) + elif isinstance(c, Tag): + s.append(c.__str__(encoding, prettyPrint, indentLevel)) + if text and prettyPrint: + text = text.strip() + if text: + if prettyPrint: + s.append(" " * (indentLevel-1)) + s.append(text) + if prettyPrint: + s.append("\n") + return ''.join(s) + + #Soup methods + + def find(self, name=None, attrs={}, recursive=True, text=None, + **kwargs): + """Return only the first child of this Tag matching the given + criteria.""" + r = None + l = self.findAll(name, attrs, recursive, text, 1, **kwargs) + if l: + r = l[0] + return r + findChild = find + + def findAll(self, name=None, attrs={}, recursive=True, text=None, + limit=None, **kwargs): + """Extracts a list of Tag objects that match the given + criteria. You can specify the name of the Tag and any + attributes you want the Tag to have. + + The value of a key-value pair in the 'attrs' map can be a + string, a list of strings, a regular expression object, or a + callable that takes a string and returns whether or not the + string matches for some custom definition of 'matches'. The + same is true of the tag name.""" + generator = self.recursiveChildGenerator + if not recursive: + generator = self.childGenerator + return self._findAll(name, attrs, text, limit, generator, **kwargs) + findChildren = findAll + + # Pre-3.x compatibility methods + first = find + fetch = findAll + + def fetchText(self, text=None, recursive=True, limit=None): + return self.findAll(text=text, recursive=recursive, limit=limit) + + def firstText(self, text=None, recursive=True): + return self.find(text=text, recursive=recursive) + + #Private methods + + def _getAttrMap(self): + """Initializes a map representation of this tag's attributes, + if not already initialized.""" + if not getattr(self, 'attrMap'): + self.attrMap = {} + for (key, value) in self.attrs: + self.attrMap[key] = value + return self.attrMap + + #Generator methods + def childGenerator(self): + # Just use the iterator from the contents + return iter(self.contents) + + def recursiveChildGenerator(self): + if not len(self.contents): + raise StopIteration + stopNode = self._lastRecursiveChild().next + current = self.contents[0] + while current is not stopNode: + yield current + current = current.next + + +# Next, a couple classes to represent queries and their results. +class SoupStrainer: + """Encapsulates a number of ways of matching a markup element (tag or + text).""" + + def __init__(self, name=None, attrs={}, text=None, **kwargs): + self.name = name + if isinstance(attrs, basestring): + kwargs['class'] = _match_css_class(attrs) + attrs = None + if kwargs: + if attrs: + attrs = attrs.copy() + attrs.update(kwargs) + else: + attrs = kwargs + self.attrs = attrs + self.text = text + + def __str__(self): + if self.text: + return self.text + else: + return "%s|%s" % (self.name, self.attrs) + + def searchTag(self, markupName=None, markupAttrs={}): + found = None + markup = None + if isinstance(markupName, Tag): + markup = markupName + markupAttrs = markup + callFunctionWithTagData = callable(self.name) \ + and not isinstance(markupName, Tag) + + if (not self.name) \ + or callFunctionWithTagData \ + or (markup and self._matches(markup, self.name)) \ + or (not markup and self._matches(markupName, self.name)): + if callFunctionWithTagData: + match = self.name(markupName, markupAttrs) + else: + match = True + markupAttrMap = None + for attr, matchAgainst in self.attrs.items(): + if not markupAttrMap: + if hasattr(markupAttrs, 'get'): + markupAttrMap = markupAttrs + else: + markupAttrMap = {} + for k,v in markupAttrs: + markupAttrMap[k] = v + attrValue = markupAttrMap.get(attr) + if not self._matches(attrValue, matchAgainst): + match = False + break + if match: + if markup: + found = markup + else: + found = markupName + return found + + def search(self, markup): + #print 'looking for %s in %s' % (self, markup) + found = None + # If given a list of items, scan it for a text element that + # matches. + if hasattr(markup, "__iter__") \ + and not isinstance(markup, Tag): + for element in markup: + if isinstance(element, NavigableString) \ + and self.search(element): + found = element + break + # If it's a Tag, make sure its name or attributes match. + # Don't bother with Tags if we're searching for text. + elif isinstance(markup, Tag): + if not self.text: + found = self.searchTag(markup) + # If it's text, make sure the text matches. + elif isinstance(markup, NavigableString) or \ + isinstance(markup, basestring): + if self._matches(markup, self.text): + found = markup + else: + raise Exception, "I don't know how to match against a %s" \ + % markup.__class__ + return found + + def _matches(self, markup, matchAgainst): + #print "Matching %s against %s" % (markup, matchAgainst) + result = False + if matchAgainst is True: + result = markup is not None + elif callable(matchAgainst): + result = matchAgainst(markup) + else: + #Custom match methods take the tag as an argument, but all + #other ways of matching match the tag name as a string. + if isinstance(markup, Tag): + markup = markup.name + if markup and not isinstance(markup, basestring): + markup = unicode(markup) + #Now we know that chunk is either a string, or None. + if hasattr(matchAgainst, 'match'): + # It's a regexp object. + result = markup and matchAgainst.search(markup) + elif hasattr(matchAgainst, '__iter__'): # list-like + result = markup in matchAgainst + elif hasattr(matchAgainst, 'items'): + result = markup.has_key(matchAgainst) + elif matchAgainst and isinstance(markup, basestring): + if isinstance(markup, unicode): + matchAgainst = unicode(matchAgainst) + else: + matchAgainst = str(matchAgainst) + + if not result: + result = matchAgainst == markup + return result + +class ResultSet(list): + """A ResultSet is just a list that keeps track of the SoupStrainer + that created it.""" + def __init__(self, source): + list.__init__([]) + self.source = source + +# Now, some helper functions. + +def buildTagMap(default, *args): + """Turns a list of maps, lists, or scalars into a single map. + Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and + NESTING_RESET_TAGS maps out of lists and partial maps.""" + built = {} + for portion in args: + if hasattr(portion, 'items'): + #It's a map. Merge it. + for k,v in portion.items(): + built[k] = v + elif hasattr(portion, '__iter__'): # is a list + #It's a list. Map each item to the default. + for k in portion: + built[k] = default + else: + #It's a scalar. Map it to the default. + built[portion] = default + return built + +# Now, the parser classes. + +class BeautifulStoneSoup(Tag, SGMLParser): + + """This class contains the basic parser and search code. It defines + a parser that knows nothing about tag behavior except for the + following: + + You can't close a tag without closing all the tags it encloses. + That is, "" actually means + "". + + [Another possible explanation is "", but since + this class defines no SELF_CLOSING_TAGS, it will never use that + explanation.] + + This class is useful for parsing XML or made-up markup languages, + or when BeautifulSoup makes an assumption counter to what you were + expecting.""" + + SELF_CLOSING_TAGS = {} + NESTABLE_TAGS = {} + RESET_NESTING_TAGS = {} + QUOTE_TAGS = {} + PRESERVE_WHITESPACE_TAGS = [] + + MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'), + lambda x: x.group(1) + ' />'), + (re.compile(']*)>'), + lambda x: '') + ] + + ROOT_TAG_NAME = u'[document]' + + HTML_ENTITIES = "html" + XML_ENTITIES = "xml" + XHTML_ENTITIES = "xhtml" + # TODO: This only exists for backwards-compatibility + ALL_ENTITIES = XHTML_ENTITIES + + # Used when determining whether a text node is all whitespace and + # can be replaced with a single space. A text node that contains + # fancy Unicode spaces (usually non-breaking) should be left + # alone. + STRIP_ASCII_SPACES = { 9: None, 10: None, 12: None, 13: None, 32: None, } + + def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None, + markupMassage=True, smartQuotesTo=XML_ENTITIES, + convertEntities=None, selfClosingTags=None, isHTML=False): + """The Soup object is initialized as the 'root tag', and the + provided markup (which can be a string or a file-like object) + is fed into the underlying parser. + + sgmllib will process most bad HTML, and the BeautifulSoup + class has some tricks for dealing with some HTML that kills + sgmllib, but Beautiful Soup can nonetheless choke or lose data + if your data uses self-closing tags or declarations + incorrectly. + + By default, Beautiful Soup uses regexes to sanitize input, + avoiding the vast majority of these problems. If the problems + don't apply to you, pass in False for markupMassage, and + you'll get better performance. + + The default parser massage techniques fix the two most common + instances of invalid HTML that choke sgmllib: + +
        (No space between name of closing tag and tag close) + (Extraneous whitespace in declaration) + + You can pass in a custom list of (RE object, replace method) + tuples to get Beautiful Soup to scrub your input the way you + want.""" + + self.parseOnlyThese = parseOnlyThese + self.fromEncoding = fromEncoding + self.smartQuotesTo = smartQuotesTo + self.convertEntities = convertEntities + # Set the rules for how we'll deal with the entities we + # encounter + if self.convertEntities: + # It doesn't make sense to convert encoded characters to + # entities even while you're converting entities to Unicode. + # Just convert it all to Unicode. + self.smartQuotesTo = None + if convertEntities == self.HTML_ENTITIES: + self.convertXMLEntities = False + self.convertHTMLEntities = True + self.escapeUnrecognizedEntities = True + elif convertEntities == self.XHTML_ENTITIES: + self.convertXMLEntities = True + self.convertHTMLEntities = True + self.escapeUnrecognizedEntities = False + elif convertEntities == self.XML_ENTITIES: + self.convertXMLEntities = True + self.convertHTMLEntities = False + self.escapeUnrecognizedEntities = False + else: + self.convertXMLEntities = False + self.convertHTMLEntities = False + self.escapeUnrecognizedEntities = False + + self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags) + SGMLParser.__init__(self) + + if hasattr(markup, 'read'): # It's a file-type object. + markup = markup.read() + self.markup = markup + self.markupMassage = markupMassage + try: + self._feed(isHTML=isHTML) + except StopParsing: + pass + self.markup = None # The markup can now be GCed + + def convert_charref(self, name): + """This method fixes a bug in Python's SGMLParser.""" + try: + n = int(name) + except ValueError: + return + if not 0 <= n <= 127 : # ASCII ends at 127, not 255 + return + return self.convert_codepoint(n) + + def _feed(self, inDocumentEncoding=None, isHTML=False): + # Convert the document to Unicode. + markup = self.markup + if isinstance(markup, unicode): + if not hasattr(self, 'originalEncoding'): + self.originalEncoding = None + else: + dammit = UnicodeDammit\ + (markup, [self.fromEncoding, inDocumentEncoding], + smartQuotesTo=self.smartQuotesTo, isHTML=isHTML) + markup = dammit.unicode + self.originalEncoding = dammit.originalEncoding + self.declaredHTMLEncoding = dammit.declaredHTMLEncoding + if markup: + if self.markupMassage: + if not hasattr(self.markupMassage, "__iter__"): + self.markupMassage = self.MARKUP_MASSAGE + for fix, m in self.markupMassage: + markup = fix.sub(m, markup) + # TODO: We get rid of markupMassage so that the + # soup object can be deepcopied later on. Some + # Python installations can't copy regexes. If anyone + # was relying on the existence of markupMassage, this + # might cause problems. + del(self.markupMassage) + self.reset() + + SGMLParser.feed(self, markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while self.currentTag.name != self.ROOT_TAG_NAME: + self.popTag() + + def __getattr__(self, methodName): + """This method routes method call requests to either the SGMLParser + superclass or the Tag superclass, depending on the method name.""" + #print "__getattr__ called on %s.%s" % (self.__class__, methodName) + + if methodName.startswith('start_') or methodName.startswith('end_') \ + or methodName.startswith('do_'): + return SGMLParser.__getattr__(self, methodName) + elif not methodName.startswith('__'): + return Tag.__getattr__(self, methodName) + else: + raise AttributeError + + def isSelfClosingTag(self, name): + """Returns true iff the given string is the name of a + self-closing tag according to this parser.""" + return self.SELF_CLOSING_TAGS.has_key(name) \ + or self.instanceSelfClosingTags.has_key(name) + + def reset(self): + Tag.__init__(self, self, self.ROOT_TAG_NAME) + self.hidden = 1 + SGMLParser.reset(self) + self.currentData = [] + self.currentTag = None + self.tagStack = [] + self.quoteStack = [] + self.pushTag(self) + + def popTag(self): + tag = self.tagStack.pop() + + #print "Pop", tag.name + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag): + #print "Push", tag.name + if self.currentTag: + self.currentTag.contents.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + + def endData(self, containerClass=NavigableString): + if self.currentData: + currentData = u''.join(self.currentData) + if (currentData.translate(self.STRIP_ASCII_SPACES) == '' and + not set([tag.name for tag in self.tagStack]).intersection( + self.PRESERVE_WHITESPACE_TAGS)): + if '\n' in currentData: + currentData = '\n' + else: + currentData = ' ' + self.currentData = [] + if self.parseOnlyThese and len(self.tagStack) <= 1 and \ + (not self.parseOnlyThese.text or \ + not self.parseOnlyThese.search(currentData)): + return + o = containerClass(currentData) + o.setup(self.currentTag, self.previous) + if self.previous: + self.previous.next = o + self.previous = o + self.currentTag.contents.append(o) + + + def _popToTag(self, name, inclusivePop=True): + """Pops the tag stack up to and including the most recent + instance of the given tag. If inclusivePop is false, pops the tag + stack up to but *not* including the most recent instqance of + the given tag.""" + #print "Popping to %s" % name + if name == self.ROOT_TAG_NAME: + return + + numPops = 0 + mostRecentTag = None + for i in range(len(self.tagStack)-1, 0, -1): + if name == self.tagStack[i].name: + numPops = len(self.tagStack)-i + break + if not inclusivePop: + numPops = numPops - 1 + + for i in range(0, numPops): + mostRecentTag = self.popTag() + return mostRecentTag + + def _smartPop(self, name): + + """We need to pop up to the previous tag of this type, unless + one of this tag's nesting reset triggers comes between this + tag and the previous tag of this type, OR unless this tag is a + generic nesting trigger and another generic nesting trigger + comes between this tag and the previous tag of this type. + + Examples: +

        FooBar *

        * should pop to 'p', not 'b'. +

        FooBar *

        * should pop to 'table', not 'p'. +

        Foo

        Bar *

        * should pop to 'tr', not 'p'. + +

        • *
        • * should pop to 'ul', not the first 'li'. +
      • ** should pop to 'table', not the first 'tr' + tag should + implicitly close the previous tag within the same
        ** should pop to 'tr', not the first 'td' + """ + + nestingResetTriggers = self.NESTABLE_TAGS.get(name) + isNestable = nestingResetTriggers != None + isResetNesting = self.RESET_NESTING_TAGS.has_key(name) + popTo = None + inclusive = True + for i in range(len(self.tagStack)-1, 0, -1): + p = self.tagStack[i] + if (not p or p.name == name) and not isNestable: + #Non-nestable tags get popped to the top or to their + #last occurance. + popTo = name + break + if (nestingResetTriggers is not None + and p.name in nestingResetTriggers) \ + or (nestingResetTriggers is None and isResetNesting + and self.RESET_NESTING_TAGS.has_key(p.name)): + + #If we encounter one of the nesting reset triggers + #peculiar to this tag, or we encounter another tag + #that causes nesting to reset, pop up to but not + #including that tag. + popTo = p.name + inclusive = False + break + p = p.parent + if popTo: + self._popToTag(popTo, inclusive) + + def unknown_starttag(self, name, attrs, selfClosing=0): + #print "Start tag %s: %s" % (name, attrs) + if self.quoteStack: + #This is not a real tag. + #print "<%s> is not real!" % name + attrs = ''.join([' %s="%s"' % (x, y) for x, y in attrs]) + self.handle_data('<%s%s>' % (name, attrs)) + return + self.endData() + + if not self.isSelfClosingTag(name) and not selfClosing: + self._smartPop(name) + + if self.parseOnlyThese and len(self.tagStack) <= 1 \ + and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)): + return + + tag = Tag(self, name, attrs, self.currentTag, self.previous) + if self.previous: + self.previous.next = tag + self.previous = tag + self.pushTag(tag) + if selfClosing or self.isSelfClosingTag(name): + self.popTag() + if name in self.QUOTE_TAGS: + #print "Beginning quote (%s)" % name + self.quoteStack.append(name) + self.literal = 1 + return tag + + def unknown_endtag(self, name): + #print "End tag %s" % name + if self.quoteStack and self.quoteStack[-1] != name: + #This is not a real end tag. + #print " is not real!" % name + self.handle_data('' % name) + return + self.endData() + self._popToTag(name) + if self.quoteStack and self.quoteStack[-1] == name: + self.quoteStack.pop() + self.literal = (len(self.quoteStack) > 0) + + def handle_data(self, data): + self.currentData.append(data) + + def _toStringSubclass(self, text, subclass): + """Adds a certain piece of text to the tree as a NavigableString + subclass.""" + self.endData() + self.handle_data(text) + self.endData(subclass) + + def handle_pi(self, text): + """Handle a processing instruction as a ProcessingInstruction + object, possibly one with a %SOUP-ENCODING% slot into which an + encoding will be plugged later.""" + if text[:3] == "xml": + text = u"xml version='1.0' encoding='%SOUP-ENCODING%'" + self._toStringSubclass(text, ProcessingInstruction) + + def handle_comment(self, text): + "Handle comments as Comment objects." + self._toStringSubclass(text, Comment) + + def handle_charref(self, ref): + "Handle character references as data." + if self.convertEntities: + data = unichr(int(ref)) + else: + data = '&#%s;' % ref + self.handle_data(data) + + def handle_entityref(self, ref): + """Handle entity references as data, possibly converting known + HTML and/or XML entity references to the corresponding Unicode + characters.""" + data = None + if self.convertHTMLEntities: + try: + data = unichr(name2codepoint[ref]) + except KeyError: + pass + + if not data and self.convertXMLEntities: + data = self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref) + + if not data and self.convertHTMLEntities and \ + not self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref): + # TODO: We've got a problem here. We're told this is + # an entity reference, but it's not an XML entity + # reference or an HTML entity reference. Nonetheless, + # the logical thing to do is to pass it through as an + # unrecognized entity reference. + # + # Except: when the input is "&carol;" this function + # will be called with input "carol". When the input is + # "AT&T", this function will be called with input + # "T". We have no way of knowing whether a semicolon + # was present originally, so we don't know whether + # this is an unknown entity or just a misplaced + # ampersand. + # + # The more common case is a misplaced ampersand, so I + # escape the ampersand and omit the trailing semicolon. + data = "&%s" % ref + if not data: + # This case is different from the one above, because we + # haven't already gone through a supposedly comprehensive + # mapping of entities to Unicode characters. We might not + # have gone through any mapping at all. So the chances are + # very high that this is a real entity, and not a + # misplaced ampersand. + data = "&%s;" % ref + self.handle_data(data) + + def handle_decl(self, data): + "Handle DOCTYPEs and the like as Declaration objects." + self._toStringSubclass(data, Declaration) + + def parse_declaration(self, i): + """Treat a bogus SGML declaration as raw data. Treat a CDATA + declaration as a CData object.""" + j = None + if self.rawdata[i:i+9] == '', i) + if k == -1: + k = len(self.rawdata) + data = self.rawdata[i+9:k] + j = k+3 + self._toStringSubclass(data, CData) + else: + try: + j = SGMLParser.parse_declaration(self, i) + except SGMLParseError: + toHandle = self.rawdata[i:] + self.handle_data(toHandle) + j = i + len(toHandle) + return j + +class BeautifulSoup(BeautifulStoneSoup): + + """This parser knows the following facts about HTML: + + * Some tags have no closing tag and should be interpreted as being + closed as soon as they are encountered. + + * The text inside some tags (ie. 'script') may contain tags which + are not really part of the document and which should be parsed + as text, not tags. If you want to parse the text as tags, you can + always fetch it and parse it explicitly. + + * Tag nesting rules: + + Most tags can't be nested at all. For instance, the occurance of + a

        tag should implicitly close the previous

        tag. + +

        Para1

        Para2 + should be transformed into: +

        Para1

        Para2 + + Some tags can be nested arbitrarily. For instance, the occurance + of a

        tag should _not_ implicitly close the previous +
        tag. + + Alice said:
        Bob said:
        Blah + should NOT be transformed into: + Alice said:
        Bob said:
        Blah + + Some tags can be nested, but the nesting is reset by the + interposition of other tags. For instance, a
        , + but not close a tag in another table. + +
        BlahBlah + should be transformed into: +
        BlahBlah + but, + Blah
        Blah + should NOT be transformed into + Blah
        Blah + + Differing assumptions about tag nesting rules are a major source + of problems with the BeautifulSoup class. If BeautifulSoup is not + treating as nestable a tag your page author treats as nestable, + try ICantBelieveItsBeautifulSoup, MinimalSoup, or + BeautifulStoneSoup before writing your own subclass.""" + + def __init__(self, *args, **kwargs): + if not kwargs.has_key('smartQuotesTo'): + kwargs['smartQuotesTo'] = self.HTML_ENTITIES + kwargs['isHTML'] = True + BeautifulStoneSoup.__init__(self, *args, **kwargs) + + SELF_CLOSING_TAGS = buildTagMap(None, + ('br' , 'hr', 'input', 'img', 'meta', + 'spacer', 'link', 'frame', 'base', 'col')) + + PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea']) + + QUOTE_TAGS = {'script' : None, 'textarea' : None} + + #According to the HTML standard, each of these inline tags can + #contain another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_INLINE_TAGS = ('span', 'font', 'q', 'object', 'bdo', 'sub', 'sup', + 'center') + + #According to the HTML standard, these block tags can contain + #another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_BLOCK_TAGS = ('blockquote', 'div', 'fieldset', 'ins', 'del') + + #Lists can contain other lists, but there are restrictions. + NESTABLE_LIST_TAGS = { 'ol' : [], + 'ul' : [], + 'li' : ['ul', 'ol'], + 'dl' : [], + 'dd' : ['dl'], + 'dt' : ['dl'] } + + #Tables can contain other tables, but there are restrictions. + NESTABLE_TABLE_TAGS = {'table' : [], + 'tr' : ['table', 'tbody', 'tfoot', 'thead'], + 'td' : ['tr'], + 'th' : ['tr'], + 'thead' : ['table'], + 'tbody' : ['table'], + 'tfoot' : ['table'], + } + + NON_NESTABLE_BLOCK_TAGS = ('address', 'form', 'p', 'pre') + + #If one of these tags is encountered, all tags up to the next tag of + #this type are popped. + RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript', + NON_NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, + NESTABLE_TABLE_TAGS) + + NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS) + + # Used to detect the charset in a META tag; see start_meta + CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)", re.M) + + def start_meta(self, attrs): + """Beautiful Soup can detect a charset included in a META tag, + try to convert the document to that charset, and re-parse the + document from the beginning.""" + httpEquiv = None + contentType = None + contentTypeIndex = None + tagNeedsEncodingSubstitution = False + + for i in range(0, len(attrs)): + key, value = attrs[i] + key = key.lower() + if key == 'http-equiv': + httpEquiv = value + elif key == 'content': + contentType = value + contentTypeIndex = i + + if httpEquiv and contentType: # It's an interesting meta tag. + match = self.CHARSET_RE.search(contentType) + if match: + if (self.declaredHTMLEncoding is not None or + self.originalEncoding == self.fromEncoding): + # An HTML encoding was sniffed while converting + # the document to Unicode, or an HTML encoding was + # sniffed during a previous pass through the + # document, or an encoding was specified + # explicitly and it worked. Rewrite the meta tag. + def rewrite(match): + return match.group(1) + "%SOUP-ENCODING%" + newAttr = self.CHARSET_RE.sub(rewrite, contentType) + attrs[contentTypeIndex] = (attrs[contentTypeIndex][0], + newAttr) + tagNeedsEncodingSubstitution = True + else: + # This is our first pass through the document. + # Go through it again with the encoding information. + newCharset = match.group(3) + if newCharset and newCharset != self.originalEncoding: + self.declaredHTMLEncoding = newCharset + self._feed(self.declaredHTMLEncoding) + raise StopParsing + pass + tag = self.unknown_starttag("meta", attrs) + if tag and tagNeedsEncodingSubstitution: + tag.containsSubstitutions = True + +class StopParsing(Exception): + pass + +class ICantBelieveItsBeautifulSoup(BeautifulSoup): + + """The BeautifulSoup class is oriented towards skipping over + common HTML errors like unclosed tags. However, sometimes it makes + errors of its own. For instance, consider this fragment: + + FooBar + + This is perfectly valid (if bizarre) HTML. However, the + BeautifulSoup class will implicitly close the first b tag when it + encounters the second 'b'. It will think the author wrote + "FooBar", and didn't close the first 'b' tag, because + there's no real-world reason to bold something that's already + bold. When it encounters '' it will close two more 'b' + tags, for a grand total of three tags closed instead of two. This + can throw off the rest of your document structure. The same is + true of a number of other tags, listed below. + + It's much more common for someone to forget to close a 'b' tag + than to actually use nested 'b' tags, and the BeautifulSoup class + handles the common case. This class handles the not-co-common + case: where you can't believe someone wrote what they did, but + it's valid HTML and BeautifulSoup screwed up by assuming it + wouldn't be.""" + + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \ + ('em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong', + 'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b', + 'big') + + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ('noscript',) + + NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS) + +class MinimalSoup(BeautifulSoup): + """The MinimalSoup class is for parsing HTML that contains + pathologically bad markup. It makes no assumptions about tag + nesting, but it does know which tags are self-closing, that + ' + safe = Markup('username') + assert unsafe + safe == text_type(escape(unsafe)) + text_type(safe) + + # string interpolations are safe to use too + assert Markup('%s') % '' == \ + '<bad user>' + assert Markup('%(username)s') % { + 'username': '' + } == '<bad user>' + + # an escaped object is markup too + assert type(Markup('foo') + 'bar') is Markup + + # and it implements __html__ by returning itself + x = Markup("foo") + assert x.__html__() is x + + # it also knows how to treat __html__ objects + class Foo(object): + def __html__(self): + return 'awesome' + def __unicode__(self): + return 'awesome' + assert Markup(Foo()) == 'awesome' + assert Markup('%s') % Foo() == \ + 'awesome' + + # escaping and unescaping + assert escape('"<>&\'') == '"<>&'' + assert Markup("Foo & Bar").striptags() == "Foo & Bar" + assert Markup("<test>").unescape() == "" + + def test_template_data(self): + env = Environment(autoescape=True) + t = env.from_string('{% macro say_hello(name) %}' + '

        Hello {{ name }}!

        {% endmacro %}' + '{{ say_hello("foo") }}') + escaped_out = '

        Hello <blink>foo</blink>!

        ' + assert t.render() == escaped_out + assert text_type(t.module) == escaped_out + assert escape(t.module) == escaped_out + assert t.module.say_hello('foo') == escaped_out + assert escape(t.module.say_hello('foo')) == escaped_out + + def test_attr_filter(self): + env = SandboxedEnvironment() + tmpl = env.from_string('{{ cls|attr("__subclasses__")() }}') + self.assert_raises(SecurityError, tmpl.render, cls=int) + + def test_binary_operator_intercepting(self): + def disable_op(left, right): + raise TemplateRuntimeError('that operator so does not work') + for expr, ctx, rv in ('1 + 2', {}, '3'), ('a + 2', {'a': 2}, '4'): + env = SandboxedEnvironment() + env.binop_table['+'] = disable_op + t = env.from_string('{{ %s }}' % expr) + assert t.render(ctx) == rv + env.intercepted_binops = frozenset(['+']) + t = env.from_string('{{ %s }}' % expr) + try: + t.render(ctx) + except TemplateRuntimeError as e: + pass + else: + self.fail('expected runtime error') + + def test_unary_operator_intercepting(self): + def disable_op(arg): + raise TemplateRuntimeError('that operator so does not work') + for expr, ctx, rv in ('-1', {}, '-1'), ('-a', {'a': 2}, '-2'): + env = SandboxedEnvironment() + env.unop_table['-'] = disable_op + t = env.from_string('{{ %s }}' % expr) + assert t.render(ctx) == rv + env.intercepted_unops = frozenset(['-']) + t = env.from_string('{{ %s }}' % expr) + try: + t.render(ctx) + except TemplateRuntimeError as e: + pass + else: + self.fail('expected runtime error') + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(SandboxTestCase)) + return suite diff --git a/pyload/lib/jinja2/testsuite/tests.py b/pyload/lib/jinja2/testsuite/tests.py new file mode 100644 index 000000000..3ece7a8ff --- /dev/null +++ b/pyload/lib/jinja2/testsuite/tests.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +""" + jinja2.testsuite.tests + ~~~~~~~~~~~~~~~~~~~~~~ + + Who tests the tests? + + :copyright: (c) 2010 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" +import unittest +from jinja2.testsuite import JinjaTestCase + +from jinja2 import Markup, Environment + +env = Environment() + + +class TestsTestCase(JinjaTestCase): + + def test_defined(self): + tmpl = env.from_string('{{ missing is defined }}|{{ true is defined }}') + assert tmpl.render() == 'False|True' + + def test_even(self): + tmpl = env.from_string('''{{ 1 is even }}|{{ 2 is even }}''') + assert tmpl.render() == 'False|True' + + def test_odd(self): + tmpl = env.from_string('''{{ 1 is odd }}|{{ 2 is odd }}''') + assert tmpl.render() == 'True|False' + + def test_lower(self): + tmpl = env.from_string('''{{ "foo" is lower }}|{{ "FOO" is lower }}''') + assert tmpl.render() == 'True|False' + + def test_typechecks(self): + tmpl = env.from_string(''' + {{ 42 is undefined }} + {{ 42 is defined }} + {{ 42 is none }} + {{ none is none }} + {{ 42 is number }} + {{ 42 is string }} + {{ "foo" is string }} + {{ "foo" is sequence }} + {{ [1] is sequence }} + {{ range is callable }} + {{ 42 is callable }} + {{ range(5) is iterable }} + {{ {} is mapping }} + {{ mydict is mapping }} + {{ [] is mapping }} + ''') + class MyDict(dict): + pass + assert tmpl.render(mydict=MyDict()).split() == [ + 'False', 'True', 'False', 'True', 'True', 'False', + 'True', 'True', 'True', 'True', 'False', 'True', + 'True', 'True', 'False' + ] + + def test_sequence(self): + tmpl = env.from_string( + '{{ [1, 2, 3] is sequence }}|' + '{{ "foo" is sequence }}|' + '{{ 42 is sequence }}' + ) + assert tmpl.render() == 'True|True|False' + + def test_upper(self): + tmpl = env.from_string('{{ "FOO" is upper }}|{{ "foo" is upper }}') + assert tmpl.render() == 'True|False' + + def test_sameas(self): + tmpl = env.from_string('{{ foo is sameas false }}|' + '{{ 0 is sameas false }}') + assert tmpl.render(foo=False) == 'True|False' + + def test_no_paren_for_arg1(self): + tmpl = env.from_string('{{ foo is sameas none }}') + assert tmpl.render(foo=None) == 'True' + + def test_escaped(self): + env = Environment(autoescape=True) + tmpl = env.from_string('{{ x is escaped }}|{{ y is escaped }}') + assert tmpl.render(x='foo', y=Markup('foo')) == 'False|True' + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestsTestCase)) + return suite diff --git a/pyload/lib/jinja2/testsuite/utils.py b/pyload/lib/jinja2/testsuite/utils.py new file mode 100644 index 000000000..cab9b09a9 --- /dev/null +++ b/pyload/lib/jinja2/testsuite/utils.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +""" + jinja2.testsuite.utils + ~~~~~~~~~~~~~~~~~~~~~~ + + Tests utilities jinja uses. + + :copyright: (c) 2010 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" +import gc +import unittest + +import pickle + +from jinja2.testsuite import JinjaTestCase + +from jinja2.utils import LRUCache, escape, object_type_repr + + +class LRUCacheTestCase(JinjaTestCase): + + def test_simple(self): + d = LRUCache(3) + d["a"] = 1 + d["b"] = 2 + d["c"] = 3 + d["a"] + d["d"] = 4 + assert len(d) == 3 + assert 'a' in d and 'c' in d and 'd' in d and 'b' not in d + + def test_pickleable(self): + cache = LRUCache(2) + cache["foo"] = 42 + cache["bar"] = 23 + cache["foo"] + + for protocol in range(3): + copy = pickle.loads(pickle.dumps(cache, protocol)) + assert copy.capacity == cache.capacity + assert copy._mapping == cache._mapping + assert copy._queue == cache._queue + + +class HelpersTestCase(JinjaTestCase): + + def test_object_type_repr(self): + class X(object): + pass + self.assert_equal(object_type_repr(42), 'int object') + self.assert_equal(object_type_repr([]), 'list object') + self.assert_equal(object_type_repr(X()), + 'jinja2.testsuite.utils.X object') + self.assert_equal(object_type_repr(None), 'None') + self.assert_equal(object_type_repr(Ellipsis), 'Ellipsis') + + +class MarkupLeakTestCase(JinjaTestCase): + + def test_markup_leaks(self): + counts = set() + for count in range(20): + for item in range(1000): + escape("foo") + escape("") + escape(u"foo") + escape(u"") + counts.add(len(gc.get_objects())) + assert len(counts) == 1, 'ouch, c extension seems to leak objects' + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(LRUCacheTestCase)) + suite.addTest(unittest.makeSuite(HelpersTestCase)) + + # this test only tests the c extension + if not hasattr(escape, 'func_code'): + suite.addTest(unittest.makeSuite(MarkupLeakTestCase)) + + return suite diff --git a/pyload/lib/jinja2/utils.py b/pyload/lib/jinja2/utils.py new file mode 100644 index 000000000..ddc47da0a --- /dev/null +++ b/pyload/lib/jinja2/utils.py @@ -0,0 +1,520 @@ +# -*- coding: utf-8 -*- +""" + jinja2.utils + ~~~~~~~~~~~~ + + Utility functions. + + :copyright: (c) 2010 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" +import re +import errno +from collections import deque +from jinja2._compat import text_type, string_types, implements_iterator, \ + allocate_lock, url_quote + + +_word_split_re = re.compile(r'(\s+)') +_punctuation_re = re.compile( + '^(?P(?:%s)*)(?P.*?)(?P(?:%s)*)$' % ( + '|'.join(map(re.escape, ('(', '<', '<'))), + '|'.join(map(re.escape, ('.', ',', ')', '>', '\n', '>'))) + ) +) +_simple_email_re = re.compile(r'^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$') +_striptags_re = re.compile(r'(|<[^>]*>)') +_entity_re = re.compile(r'&([^;]+);') +_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' +_digits = '0123456789' + +# special singleton representing missing values for the runtime +missing = type('MissingType', (), {'__repr__': lambda x: 'missing'})() + +# internal code +internal_code = set() + +concat = u''.join + + +def contextfunction(f): + """This decorator can be used to mark a function or method context callable. + A context callable is passed the active :class:`Context` as first argument when + called from the template. This is useful if a function wants to get access + to the context or functions provided on the context object. For example + a function that returns a sorted list of template variables the current + template exports could look like this:: + + @contextfunction + def get_exported_names(context): + return sorted(context.exported_vars) + """ + f.contextfunction = True + return f + + +def evalcontextfunction(f): + """This decorator can be used to mark a function or method as an eval + context callable. This is similar to the :func:`contextfunction` + but instead of passing the context, an evaluation context object is + passed. For more information about the eval context, see + :ref:`eval-context`. + + .. versionadded:: 2.4 + """ + f.evalcontextfunction = True + return f + + +def environmentfunction(f): + """This decorator can be used to mark a function or method as environment + callable. This decorator works exactly like the :func:`contextfunction` + decorator just that the first argument is the active :class:`Environment` + and not context. + """ + f.environmentfunction = True + return f + + +def internalcode(f): + """Marks the function as internally used""" + internal_code.add(f.__code__) + return f + + +def is_undefined(obj): + """Check if the object passed is undefined. This does nothing more than + performing an instance check against :class:`Undefined` but looks nicer. + This can be used for custom filters or tests that want to react to + undefined variables. For example a custom default filter can look like + this:: + + def default(var, default=''): + if is_undefined(var): + return default + return var + """ + from jinja2.runtime import Undefined + return isinstance(obj, Undefined) + + +def consume(iterable): + """Consumes an iterable without doing anything with it.""" + for event in iterable: + pass + + +def clear_caches(): + """Jinja2 keeps internal caches for environments and lexers. These are + used so that Jinja2 doesn't have to recreate environments and lexers all + the time. Normally you don't have to care about that but if you are + messuring memory consumption you may want to clean the caches. + """ + from jinja2.environment import _spontaneous_environments + from jinja2.lexer import _lexer_cache + _spontaneous_environments.clear() + _lexer_cache.clear() + + +def import_string(import_name, silent=False): + """Imports an object based on a string. This is useful if you want to + use import paths as endpoints or something similar. An import path can + be specified either in dotted notation (``xml.sax.saxutils.escape``) + or with a colon as object delimiter (``xml.sax.saxutils:escape``). + + If the `silent` is True the return value will be `None` if the import + fails. + + :return: imported object + """ + try: + if ':' in import_name: + module, obj = import_name.split(':', 1) + elif '.' in import_name: + items = import_name.split('.') + module = '.'.join(items[:-1]) + obj = items[-1] + else: + return __import__(import_name) + return getattr(__import__(module, None, None, [obj]), obj) + except (ImportError, AttributeError): + if not silent: + raise + + +def open_if_exists(filename, mode='rb'): + """Returns a file descriptor for the filename if that file exists, + otherwise `None`. + """ + try: + return open(filename, mode) + except IOError as e: + if e.errno not in (errno.ENOENT, errno.EISDIR): + raise + + +def object_type_repr(obj): + """Returns the name of the object's type. For some recognized + singletons the name of the object is returned instead. (For + example for `None` and `Ellipsis`). + """ + if obj is None: + return 'None' + elif obj is Ellipsis: + return 'Ellipsis' + # __builtin__ in 2.x, builtins in 3.x + if obj.__class__.__module__ in ('__builtin__', 'builtins'): + name = obj.__class__.__name__ + else: + name = obj.__class__.__module__ + '.' + obj.__class__.__name__ + return '%s object' % name + + +def pformat(obj, verbose=False): + """Prettyprint an object. Either use the `pretty` library or the + builtin `pprint`. + """ + try: + from pretty import pretty + return pretty(obj, verbose=verbose) + except ImportError: + from pprint import pformat + return pformat(obj) + + +def urlize(text, trim_url_limit=None, nofollow=False): + """Converts any URLs in text into clickable links. Works on http://, + https:// and www. links. Links can have trailing punctuation (periods, + commas, close-parens) and leading punctuation (opening parens) and + it'll still do the right thing. + + If trim_url_limit is not None, the URLs in link text will be limited + to trim_url_limit characters. + + If nofollow is True, the URLs in link text will get a rel="nofollow" + attribute. + """ + trim_url = lambda x, limit=trim_url_limit: limit is not None \ + and (x[:limit] + (len(x) >=limit and '...' + or '')) or x + words = _word_split_re.split(text_type(escape(text))) + nofollow_attr = nofollow and ' rel="nofollow"' or '' + for i, word in enumerate(words): + match = _punctuation_re.match(word) + if match: + lead, middle, trail = match.groups() + if middle.startswith('www.') or ( + '@' not in middle and + not middle.startswith('http://') and + not middle.startswith('https://') and + len(middle) > 0 and + middle[0] in _letters + _digits and ( + middle.endswith('.org') or + middle.endswith('.net') or + middle.endswith('.com') + )): + middle = '%s' % (middle, + nofollow_attr, trim_url(middle)) + if middle.startswith('http://') or \ + middle.startswith('https://'): + middle = '%s' % (middle, + nofollow_attr, trim_url(middle)) + if '@' in middle and not middle.startswith('www.') and \ + not ':' in middle and _simple_email_re.match(middle): + middle = '%s' % (middle, middle) + if lead + middle + trail != word: + words[i] = lead + middle + trail + return u''.join(words) + + +def generate_lorem_ipsum(n=5, html=True, min=20, max=100): + """Generate some lorem impsum for the template.""" + from jinja2.constants import LOREM_IPSUM_WORDS + from random import choice, randrange + words = LOREM_IPSUM_WORDS.split() + result = [] + + for _ in range(n): + next_capitalized = True + last_comma = last_fullstop = 0 + word = None + last = None + p = [] + + # each paragraph contains out of 20 to 100 words. + for idx, _ in enumerate(range(randrange(min, max))): + while True: + word = choice(words) + if word != last: + last = word + break + if next_capitalized: + word = word.capitalize() + next_capitalized = False + # add commas + if idx - randrange(3, 8) > last_comma: + last_comma = idx + last_fullstop += 2 + word += ',' + # add end of sentences + if idx - randrange(10, 20) > last_fullstop: + last_comma = last_fullstop = idx + word += '.' + next_capitalized = True + p.append(word) + + # ensure that the paragraph ends with a dot. + p = u' '.join(p) + if p.endswith(','): + p = p[:-1] + '.' + elif not p.endswith('.'): + p += '.' + result.append(p) + + if not html: + return u'\n\n'.join(result) + return Markup(u'\n'.join(u'

        %s

        ' % escape(x) for x in result)) + + +def unicode_urlencode(obj, charset='utf-8'): + """URL escapes a single bytestring or unicode string with the + given charset if applicable to URL safe quoting under all rules + that need to be considered under all supported Python versions. + + If non strings are provided they are converted to their unicode + representation first. + """ + if not isinstance(obj, string_types): + obj = text_type(obj) + if isinstance(obj, text_type): + obj = obj.encode(charset) + return text_type(url_quote(obj)) + + +class LRUCache(object): + """A simple LRU Cache implementation.""" + + # this is fast for small capacities (something below 1000) but doesn't + # scale. But as long as it's only used as storage for templates this + # won't do any harm. + + def __init__(self, capacity): + self.capacity = capacity + self._mapping = {} + self._queue = deque() + self._postinit() + + def _postinit(self): + # alias all queue methods for faster lookup + self._popleft = self._queue.popleft + self._pop = self._queue.pop + self._remove = self._queue.remove + self._wlock = allocate_lock() + self._append = self._queue.append + + def __getstate__(self): + return { + 'capacity': self.capacity, + '_mapping': self._mapping, + '_queue': self._queue + } + + def __setstate__(self, d): + self.__dict__.update(d) + self._postinit() + + def __getnewargs__(self): + return (self.capacity,) + + def copy(self): + """Return a shallow copy of the instance.""" + rv = self.__class__(self.capacity) + rv._mapping.update(self._mapping) + rv._queue = deque(self._queue) + return rv + + def get(self, key, default=None): + """Return an item from the cache dict or `default`""" + try: + return self[key] + except KeyError: + return default + + def setdefault(self, key, default=None): + """Set `default` if the key is not in the cache otherwise + leave unchanged. Return the value of this key. + """ + self._wlock.acquire() + try: + try: + return self[key] + except KeyError: + self[key] = default + return default + finally: + self._wlock.release() + + def clear(self): + """Clear the cache.""" + self._wlock.acquire() + try: + self._mapping.clear() + self._queue.clear() + finally: + self._wlock.release() + + def __contains__(self, key): + """Check if a key exists in this cache.""" + return key in self._mapping + + def __len__(self): + """Return the current size of the cache.""" + return len(self._mapping) + + def __repr__(self): + return '<%s %r>' % ( + self.__class__.__name__, + self._mapping + ) + + def __getitem__(self, key): + """Get an item from the cache. Moves the item up so that it has the + highest priority then. + + Raise a `KeyError` if it does not exist. + """ + self._wlock.acquire() + try: + rv = self._mapping[key] + if self._queue[-1] != key: + try: + self._remove(key) + except ValueError: + # if something removed the key from the container + # when we read, ignore the ValueError that we would + # get otherwise. + pass + self._append(key) + return rv + finally: + self._wlock.release() + + def __setitem__(self, key, value): + """Sets the value for an item. Moves the item up so that it + has the highest priority then. + """ + self._wlock.acquire() + try: + if key in self._mapping: + self._remove(key) + elif len(self._mapping) == self.capacity: + del self._mapping[self._popleft()] + self._append(key) + self._mapping[key] = value + finally: + self._wlock.release() + + def __delitem__(self, key): + """Remove an item from the cache dict. + Raise a `KeyError` if it does not exist. + """ + self._wlock.acquire() + try: + del self._mapping[key] + try: + self._remove(key) + except ValueError: + # __getitem__ is not locked, it might happen + pass + finally: + self._wlock.release() + + def items(self): + """Return a list of items.""" + result = [(key, self._mapping[key]) for key in list(self._queue)] + result.reverse() + return result + + def iteritems(self): + """Iterate over all items.""" + return iter(self.items()) + + def values(self): + """Return a list of all values.""" + return [x[1] for x in self.items()] + + def itervalue(self): + """Iterate over all values.""" + return iter(self.values()) + + def keys(self): + """Return a list of all keys ordered by most recent usage.""" + return list(self) + + def iterkeys(self): + """Iterate over all keys in the cache dict, ordered by + the most recent usage. + """ + return reversed(tuple(self._queue)) + + __iter__ = iterkeys + + def __reversed__(self): + """Iterate over the values in the cache dict, oldest items + coming first. + """ + return iter(tuple(self._queue)) + + __copy__ = copy + + +# register the LRU cache as mutable mapping if possible +try: + from collections import MutableMapping + MutableMapping.register(LRUCache) +except ImportError: + pass + + +@implements_iterator +class Cycler(object): + """A cycle helper for templates.""" + + def __init__(self, *items): + if not items: + raise RuntimeError('at least one item has to be provided') + self.items = items + self.reset() + + def reset(self): + """Resets the cycle.""" + self.pos = 0 + + @property + def current(self): + """Returns the current item.""" + return self.items[self.pos] + + def __next__(self): + """Goes one item ahead and returns it.""" + rv = self.current + self.pos = (self.pos + 1) % len(self.items) + return rv + + +class Joiner(object): + """A joining helper for templates.""" + + def __init__(self, sep=u', '): + self.sep = sep + self.used = False + + def __call__(self): + if not self.used: + self.used = True + return u'' + return self.sep + + +# Imported here because that's where it was in the past +from markupsafe import Markup, escape, soft_unicode diff --git a/pyload/lib/jinja2/visitor.py b/pyload/lib/jinja2/visitor.py new file mode 100644 index 000000000..413e7c309 --- /dev/null +++ b/pyload/lib/jinja2/visitor.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +""" + jinja2.visitor + ~~~~~~~~~~~~~~ + + This module implements a visitor for the nodes. + + :copyright: (c) 2010 by the Jinja Team. + :license: BSD. +""" +from jinja2.nodes import Node + + +class NodeVisitor(object): + """Walks the abstract syntax tree and call visitor functions for every + node found. The visitor functions may return values which will be + forwarded by the `visit` method. + + Per default the visitor functions for the nodes are ``'visit_'`` + + class name of the node. So a `TryFinally` node visit function would + be `visit_TryFinally`. This behavior can be changed by overriding + the `get_visitor` function. If no visitor function exists for a node + (return value `None`) the `generic_visit` visitor is used instead. + """ + + def get_visitor(self, node): + """Return the visitor function for this node or `None` if no visitor + exists for this node. In that case the generic visit function is + used instead. + """ + method = 'visit_' + node.__class__.__name__ + return getattr(self, method, None) + + def visit(self, node, *args, **kwargs): + """Visit a node.""" + f = self.get_visitor(node) + if f is not None: + return f(node, *args, **kwargs) + return self.generic_visit(node, *args, **kwargs) + + def generic_visit(self, node, *args, **kwargs): + """Called if no explicit visitor function exists for a node.""" + for node in node.iter_child_nodes(): + self.visit(node, *args, **kwargs) + + +class NodeTransformer(NodeVisitor): + """Walks the abstract syntax tree and allows modifications of nodes. + + The `NodeTransformer` will walk the AST and use the return value of the + visitor functions to replace or remove the old node. If the return + value of the visitor function is `None` the node will be removed + from the previous location otherwise it's replaced with the return + value. The return value may be the original node in which case no + replacement takes place. + """ + + def generic_visit(self, node, *args, **kwargs): + for field, old_value in node.iter_fields(): + if isinstance(old_value, list): + new_values = [] + for value in old_value: + if isinstance(value, Node): + value = self.visit(value, *args, **kwargs) + if value is None: + continue + elif not isinstance(value, Node): + new_values.extend(value) + continue + new_values.append(value) + old_value[:] = new_values + elif isinstance(old_value, Node): + new_node = self.visit(old_value, *args, **kwargs) + if new_node is None: + delattr(node, field) + else: + setattr(node, field, new_node) + return node + + def visit_list(self, node, *args, **kwargs): + """As transformers may return lists in some places this method + can be used to enforce a list as return value. + """ + rv = self.visit(node, *args, **kwargs) + if not isinstance(rv, list): + rv = [rv] + return rv diff --git a/pyload/lib/markupsafe/__init__.py b/pyload/lib/markupsafe/__init__.py new file mode 100644 index 000000000..275540154 --- /dev/null +++ b/pyload/lib/markupsafe/__init__.py @@ -0,0 +1,298 @@ +# -*- coding: utf-8 -*- +""" + markupsafe + ~~~~~~~~~~ + + Implements a Markup string. + + :copyright: (c) 2010 by Armin Ronacher. + :license: BSD, see LICENSE for more details. +""" +import re +import string +from collections import Mapping +from markupsafe._compat import text_type, string_types, int_types, \ + unichr, iteritems, PY2 + + +__all__ = ['Markup', 'soft_unicode', 'escape', 'escape_silent'] + + +_striptags_re = re.compile(r'(|<[^>]*>)') +_entity_re = re.compile(r'&([^;]+);') + + +class Markup(text_type): + r"""Marks a string as being safe for inclusion in HTML/XML output without + needing to be escaped. This implements the `__html__` interface a couple + of frameworks and web applications use. :class:`Markup` is a direct + subclass of `unicode` and provides all the methods of `unicode` just that + it escapes arguments passed and always returns `Markup`. + + The `escape` function returns markup objects so that double escaping can't + happen. + + The constructor of the :class:`Markup` class can be used for three + different things: When passed an unicode object it's assumed to be safe, + when passed an object with an HTML representation (has an `__html__` + method) that representation is used, otherwise the object passed is + converted into a unicode string and then assumed to be safe: + + >>> Markup("Hello World!") + Markup(u'Hello World!') + >>> class Foo(object): + ... def __html__(self): + ... return 'foo' + ... + >>> Markup(Foo()) + Markup(u'foo') + + If you want object passed being always treated as unsafe you can use the + :meth:`escape` classmethod to create a :class:`Markup` object: + + >>> Markup.escape("Hello World!") + Markup(u'Hello <em>World</em>!') + + Operations on a markup string are markup aware which means that all + arguments are passed through the :func:`escape` function: + + >>> em = Markup("%s") + >>> em % "foo & bar" + Markup(u'foo & bar') + >>> strong = Markup("%(text)s") + >>> strong % {'text': 'hacker here'} + Markup(u'<blink>hacker here</blink>') + >>> Markup("Hello ") + "" + Markup(u'Hello <foo>') + """ + __slots__ = () + + def __new__(cls, base=u'', encoding=None, errors='strict'): + if hasattr(base, '__html__'): + base = base.__html__() + if encoding is None: + return text_type.__new__(cls, base) + return text_type.__new__(cls, base, encoding, errors) + + def __html__(self): + return self + + def __add__(self, other): + if isinstance(other, string_types) or hasattr(other, '__html__'): + return self.__class__(super(Markup, self).__add__(self.escape(other))) + return NotImplemented + + def __radd__(self, other): + if hasattr(other, '__html__') or isinstance(other, string_types): + return self.escape(other).__add__(self) + return NotImplemented + + def __mul__(self, num): + if isinstance(num, int_types): + return self.__class__(text_type.__mul__(self, num)) + return NotImplemented + __rmul__ = __mul__ + + def __mod__(self, arg): + if isinstance(arg, tuple): + arg = tuple(_MarkupEscapeHelper(x, self.escape) for x in arg) + else: + arg = _MarkupEscapeHelper(arg, self.escape) + return self.__class__(text_type.__mod__(self, arg)) + + def __repr__(self): + return '%s(%s)' % ( + self.__class__.__name__, + text_type.__repr__(self) + ) + + def join(self, seq): + return self.__class__(text_type.join(self, map(self.escape, seq))) + join.__doc__ = text_type.join.__doc__ + + def split(self, *args, **kwargs): + return list(map(self.__class__, text_type.split(self, *args, **kwargs))) + split.__doc__ = text_type.split.__doc__ + + def rsplit(self, *args, **kwargs): + return list(map(self.__class__, text_type.rsplit(self, *args, **kwargs))) + rsplit.__doc__ = text_type.rsplit.__doc__ + + def splitlines(self, *args, **kwargs): + return list(map(self.__class__, text_type.splitlines( + self, *args, **kwargs))) + splitlines.__doc__ = text_type.splitlines.__doc__ + + def unescape(self): + r"""Unescape markup again into an text_type string. This also resolves + known HTML4 and XHTML entities: + + >>> Markup("Main » About").unescape() + u'Main \xbb About' + """ + from markupsafe._constants import HTML_ENTITIES + def handle_match(m): + name = m.group(1) + if name in HTML_ENTITIES: + return unichr(HTML_ENTITIES[name]) + try: + if name[:2] in ('#x', '#X'): + return unichr(int(name[2:], 16)) + elif name.startswith('#'): + return unichr(int(name[1:])) + except ValueError: + pass + return u'' + return _entity_re.sub(handle_match, text_type(self)) + + def striptags(self): + r"""Unescape markup into an text_type string and strip all tags. This + also resolves known HTML4 and XHTML entities. Whitespace is + normalized to one: + + >>> Markup("Main » About").striptags() + u'Main \xbb About' + """ + stripped = u' '.join(_striptags_re.sub('', self).split()) + return Markup(stripped).unescape() + + @classmethod + def escape(cls, s): + """Escape the string. Works like :func:`escape` with the difference + that for subclasses of :class:`Markup` this function would return the + correct subclass. + """ + rv = escape(s) + if rv.__class__ is not cls: + return cls(rv) + return rv + + def make_simple_escaping_wrapper(name): + orig = getattr(text_type, name) + def func(self, *args, **kwargs): + args = _escape_argspec(list(args), enumerate(args), self.escape) + _escape_argspec(kwargs, iteritems(kwargs), self.escape) + return self.__class__(orig(self, *args, **kwargs)) + func.__name__ = orig.__name__ + func.__doc__ = orig.__doc__ + return func + + for method in '__getitem__', 'capitalize', \ + 'title', 'lower', 'upper', 'replace', 'ljust', \ + 'rjust', 'lstrip', 'rstrip', 'center', 'strip', \ + 'translate', 'expandtabs', 'swapcase', 'zfill': + locals()[method] = make_simple_escaping_wrapper(method) + + # new in python 2.5 + if hasattr(text_type, 'partition'): + def partition(self, sep): + return tuple(map(self.__class__, + text_type.partition(self, self.escape(sep)))) + def rpartition(self, sep): + return tuple(map(self.__class__, + text_type.rpartition(self, self.escape(sep)))) + + # new in python 2.6 + if hasattr(text_type, 'format'): + def format(*args, **kwargs): + self, args = args[0], args[1:] + formatter = EscapeFormatter(self.escape) + kwargs = _MagicFormatMapping(args, kwargs) + return self.__class__(formatter.vformat(self, args, kwargs)) + + def __html_format__(self, format_spec): + if format_spec: + raise ValueError('Unsupported format specification ' + 'for Markup.') + return self + + # not in python 3 + if hasattr(text_type, '__getslice__'): + __getslice__ = make_simple_escaping_wrapper('__getslice__') + + del method, make_simple_escaping_wrapper + + +class _MagicFormatMapping(Mapping): + """This class implements a dummy wrapper to fix a bug in the Python + standard library for string formatting. + + See http://bugs.python.org/issue13598 for information about why + this is necessary. + """ + + def __init__(self, args, kwargs): + self._args = args + self._kwargs = kwargs + self._last_index = 0 + + def __getitem__(self, key): + if key == '': + idx = self._last_index + self._last_index += 1 + try: + return self._args[idx] + except LookupError: + pass + key = str(idx) + return self._kwargs[key] + + def __iter__(self): + return iter(self._kwargs) + + def __len__(self): + return len(self._kwargs) + + +if hasattr(text_type, 'format'): + class EscapeFormatter(string.Formatter): + + def __init__(self, escape): + self.escape = escape + + def format_field(self, value, format_spec): + if hasattr(value, '__html_format__'): + rv = value.__html_format__(format_spec) + elif hasattr(value, '__html__'): + if format_spec: + raise ValueError('No format specification allowed ' + 'when formatting an object with ' + 'its __html__ method.') + rv = value.__html__() + else: + rv = string.Formatter.format_field(self, value, format_spec) + return text_type(self.escape(rv)) + + +def _escape_argspec(obj, iterable, escape): + """Helper for various string-wrapped functions.""" + for key, value in iterable: + if hasattr(value, '__html__') or isinstance(value, string_types): + obj[key] = escape(value) + return obj + + +class _MarkupEscapeHelper(object): + """Helper for Markup.__mod__""" + + def __init__(self, obj, escape): + self.obj = obj + self.escape = escape + + __getitem__ = lambda s, x: _MarkupEscapeHelper(s.obj[x], s.escape) + __unicode__ = __str__ = lambda s: text_type(s.escape(s.obj)) + __repr__ = lambda s: str(s.escape(repr(s.obj))) + __int__ = lambda s: int(s.obj) + __float__ = lambda s: float(s.obj) + + +# we have to import it down here as the speedups and native +# modules imports the markup type which is define above. +try: + from markupsafe._speedups import escape, escape_silent, soft_unicode +except ImportError: + from markupsafe._native import escape, escape_silent, soft_unicode + +if not PY2: + soft_str = soft_unicode + __all__.append('soft_str') diff --git a/pyload/lib/markupsafe/_compat.py b/pyload/lib/markupsafe/_compat.py new file mode 100644 index 000000000..62e5632ad --- /dev/null +++ b/pyload/lib/markupsafe/_compat.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +""" + markupsafe._compat + ~~~~~~~~~~~~~~~~~~ + + Compatibility module for different Python versions. + + :copyright: (c) 2013 by Armin Ronacher. + :license: BSD, see LICENSE for more details. +""" +import sys + +PY2 = sys.version_info[0] == 2 + +if not PY2: + text_type = str + string_types = (str,) + unichr = chr + int_types = (int,) + iteritems = lambda x: iter(x.items()) +else: + text_type = unicode + string_types = (str, unicode) + unichr = unichr + int_types = (int, long) + iteritems = lambda x: x.iteritems() diff --git a/pyload/lib/markupsafe/_constants.py b/pyload/lib/markupsafe/_constants.py new file mode 100644 index 000000000..919bf03c5 --- /dev/null +++ b/pyload/lib/markupsafe/_constants.py @@ -0,0 +1,267 @@ +# -*- coding: utf-8 -*- +""" + markupsafe._constants + ~~~~~~~~~~~~~~~~~~~~~ + + Highlevel implementation of the Markup string. + + :copyright: (c) 2010 by Armin Ronacher. + :license: BSD, see LICENSE for more details. +""" + + +HTML_ENTITIES = { + 'AElig': 198, + 'Aacute': 193, + 'Acirc': 194, + 'Agrave': 192, + 'Alpha': 913, + 'Aring': 197, + 'Atilde': 195, + 'Auml': 196, + 'Beta': 914, + 'Ccedil': 199, + 'Chi': 935, + 'Dagger': 8225, + 'Delta': 916, + 'ETH': 208, + 'Eacute': 201, + 'Ecirc': 202, + 'Egrave': 200, + 'Epsilon': 917, + 'Eta': 919, + 'Euml': 203, + 'Gamma': 915, + 'Iacute': 205, + 'Icirc': 206, + 'Igrave': 204, + 'Iota': 921, + 'Iuml': 207, + 'Kappa': 922, + 'Lambda': 923, + 'Mu': 924, + 'Ntilde': 209, + 'Nu': 925, + 'OElig': 338, + 'Oacute': 211, + 'Ocirc': 212, + 'Ograve': 210, + 'Omega': 937, + 'Omicron': 927, + 'Oslash': 216, + 'Otilde': 213, + 'Ouml': 214, + 'Phi': 934, + 'Pi': 928, + 'Prime': 8243, + 'Psi': 936, + 'Rho': 929, + 'Scaron': 352, + 'Sigma': 931, + 'THORN': 222, + 'Tau': 932, + 'Theta': 920, + 'Uacute': 218, + 'Ucirc': 219, + 'Ugrave': 217, + 'Upsilon': 933, + 'Uuml': 220, + 'Xi': 926, + 'Yacute': 221, + 'Yuml': 376, + 'Zeta': 918, + 'aacute': 225, + 'acirc': 226, + 'acute': 180, + 'aelig': 230, + 'agrave': 224, + 'alefsym': 8501, + 'alpha': 945, + 'amp': 38, + 'and': 8743, + 'ang': 8736, + 'apos': 39, + 'aring': 229, + 'asymp': 8776, + 'atilde': 227, + 'auml': 228, + 'bdquo': 8222, + 'beta': 946, + 'brvbar': 166, + 'bull': 8226, + 'cap': 8745, + 'ccedil': 231, + 'cedil': 184, + 'cent': 162, + 'chi': 967, + 'circ': 710, + 'clubs': 9827, + 'cong': 8773, + 'copy': 169, + 'crarr': 8629, + 'cup': 8746, + 'curren': 164, + 'dArr': 8659, + 'dagger': 8224, + 'darr': 8595, + 'deg': 176, + 'delta': 948, + 'diams': 9830, + 'divide': 247, + 'eacute': 233, + 'ecirc': 234, + 'egrave': 232, + 'empty': 8709, + 'emsp': 8195, + 'ensp': 8194, + 'epsilon': 949, + 'equiv': 8801, + 'eta': 951, + 'eth': 240, + 'euml': 235, + 'euro': 8364, + 'exist': 8707, + 'fnof': 402, + 'forall': 8704, + 'frac12': 189, + 'frac14': 188, + 'frac34': 190, + 'frasl': 8260, + 'gamma': 947, + 'ge': 8805, + 'gt': 62, + 'hArr': 8660, + 'harr': 8596, + 'hearts': 9829, + 'hellip': 8230, + 'iacute': 237, + 'icirc': 238, + 'iexcl': 161, + 'igrave': 236, + 'image': 8465, + 'infin': 8734, + 'int': 8747, + 'iota': 953, + 'iquest': 191, + 'isin': 8712, + 'iuml': 239, + 'kappa': 954, + 'lArr': 8656, + 'lambda': 955, + 'lang': 9001, + 'laquo': 171, + 'larr': 8592, + 'lceil': 8968, + 'ldquo': 8220, + 'le': 8804, + 'lfloor': 8970, + 'lowast': 8727, + 'loz': 9674, + 'lrm': 8206, + 'lsaquo': 8249, + 'lsquo': 8216, + 'lt': 60, + 'macr': 175, + 'mdash': 8212, + 'micro': 181, + 'middot': 183, + 'minus': 8722, + 'mu': 956, + 'nabla': 8711, + 'nbsp': 160, + 'ndash': 8211, + 'ne': 8800, + 'ni': 8715, + 'not': 172, + 'notin': 8713, + 'nsub': 8836, + 'ntilde': 241, + 'nu': 957, + 'oacute': 243, + 'ocirc': 244, + 'oelig': 339, + 'ograve': 242, + 'oline': 8254, + 'omega': 969, + 'omicron': 959, + 'oplus': 8853, + 'or': 8744, + 'ordf': 170, + 'ordm': 186, + 'oslash': 248, + 'otilde': 245, + 'otimes': 8855, + 'ouml': 246, + 'para': 182, + 'part': 8706, + 'permil': 8240, + 'perp': 8869, + 'phi': 966, + 'pi': 960, + 'piv': 982, + 'plusmn': 177, + 'pound': 163, + 'prime': 8242, + 'prod': 8719, + 'prop': 8733, + 'psi': 968, + 'quot': 34, + 'rArr': 8658, + 'radic': 8730, + 'rang': 9002, + 'raquo': 187, + 'rarr': 8594, + 'rceil': 8969, + 'rdquo': 8221, + 'real': 8476, + 'reg': 174, + 'rfloor': 8971, + 'rho': 961, + 'rlm': 8207, + 'rsaquo': 8250, + 'rsquo': 8217, + 'sbquo': 8218, + 'scaron': 353, + 'sdot': 8901, + 'sect': 167, + 'shy': 173, + 'sigma': 963, + 'sigmaf': 962, + 'sim': 8764, + 'spades': 9824, + 'sub': 8834, + 'sube': 8838, + 'sum': 8721, + 'sup': 8835, + 'sup1': 185, + 'sup2': 178, + 'sup3': 179, + 'supe': 8839, + 'szlig': 223, + 'tau': 964, + 'there4': 8756, + 'theta': 952, + 'thetasym': 977, + 'thinsp': 8201, + 'thorn': 254, + 'tilde': 732, + 'times': 215, + 'trade': 8482, + 'uArr': 8657, + 'uacute': 250, + 'uarr': 8593, + 'ucirc': 251, + 'ugrave': 249, + 'uml': 168, + 'upsih': 978, + 'upsilon': 965, + 'uuml': 252, + 'weierp': 8472, + 'xi': 958, + 'yacute': 253, + 'yen': 165, + 'yuml': 255, + 'zeta': 950, + 'zwj': 8205, + 'zwnj': 8204 +} diff --git a/pyload/lib/markupsafe/_native.py b/pyload/lib/markupsafe/_native.py new file mode 100644 index 000000000..5e83f10a1 --- /dev/null +++ b/pyload/lib/markupsafe/_native.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +""" + markupsafe._native + ~~~~~~~~~~~~~~~~~~ + + Native Python implementation the C module is not compiled. + + :copyright: (c) 2010 by Armin Ronacher. + :license: BSD, see LICENSE for more details. +""" +from markupsafe import Markup +from markupsafe._compat import text_type + + +def escape(s): + """Convert the characters &, <, >, ' and " in string s to HTML-safe + sequences. Use this if you need to display text that might contain + such characters in HTML. Marks return value as markup string. + """ + if hasattr(s, '__html__'): + return s.__html__() + return Markup(text_type(s) + .replace('&', '&') + .replace('>', '>') + .replace('<', '<') + .replace("'", ''') + .replace('"', '"') + ) + + +def escape_silent(s): + """Like :func:`escape` but converts `None` into an empty + markup string. + """ + if s is None: + return Markup() + return escape(s) + + +def soft_unicode(s): + """Make a string unicode if it isn't already. That way a markup + string is not converted back to unicode. + """ + if not isinstance(s, text_type): + s = text_type(s) + return s diff --git a/pyload/lib/markupsafe/_speedups.c b/pyload/lib/markupsafe/_speedups.c new file mode 100644 index 000000000..f349febf2 --- /dev/null +++ b/pyload/lib/markupsafe/_speedups.c @@ -0,0 +1,239 @@ +/** + * markupsafe._speedups + * ~~~~~~~~~~~~~~~~~~~~ + * + * This module implements functions for automatic escaping in C for better + * performance. + * + * :copyright: (c) 2010 by Armin Ronacher. + * :license: BSD. + */ + +#include + +#define ESCAPED_CHARS_TABLE_SIZE 63 +#define UNICHR(x) (PyUnicode_AS_UNICODE((PyUnicodeObject*)PyUnicode_DecodeASCII(x, strlen(x), NULL))); + +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +#define PY_SSIZE_T_MAX INT_MAX +#define PY_SSIZE_T_MIN INT_MIN +#endif + + +static PyObject* markup; +static Py_ssize_t escaped_chars_delta_len[ESCAPED_CHARS_TABLE_SIZE]; +static Py_UNICODE *escaped_chars_repl[ESCAPED_CHARS_TABLE_SIZE]; + +static int +init_constants(void) +{ + PyObject *module; + /* happing of characters to replace */ + escaped_chars_repl['"'] = UNICHR("""); + escaped_chars_repl['\''] = UNICHR("'"); + escaped_chars_repl['&'] = UNICHR("&"); + escaped_chars_repl['<'] = UNICHR("<"); + escaped_chars_repl['>'] = UNICHR(">"); + + /* lengths of those characters when replaced - 1 */ + memset(escaped_chars_delta_len, 0, sizeof (escaped_chars_delta_len)); + escaped_chars_delta_len['"'] = escaped_chars_delta_len['\''] = \ + escaped_chars_delta_len['&'] = 4; + escaped_chars_delta_len['<'] = escaped_chars_delta_len['>'] = 3; + + /* import markup type so that we can mark the return value */ + module = PyImport_ImportModule("markupsafe"); + if (!module) + return 0; + markup = PyObject_GetAttrString(module, "Markup"); + Py_DECREF(module); + + return 1; +} + +static PyObject* +escape_unicode(PyUnicodeObject *in) +{ + PyUnicodeObject *out; + Py_UNICODE *inp = PyUnicode_AS_UNICODE(in); + const Py_UNICODE *inp_end = PyUnicode_AS_UNICODE(in) + PyUnicode_GET_SIZE(in); + Py_UNICODE *next_escp; + Py_UNICODE *outp; + Py_ssize_t delta=0, erepl=0, delta_len=0; + + /* First we need to figure out how long the escaped string will be */ + while (*(inp) || inp < inp_end) { + if (*inp < ESCAPED_CHARS_TABLE_SIZE) { + delta += escaped_chars_delta_len[*inp]; + erepl += !!escaped_chars_delta_len[*inp]; + } + ++inp; + } + + /* Do we need to escape anything at all? */ + if (!erepl) { + Py_INCREF(in); + return (PyObject*)in; + } + + out = (PyUnicodeObject*)PyUnicode_FromUnicode(NULL, PyUnicode_GET_SIZE(in) + delta); + if (!out) + return NULL; + + outp = PyUnicode_AS_UNICODE(out); + inp = PyUnicode_AS_UNICODE(in); + while (erepl-- > 0) { + /* look for the next substitution */ + next_escp = inp; + while (next_escp < inp_end) { + if (*next_escp < ESCAPED_CHARS_TABLE_SIZE && + (delta_len = escaped_chars_delta_len[*next_escp])) { + ++delta_len; + break; + } + ++next_escp; + } + + if (next_escp > inp) { + /* copy unescaped chars between inp and next_escp */ + Py_UNICODE_COPY(outp, inp, next_escp-inp); + outp += next_escp - inp; + } + + /* escape 'next_escp' */ + Py_UNICODE_COPY(outp, escaped_chars_repl[*next_escp], delta_len); + outp += delta_len; + + inp = next_escp + 1; + } + if (inp < inp_end) + Py_UNICODE_COPY(outp, inp, PyUnicode_GET_SIZE(in) - (inp - PyUnicode_AS_UNICODE(in))); + + return (PyObject*)out; +} + + +static PyObject* +escape(PyObject *self, PyObject *text) +{ + PyObject *s = NULL, *rv = NULL, *html; + + /* we don't have to escape integers, bools or floats */ + if (PyLong_CheckExact(text) || +#if PY_MAJOR_VERSION < 3 + PyInt_CheckExact(text) || +#endif + PyFloat_CheckExact(text) || PyBool_Check(text) || + text == Py_None) + return PyObject_CallFunctionObjArgs(markup, text, NULL); + + /* if the object has an __html__ method that performs the escaping */ + html = PyObject_GetAttrString(text, "__html__"); + if (html) { + rv = PyObject_CallObject(html, NULL); + Py_DECREF(html); + return rv; + } + + /* otherwise make the object unicode if it isn't, then escape */ + PyErr_Clear(); + if (!PyUnicode_Check(text)) { +#if PY_MAJOR_VERSION < 3 + PyObject *unicode = PyObject_Unicode(text); +#else + PyObject *unicode = PyObject_Str(text); +#endif + if (!unicode) + return NULL; + s = escape_unicode((PyUnicodeObject*)unicode); + Py_DECREF(unicode); + } + else + s = escape_unicode((PyUnicodeObject*)text); + + /* convert the unicode string into a markup object. */ + rv = PyObject_CallFunctionObjArgs(markup, (PyObject*)s, NULL); + Py_DECREF(s); + return rv; +} + + +static PyObject* +escape_silent(PyObject *self, PyObject *text) +{ + if (text != Py_None) + return escape(self, text); + return PyObject_CallFunctionObjArgs(markup, NULL); +} + + +static PyObject* +soft_unicode(PyObject *self, PyObject *s) +{ + if (!PyUnicode_Check(s)) +#if PY_MAJOR_VERSION < 3 + return PyObject_Unicode(s); +#else + return PyObject_Str(s); +#endif + Py_INCREF(s); + return s; +} + + +static PyMethodDef module_methods[] = { + {"escape", (PyCFunction)escape, METH_O, + "escape(s) -> markup\n\n" + "Convert the characters &, <, >, ', and \" in string s to HTML-safe\n" + "sequences. Use this if you need to display text that might contain\n" + "such characters in HTML. Marks return value as markup string."}, + {"escape_silent", (PyCFunction)escape_silent, METH_O, + "escape_silent(s) -> markup\n\n" + "Like escape but converts None to an empty string."}, + {"soft_unicode", (PyCFunction)soft_unicode, METH_O, + "soft_unicode(object) -> string\n\n" + "Make a string unicode if it isn't already. That way a markup\n" + "string is not converted back to unicode."}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + + +#if PY_MAJOR_VERSION < 3 + +#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ +#define PyMODINIT_FUNC void +#endif +PyMODINIT_FUNC +init_speedups(void) +{ + if (!init_constants()) + return; + + Py_InitModule3("markupsafe._speedups", module_methods, ""); +} + +#else /* Python 3.x module initialization */ + +static struct PyModuleDef module_definition = { + PyModuleDef_HEAD_INIT, + "markupsafe._speedups", + NULL, + -1, + module_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit__speedups(void) +{ + if (!init_constants()) + return NULL; + + return PyModule_Create(&module_definition); +} + +#endif diff --git a/pyload/lib/markupsafe/tests.py b/pyload/lib/markupsafe/tests.py new file mode 100644 index 000000000..636993629 --- /dev/null +++ b/pyload/lib/markupsafe/tests.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +import gc +import sys +import unittest +from markupsafe import Markup, escape, escape_silent +from markupsafe._compat import text_type + + +class MarkupTestCase(unittest.TestCase): + + def test_adding(self): + # adding two strings should escape the unsafe one + unsafe = '' + safe = Markup('username') + assert unsafe + safe == text_type(escape(unsafe)) + text_type(safe) + + def test_string_interpolation(self): + # string interpolations are safe to use too + assert Markup('%s') % '' == \ + '<bad user>' + assert Markup('%(username)s') % { + 'username': '' + } == '<bad user>' + + assert Markup('%i') % 3.14 == '3' + assert Markup('%.2f') % 3.14 == '3.14' + + def test_type_behavior(self): + # an escaped object is markup too + assert type(Markup('foo') + 'bar') is Markup + + # and it implements __html__ by returning itself + x = Markup("foo") + assert x.__html__() is x + + def test_html_interop(self): + # it also knows how to treat __html__ objects + class Foo(object): + def __html__(self): + return 'awesome' + def __unicode__(self): + return 'awesome' + __str__ = __unicode__ + assert Markup(Foo()) == 'awesome' + assert Markup('%s') % Foo() == \ + 'awesome' + + def test_tuple_interpol(self): + self.assertEqual(Markup('%s:%s') % ( + '', + '', + ), Markup(u'<foo>:<bar>')) + + def test_dict_interpol(self): + self.assertEqual(Markup('%(foo)s') % { + 'foo': '', + }, Markup(u'<foo>')) + self.assertEqual(Markup('%(foo)s:%(bar)s') % { + 'foo': '', + 'bar': '', + }, Markup(u'<foo>:<bar>')) + + def test_escaping(self): + # escaping and unescaping + assert escape('"<>&\'') == '"<>&'' + assert Markup("Foo & Bar").striptags() == "Foo & Bar" + assert Markup("<test>").unescape() == "" + + def test_formatting(self): + for actual, expected in ( + (Markup('%i') % 3.14, '3'), + (Markup('%.2f') % 3.14159, '3.14'), + (Markup('%s %s %s') % ('<', 123, '>'), '< 123 >'), + (Markup('{awesome}').format(awesome=''), + '<awesome>'), + (Markup('{0[1][bar]}').format([0, {'bar': ''}]), + '<bar/>'), + (Markup('{0[1][bar]}').format([0, {'bar': Markup('')}]), + '')): + assert actual == expected, "%r should be %r!" % (actual, expected) + + # This is new in 2.7 + if sys.version_info >= (2, 7): + def test_formatting_empty(self): + formatted = Markup('{}').format(0) + assert formatted == Markup('0') + + def test_custom_formatting(self): + class HasHTMLOnly(object): + def __html__(self): + return Markup('') + + class HasHTMLAndFormat(object): + def __html__(self): + return Markup('') + def __html_format__(self, spec): + return Markup('') + + assert Markup('{0}').format(HasHTMLOnly()) == Markup('') + assert Markup('{0}').format(HasHTMLAndFormat()) == Markup('') + + def test_complex_custom_formatting(self): + class User(object): + def __init__(self, id, username): + self.id = id + self.username = username + def __html_format__(self, format_spec): + if format_spec == 'link': + return Markup('{1}').format( + self.id, + self.__html__(), + ) + elif format_spec: + raise ValueError('Invalid format spec') + return self.__html__() + def __html__(self): + return Markup('{0}').format(self.username) + + user = User(1, 'foo') + assert Markup('

        User: {0:link}').format(user) == \ + Markup('

        User: foo') + + def test_all_set(self): + import markupsafe as markup + for item in markup.__all__: + getattr(markup, item) + + def test_escape_silent(self): + assert escape_silent(None) == Markup() + assert escape(None) == Markup(None) + assert escape_silent('') == Markup(u'<foo>') + + def test_splitting(self): + self.assertEqual(Markup('a b').split(), [ + Markup('a'), + Markup('b') + ]) + self.assertEqual(Markup('a b').rsplit(), [ + Markup('a'), + Markup('b') + ]) + self.assertEqual(Markup('a\nb').splitlines(), [ + Markup('a'), + Markup('b') + ]) + + def test_mul(self): + self.assertEqual(Markup('a') * 3, Markup('aaa')) + + +class MarkupLeakTestCase(unittest.TestCase): + + def test_markup_leaks(self): + counts = set() + for count in range(20): + for item in range(1000): + escape("foo") + escape("") + escape(u"foo") + escape(u"") + counts.add(len(gc.get_objects())) + assert len(counts) == 1, 'ouch, c extension seems to leak objects' + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(MarkupTestCase)) + + # this test only tests the c extension + if not hasattr(escape, 'func_code'): + suite.addTest(unittest.makeSuite(MarkupLeakTestCase)) + + return suite + + +if __name__ == '__main__': + unittest.main(defaultTest='suite') + +# vim:sts=4:sw=4:et: diff --git a/pyload/lib/rename_process.py b/pyload/lib/rename_process.py new file mode 100644 index 000000000..2527cef39 --- /dev/null +++ b/pyload/lib/rename_process.py @@ -0,0 +1,14 @@ +import sys + +def renameProcess(new_name): + """ Renames the process calling the function to the given name. """ + if sys.platform != 'linux2': + return False + try: + from ctypes import CDLL + libc = CDLL('libc.so.6') + libc.prctl(15, new_name, 0, 0, 0) + return True + except Exception, e: + #print "Rename process failed", e + return False diff --git a/pyload/lib/simplejson/__init__.py b/pyload/lib/simplejson/__init__.py new file mode 100644 index 000000000..a5c01379a --- /dev/null +++ b/pyload/lib/simplejson/__init__.py @@ -0,0 +1,560 @@ +r"""JSON (JavaScript Object Notation) is a subset of +JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data +interchange format. + +:mod:`simplejson` exposes an API familiar to users of the standard library +:mod:`marshal` and :mod:`pickle` modules. It is the externally maintained +version of the :mod:`json` library contained in Python 2.6, but maintains +compatibility with Python 2.4 and Python 2.5 and (currently) has +significant performance advantages, even without using the optional C +extension for speedups. + +Encoding basic Python object hierarchies:: + + >>> import simplejson as json + >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) + '["foo", {"bar": ["baz", null, 1.0, 2]}]' + >>> print(json.dumps("\"foo\bar")) + "\"foo\bar" + >>> print(json.dumps(u'\u1234')) + "\u1234" + >>> print(json.dumps('\\')) + "\\" + >>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)) + {"a": 0, "b": 0, "c": 0} + >>> from simplejson.compat import StringIO + >>> io = StringIO() + >>> json.dump(['streaming API'], io) + >>> io.getvalue() + '["streaming API"]' + +Compact encoding:: + + >>> import simplejson as json + >>> obj = [1,2,3,{'4': 5, '6': 7}] + >>> json.dumps(obj, separators=(',',':'), sort_keys=True) + '[1,2,3,{"4":5,"6":7}]' + +Pretty printing:: + + >>> import simplejson as json + >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=' ')) + { + "4": 5, + "6": 7 + } + +Decoding JSON:: + + >>> import simplejson as json + >>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}] + >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj + True + >>> json.loads('"\\"foo\\bar"') == u'"foo\x08ar' + True + >>> from simplejson.compat import StringIO + >>> io = StringIO('["streaming API"]') + >>> json.load(io)[0] == 'streaming API' + True + +Specializing JSON object decoding:: + + >>> import simplejson as json + >>> def as_complex(dct): + ... if '__complex__' in dct: + ... return complex(dct['real'], dct['imag']) + ... return dct + ... + >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}', + ... object_hook=as_complex) + (1+2j) + >>> from decimal import Decimal + >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1') + True + +Specializing JSON object encoding:: + + >>> import simplejson as json + >>> def encode_complex(obj): + ... if isinstance(obj, complex): + ... return [obj.real, obj.imag] + ... raise TypeError(repr(o) + " is not JSON serializable") + ... + >>> json.dumps(2 + 1j, default=encode_complex) + '[2.0, 1.0]' + >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j) + '[2.0, 1.0]' + >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j)) + '[2.0, 1.0]' + + +Using simplejson.tool from the shell to validate and pretty-print:: + + $ echo '{"json":"obj"}' | python -m simplejson.tool + { + "json": "obj" + } + $ echo '{ 1.2:3.4}' | python -m simplejson.tool + Expecting property name: line 1 column 3 (char 2) +""" +from __future__ import absolute_import +__version__ = '3.5.3' +__all__ = [ + 'dump', 'dumps', 'load', 'loads', + 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder', + 'OrderedDict', 'simple_first', +] + +__author__ = 'Bob Ippolito ' + +from decimal import Decimal + +from .scanner import JSONDecodeError +from .decoder import JSONDecoder +from .encoder import JSONEncoder, JSONEncoderForHTML +def _import_OrderedDict(): + import collections + try: + return collections.OrderedDict + except AttributeError: + from . import ordered_dict + return ordered_dict.OrderedDict +OrderedDict = _import_OrderedDict() + +def _import_c_make_encoder(): + try: + from ._speedups import make_encoder + return make_encoder + except ImportError: + return None + +_default_encoder = JSONEncoder( + skipkeys=False, + ensure_ascii=True, + check_circular=True, + allow_nan=True, + indent=None, + separators=None, + encoding='utf-8', + default=None, + use_decimal=True, + namedtuple_as_object=True, + tuple_as_array=True, + bigint_as_string=False, + item_sort_key=None, + for_json=False, + ignore_nan=False, + int_as_string_bitcount=None, +) + +def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, + allow_nan=True, cls=None, indent=None, separators=None, + encoding='utf-8', default=None, use_decimal=True, + namedtuple_as_object=True, tuple_as_array=True, + bigint_as_string=False, sort_keys=False, item_sort_key=None, + for_json=False, ignore_nan=False, int_as_string_bitcount=None, **kw): + """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a + ``.write()``-supporting file-like object). + + If *skipkeys* is true then ``dict`` keys that are not basic types + (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) + will be skipped instead of raising a ``TypeError``. + + If *ensure_ascii* is false, then the some chunks written to ``fp`` + may be ``unicode`` instances, subject to normal Python ``str`` to + ``unicode`` coercion rules. Unless ``fp.write()`` explicitly + understands ``unicode`` (as in ``codecs.getwriter()``) this is likely + to cause an error. + + If *check_circular* is false, then the circular reference check + for container types will be skipped and a circular reference will + result in an ``OverflowError`` (or worse). + + If *allow_nan* is false, then it will be a ``ValueError`` to + serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) + in strict compliance of the original JSON specification, instead of using + the JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). See + *ignore_nan* for ECMA-262 compliant behavior. + + If *indent* is a string, then JSON array elements and object members + will be pretty-printed with a newline followed by that string repeated + for each level of nesting. ``None`` (the default) selects the most compact + representation without any newlines. For backwards compatibility with + versions of simplejson earlier than 2.1.0, an integer is also accepted + and is converted to a string with that many spaces. + + If specified, *separators* should be an + ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')`` + if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most + compact JSON representation, you should specify ``(',', ':')`` to eliminate + whitespace. + + *encoding* is the character encoding for str instances, default is UTF-8. + + *default(obj)* is a function that should return a serializable version + of obj or raise ``TypeError``. The default simply raises ``TypeError``. + + If *use_decimal* is true (default: ``True``) then decimal.Decimal + will be natively serialized to JSON with full precision. + + If *namedtuple_as_object* is true (default: ``True``), + :class:`tuple` subclasses with ``_asdict()`` methods will be encoded + as JSON objects. + + If *tuple_as_array* is true (default: ``True``), + :class:`tuple` (and subclasses) will be encoded as JSON arrays. + + If *bigint_as_string* is true (default: ``False``), ints 2**53 and higher + or lower than -2**53 will be encoded as strings. This is to avoid the + rounding that happens in Javascript otherwise. Note that this is still a + lossy operation that will not round-trip correctly and should be used + sparingly. + + If *int_as_string_bitcount* is a positive number (n), then int of size + greater than or equal to 2**n or lower than or equal to -2**n will be + encoded as strings. + + If specified, *item_sort_key* is a callable used to sort the items in + each dictionary. This is useful if you want to sort items other than + in alphabetical order by key. This option takes precedence over + *sort_keys*. + + If *sort_keys* is true (default: ``False``), the output of dictionaries + will be sorted by item. + + If *for_json* is true (default: ``False``), objects with a ``for_json()`` + method will use the return value of that method for encoding as JSON + instead of the object. + + If *ignore_nan* is true (default: ``False``), then out of range + :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as + ``null`` in compliance with the ECMA-262 specification. If true, this will + override *allow_nan*. + + To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the + ``.default()`` method to serialize additional types), specify it with + the ``cls`` kwarg. NOTE: You should use *default* or *for_json* instead + of subclassing whenever possible. + + """ + # cached encoder + if (not skipkeys and ensure_ascii and + check_circular and allow_nan and + cls is None and indent is None and separators is None and + encoding == 'utf-8' and default is None and use_decimal + and namedtuple_as_object and tuple_as_array + and not bigint_as_string and int_as_string_bitcount is None + and not item_sort_key and not for_json and not ignore_nan and not kw): + iterable = _default_encoder.iterencode(obj) + else: + if cls is None: + cls = JSONEncoder + iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, + check_circular=check_circular, allow_nan=allow_nan, indent=indent, + separators=separators, encoding=encoding, + default=default, use_decimal=use_decimal, + namedtuple_as_object=namedtuple_as_object, + tuple_as_array=tuple_as_array, + bigint_as_string=bigint_as_string, + sort_keys=sort_keys, + item_sort_key=item_sort_key, + for_json=for_json, + ignore_nan=ignore_nan, + int_as_string_bitcount=int_as_string_bitcount, + **kw).iterencode(obj) + # could accelerate with writelines in some versions of Python, at + # a debuggability cost + for chunk in iterable: + fp.write(chunk) + + +def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, + allow_nan=True, cls=None, indent=None, separators=None, + encoding='utf-8', default=None, use_decimal=True, + namedtuple_as_object=True, tuple_as_array=True, + bigint_as_string=False, sort_keys=False, item_sort_key=None, + for_json=False, ignore_nan=False, int_as_string_bitcount=None, **kw): + """Serialize ``obj`` to a JSON formatted ``str``. + + If ``skipkeys`` is false then ``dict`` keys that are not basic types + (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) + will be skipped instead of raising a ``TypeError``. + + If ``ensure_ascii`` is false, then the return value will be a + ``unicode`` instance subject to normal Python ``str`` to ``unicode`` + coercion rules instead of being escaped to an ASCII ``str``. + + If ``check_circular`` is false, then the circular reference check + for container types will be skipped and a circular reference will + result in an ``OverflowError`` (or worse). + + If ``allow_nan`` is false, then it will be a ``ValueError`` to + serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in + strict compliance of the JSON specification, instead of using the + JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). + + If ``indent`` is a string, then JSON array elements and object members + will be pretty-printed with a newline followed by that string repeated + for each level of nesting. ``None`` (the default) selects the most compact + representation without any newlines. For backwards compatibility with + versions of simplejson earlier than 2.1.0, an integer is also accepted + and is converted to a string with that many spaces. + + If specified, ``separators`` should be an + ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')`` + if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most + compact JSON representation, you should specify ``(',', ':')`` to eliminate + whitespace. + + ``encoding`` is the character encoding for str instances, default is UTF-8. + + ``default(obj)`` is a function that should return a serializable version + of obj or raise TypeError. The default simply raises TypeError. + + If *use_decimal* is true (default: ``True``) then decimal.Decimal + will be natively serialized to JSON with full precision. + + If *namedtuple_as_object* is true (default: ``True``), + :class:`tuple` subclasses with ``_asdict()`` methods will be encoded + as JSON objects. + + If *tuple_as_array* is true (default: ``True``), + :class:`tuple` (and subclasses) will be encoded as JSON arrays. + + If *bigint_as_string* is true (not the default), ints 2**53 and higher + or lower than -2**53 will be encoded as strings. This is to avoid the + rounding that happens in Javascript otherwise. + + If *int_as_string_bitcount* is a positive number (n), then int of size + greater than or equal to 2**n or lower than or equal to -2**n will be + encoded as strings. + + If specified, *item_sort_key* is a callable used to sort the items in + each dictionary. This is useful if you want to sort items other than + in alphabetical order by key. This option takes precendence over + *sort_keys*. + + If *sort_keys* is true (default: ``False``), the output of dictionaries + will be sorted by item. + + If *for_json* is true (default: ``False``), objects with a ``for_json()`` + method will use the return value of that method for encoding as JSON + instead of the object. + + If *ignore_nan* is true (default: ``False``), then out of range + :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as + ``null`` in compliance with the ECMA-262 specification. If true, this will + override *allow_nan*. + + To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the + ``.default()`` method to serialize additional types), specify it with + the ``cls`` kwarg. NOTE: You should use *default* instead of subclassing + whenever possible. + + """ + # cached encoder + if ( + not skipkeys and ensure_ascii and + check_circular and allow_nan and + cls is None and indent is None and separators is None and + encoding == 'utf-8' and default is None and use_decimal + and namedtuple_as_object and tuple_as_array + and not bigint_as_string and int_as_string_bitcount is None + and not sort_keys and not item_sort_key and not for_json + and not ignore_nan and not kw + ): + return _default_encoder.encode(obj) + if cls is None: + cls = JSONEncoder + return cls( + skipkeys=skipkeys, ensure_ascii=ensure_ascii, + check_circular=check_circular, allow_nan=allow_nan, indent=indent, + separators=separators, encoding=encoding, default=default, + use_decimal=use_decimal, + namedtuple_as_object=namedtuple_as_object, + tuple_as_array=tuple_as_array, + bigint_as_string=bigint_as_string, + sort_keys=sort_keys, + item_sort_key=item_sort_key, + for_json=for_json, + ignore_nan=ignore_nan, + int_as_string_bitcount=int_as_string_bitcount, + **kw).encode(obj) + + +_default_decoder = JSONDecoder(encoding=None, object_hook=None, + object_pairs_hook=None) + + +def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, + parse_int=None, parse_constant=None, object_pairs_hook=None, + use_decimal=False, namedtuple_as_object=True, tuple_as_array=True, + **kw): + """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing + a JSON document) to a Python object. + + *encoding* determines the encoding used to interpret any + :class:`str` objects decoded by this instance (``'utf-8'`` by + default). It has no effect when decoding :class:`unicode` objects. + + Note that currently only encodings that are a superset of ASCII work, + strings of other encodings should be passed in as :class:`unicode`. + + *object_hook*, if specified, will be called with the result of every + JSON object decoded and its return value will be used in place of the + given :class:`dict`. This can be used to provide custom + deserializations (e.g. to support JSON-RPC class hinting). + + *object_pairs_hook* is an optional function that will be called with + the result of any object literal decode with an ordered list of pairs. + The return value of *object_pairs_hook* will be used instead of the + :class:`dict`. This feature can be used to implement custom decoders + that rely on the order that the key and value pairs are decoded (for + example, :func:`collections.OrderedDict` will remember the order of + insertion). If *object_hook* is also defined, the *object_pairs_hook* + takes priority. + + *parse_float*, if specified, will be called with the string of every + JSON float to be decoded. By default, this is equivalent to + ``float(num_str)``. This can be used to use another datatype or parser + for JSON floats (e.g. :class:`decimal.Decimal`). + + *parse_int*, if specified, will be called with the string of every + JSON int to be decoded. By default, this is equivalent to + ``int(num_str)``. This can be used to use another datatype or parser + for JSON integers (e.g. :class:`float`). + + *parse_constant*, if specified, will be called with one of the + following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This + can be used to raise an exception if invalid JSON numbers are + encountered. + + If *use_decimal* is true (default: ``False``) then it implies + parse_float=decimal.Decimal for parity with ``dump``. + + To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` + kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead + of subclassing whenever possible. + + """ + return loads(fp.read(), + encoding=encoding, cls=cls, object_hook=object_hook, + parse_float=parse_float, parse_int=parse_int, + parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, + use_decimal=use_decimal, **kw) + + +def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, + parse_int=None, parse_constant=None, object_pairs_hook=None, + use_decimal=False, **kw): + """Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON + document) to a Python object. + + *encoding* determines the encoding used to interpret any + :class:`str` objects decoded by this instance (``'utf-8'`` by + default). It has no effect when decoding :class:`unicode` objects. + + Note that currently only encodings that are a superset of ASCII work, + strings of other encodings should be passed in as :class:`unicode`. + + *object_hook*, if specified, will be called with the result of every + JSON object decoded and its return value will be used in place of the + given :class:`dict`. This can be used to provide custom + deserializations (e.g. to support JSON-RPC class hinting). + + *object_pairs_hook* is an optional function that will be called with + the result of any object literal decode with an ordered list of pairs. + The return value of *object_pairs_hook* will be used instead of the + :class:`dict`. This feature can be used to implement custom decoders + that rely on the order that the key and value pairs are decoded (for + example, :func:`collections.OrderedDict` will remember the order of + insertion). If *object_hook* is also defined, the *object_pairs_hook* + takes priority. + + *parse_float*, if specified, will be called with the string of every + JSON float to be decoded. By default, this is equivalent to + ``float(num_str)``. This can be used to use another datatype or parser + for JSON floats (e.g. :class:`decimal.Decimal`). + + *parse_int*, if specified, will be called with the string of every + JSON int to be decoded. By default, this is equivalent to + ``int(num_str)``. This can be used to use another datatype or parser + for JSON integers (e.g. :class:`float`). + + *parse_constant*, if specified, will be called with one of the + following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This + can be used to raise an exception if invalid JSON numbers are + encountered. + + If *use_decimal* is true (default: ``False``) then it implies + parse_float=decimal.Decimal for parity with ``dump``. + + To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` + kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead + of subclassing whenever possible. + + """ + if (cls is None and encoding is None and object_hook is None and + parse_int is None and parse_float is None and + parse_constant is None and object_pairs_hook is None + and not use_decimal and not kw): + return _default_decoder.decode(s) + if cls is None: + cls = JSONDecoder + if object_hook is not None: + kw['object_hook'] = object_hook + if object_pairs_hook is not None: + kw['object_pairs_hook'] = object_pairs_hook + if parse_float is not None: + kw['parse_float'] = parse_float + if parse_int is not None: + kw['parse_int'] = parse_int + if parse_constant is not None: + kw['parse_constant'] = parse_constant + if use_decimal: + if parse_float is not None: + raise TypeError("use_decimal=True implies parse_float=Decimal") + kw['parse_float'] = Decimal + return cls(encoding=encoding, **kw).decode(s) + + +def _toggle_speedups(enabled): + from . import decoder as dec + from . import encoder as enc + from . import scanner as scan + c_make_encoder = _import_c_make_encoder() + if enabled: + dec.scanstring = dec.c_scanstring or dec.py_scanstring + enc.c_make_encoder = c_make_encoder + enc.encode_basestring_ascii = (enc.c_encode_basestring_ascii or + enc.py_encode_basestring_ascii) + scan.make_scanner = scan.c_make_scanner or scan.py_make_scanner + else: + dec.scanstring = dec.py_scanstring + enc.c_make_encoder = None + enc.encode_basestring_ascii = enc.py_encode_basestring_ascii + scan.make_scanner = scan.py_make_scanner + dec.make_scanner = scan.make_scanner + global _default_decoder + _default_decoder = JSONDecoder( + encoding=None, + object_hook=None, + object_pairs_hook=None, + ) + global _default_encoder + _default_encoder = JSONEncoder( + skipkeys=False, + ensure_ascii=True, + check_circular=True, + allow_nan=True, + indent=None, + separators=None, + encoding='utf-8', + default=None, + ) + +def simple_first(kv): + """Helper function to pass to item_sort_key to sort simple + elements to the top, then container elements. + """ + return (isinstance(kv[1], (list, dict, tuple)), kv[0]) diff --git a/pyload/lib/simplejson/compat.py b/pyload/lib/simplejson/compat.py new file mode 100644 index 000000000..a0af4a1cb --- /dev/null +++ b/pyload/lib/simplejson/compat.py @@ -0,0 +1,46 @@ +"""Python 3 compatibility shims +""" +import sys +if sys.version_info[0] < 3: + PY3 = False + def b(s): + return s + def u(s): + return unicode(s, 'unicode_escape') + import cStringIO as StringIO + StringIO = BytesIO = StringIO.StringIO + text_type = unicode + binary_type = str + string_types = (basestring,) + integer_types = (int, long) + unichr = unichr + reload_module = reload + def fromhex(s): + return s.decode('hex') + +else: + PY3 = True + if sys.version_info[:2] >= (3, 4): + from importlib import reload as reload_module + else: + from imp import reload as reload_module + import codecs + def b(s): + return codecs.latin_1_encode(s)[0] + def u(s): + return s + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + text_type = str + binary_type = bytes + string_types = (str,) + integer_types = (int,) + + def unichr(s): + return u(chr(s)) + + def fromhex(s): + return bytes.fromhex(s) + +long_type = integer_types[-1] diff --git a/pyload/lib/simplejson/decoder.py b/pyload/lib/simplejson/decoder.py new file mode 100644 index 000000000..1a6c5d938 --- /dev/null +++ b/pyload/lib/simplejson/decoder.py @@ -0,0 +1,393 @@ +"""Implementation of JSONDecoder +""" +from __future__ import absolute_import +import re +import sys +import struct +from .compat import fromhex, b, u, text_type, binary_type, PY3, unichr +from .scanner import make_scanner, JSONDecodeError + +def _import_c_scanstring(): + try: + from ._speedups import scanstring + return scanstring + except ImportError: + return None +c_scanstring = _import_c_scanstring() + +# NOTE (3.1.0): JSONDecodeError may still be imported from this module for +# compatibility, but it was never in the __all__ +__all__ = ['JSONDecoder'] + +FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL + +def _floatconstants(): + _BYTES = fromhex('7FF80000000000007FF0000000000000') + # The struct module in Python 2.4 would get frexp() out of range here + # when an endian is specified in the format string. Fixed in Python 2.5+ + if sys.byteorder != 'big': + _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1] + nan, inf = struct.unpack('dd', _BYTES) + return nan, inf, -inf + +NaN, PosInf, NegInf = _floatconstants() + +_CONSTANTS = { + '-Infinity': NegInf, + 'Infinity': PosInf, + 'NaN': NaN, +} + +STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS) +BACKSLASH = { + '"': u('"'), '\\': u('\u005c'), '/': u('/'), + 'b': u('\b'), 'f': u('\f'), 'n': u('\n'), 'r': u('\r'), 't': u('\t'), +} + +DEFAULT_ENCODING = "utf-8" + +def py_scanstring(s, end, encoding=None, strict=True, + _b=BACKSLASH, _m=STRINGCHUNK.match, _join=u('').join, + _PY3=PY3, _maxunicode=sys.maxunicode): + """Scan the string s for a JSON string. End is the index of the + character in s after the quote that started the JSON string. + Unescapes all valid JSON string escape sequences and raises ValueError + on attempt to decode an invalid string. If strict is False then literal + control characters are allowed in the string. + + Returns a tuple of the decoded string and the index of the character in s + after the end quote.""" + if encoding is None: + encoding = DEFAULT_ENCODING + chunks = [] + _append = chunks.append + begin = end - 1 + while 1: + chunk = _m(s, end) + if chunk is None: + raise JSONDecodeError( + "Unterminated string starting at", s, begin) + end = chunk.end() + content, terminator = chunk.groups() + # Content is contains zero or more unescaped string characters + if content: + if not _PY3 and not isinstance(content, text_type): + content = text_type(content, encoding) + _append(content) + # Terminator is the end of string, a literal control character, + # or a backslash denoting that an escape sequence follows + if terminator == '"': + break + elif terminator != '\\': + if strict: + msg = "Invalid control character %r at" + raise JSONDecodeError(msg, s, end) + else: + _append(terminator) + continue + try: + esc = s[end] + except IndexError: + raise JSONDecodeError( + "Unterminated string starting at", s, begin) + # If not a unicode escape sequence, must be in the lookup table + if esc != 'u': + try: + char = _b[esc] + except KeyError: + msg = "Invalid \\X escape sequence %r" + raise JSONDecodeError(msg, s, end) + end += 1 + else: + # Unicode escape sequence + msg = "Invalid \\uXXXX escape sequence" + esc = s[end + 1:end + 5] + escX = esc[1:2] + if len(esc) != 4 or escX == 'x' or escX == 'X': + raise JSONDecodeError(msg, s, end - 1) + try: + uni = int(esc, 16) + except ValueError: + raise JSONDecodeError(msg, s, end - 1) + end += 5 + # Check for surrogate pair on UCS-4 systems + # Note that this will join high/low surrogate pairs + # but will also pass unpaired surrogates through + if (_maxunicode > 65535 and + uni & 0xfc00 == 0xd800 and + s[end:end + 2] == '\\u'): + esc2 = s[end + 2:end + 6] + escX = esc2[1:2] + if len(esc2) == 4 and not (escX == 'x' or escX == 'X'): + try: + uni2 = int(esc2, 16) + except ValueError: + raise JSONDecodeError(msg, s, end) + if uni2 & 0xfc00 == 0xdc00: + uni = 0x10000 + (((uni - 0xd800) << 10) | + (uni2 - 0xdc00)) + end += 6 + char = unichr(uni) + # Append the unescaped character + _append(char) + return _join(chunks), end + + +# Use speedup if available +scanstring = c_scanstring or py_scanstring + +WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS) +WHITESPACE_STR = ' \t\n\r' + +def JSONObject(state, encoding, strict, scan_once, object_hook, + object_pairs_hook, memo=None, + _w=WHITESPACE.match, _ws=WHITESPACE_STR): + (s, end) = state + # Backwards compatibility + if memo is None: + memo = {} + memo_get = memo.setdefault + pairs = [] + # Use a slice to prevent IndexError from being raised, the following + # check will raise a more specific ValueError if the string is empty + nextchar = s[end:end + 1] + # Normally we expect nextchar == '"' + if nextchar != '"': + if nextchar in _ws: + end = _w(s, end).end() + nextchar = s[end:end + 1] + # Trivial empty object + if nextchar == '}': + if object_pairs_hook is not None: + result = object_pairs_hook(pairs) + return result, end + 1 + pairs = {} + if object_hook is not None: + pairs = object_hook(pairs) + return pairs, end + 1 + elif nextchar != '"': + raise JSONDecodeError( + "Expecting property name enclosed in double quotes", + s, end) + end += 1 + while True: + key, end = scanstring(s, end, encoding, strict) + key = memo_get(key, key) + + # To skip some function call overhead we optimize the fast paths where + # the JSON key separator is ": " or just ":". + if s[end:end + 1] != ':': + end = _w(s, end).end() + if s[end:end + 1] != ':': + raise JSONDecodeError("Expecting ':' delimiter", s, end) + + end += 1 + + try: + if s[end] in _ws: + end += 1 + if s[end] in _ws: + end = _w(s, end + 1).end() + except IndexError: + pass + + value, end = scan_once(s, end) + pairs.append((key, value)) + + try: + nextchar = s[end] + if nextchar in _ws: + end = _w(s, end + 1).end() + nextchar = s[end] + except IndexError: + nextchar = '' + end += 1 + + if nextchar == '}': + break + elif nextchar != ',': + raise JSONDecodeError("Expecting ',' delimiter or '}'", s, end - 1) + + try: + nextchar = s[end] + if nextchar in _ws: + end += 1 + nextchar = s[end] + if nextchar in _ws: + end = _w(s, end + 1).end() + nextchar = s[end] + except IndexError: + nextchar = '' + + end += 1 + if nextchar != '"': + raise JSONDecodeError( + "Expecting property name enclosed in double quotes", + s, end - 1) + + if object_pairs_hook is not None: + result = object_pairs_hook(pairs) + return result, end + pairs = dict(pairs) + if object_hook is not None: + pairs = object_hook(pairs) + return pairs, end + +def JSONArray(state, scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR): + (s, end) = state + values = [] + nextchar = s[end:end + 1] + if nextchar in _ws: + end = _w(s, end + 1).end() + nextchar = s[end:end + 1] + # Look-ahead for trivial empty array + if nextchar == ']': + return values, end + 1 + elif nextchar == '': + raise JSONDecodeError("Expecting value or ']'", s, end) + _append = values.append + while True: + value, end = scan_once(s, end) + _append(value) + nextchar = s[end:end + 1] + if nextchar in _ws: + end = _w(s, end + 1).end() + nextchar = s[end:end + 1] + end += 1 + if nextchar == ']': + break + elif nextchar != ',': + raise JSONDecodeError("Expecting ',' delimiter or ']'", s, end - 1) + + try: + if s[end] in _ws: + end += 1 + if s[end] in _ws: + end = _w(s, end + 1).end() + except IndexError: + pass + + return values, end + +class JSONDecoder(object): + """Simple JSON decoder + + Performs the following translations in decoding by default: + + +---------------+-------------------+ + | JSON | Python | + +===============+===================+ + | object | dict | + +---------------+-------------------+ + | array | list | + +---------------+-------------------+ + | string | str, unicode | + +---------------+-------------------+ + | number (int) | int, long | + +---------------+-------------------+ + | number (real) | float | + +---------------+-------------------+ + | true | True | + +---------------+-------------------+ + | false | False | + +---------------+-------------------+ + | null | None | + +---------------+-------------------+ + + It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as + their corresponding ``float`` values, which is outside the JSON spec. + + """ + + def __init__(self, encoding=None, object_hook=None, parse_float=None, + parse_int=None, parse_constant=None, strict=True, + object_pairs_hook=None): + """ + *encoding* determines the encoding used to interpret any + :class:`str` objects decoded by this instance (``'utf-8'`` by + default). It has no effect when decoding :class:`unicode` objects. + + Note that currently only encodings that are a superset of ASCII work, + strings of other encodings should be passed in as :class:`unicode`. + + *object_hook*, if specified, will be called with the result of every + JSON object decoded and its return value will be used in place of the + given :class:`dict`. This can be used to provide custom + deserializations (e.g. to support JSON-RPC class hinting). + + *object_pairs_hook* is an optional function that will be called with + the result of any object literal decode with an ordered list of pairs. + The return value of *object_pairs_hook* will be used instead of the + :class:`dict`. This feature can be used to implement custom decoders + that rely on the order that the key and value pairs are decoded (for + example, :func:`collections.OrderedDict` will remember the order of + insertion). If *object_hook* is also defined, the *object_pairs_hook* + takes priority. + + *parse_float*, if specified, will be called with the string of every + JSON float to be decoded. By default, this is equivalent to + ``float(num_str)``. This can be used to use another datatype or parser + for JSON floats (e.g. :class:`decimal.Decimal`). + + *parse_int*, if specified, will be called with the string of every + JSON int to be decoded. By default, this is equivalent to + ``int(num_str)``. This can be used to use another datatype or parser + for JSON integers (e.g. :class:`float`). + + *parse_constant*, if specified, will be called with one of the + following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This + can be used to raise an exception if invalid JSON numbers are + encountered. + + *strict* controls the parser's behavior when it encounters an + invalid control character in a string. The default setting of + ``True`` means that unescaped control characters are parse errors, if + ``False`` then control characters will be allowed in strings. + + """ + if encoding is None: + encoding = DEFAULT_ENCODING + self.encoding = encoding + self.object_hook = object_hook + self.object_pairs_hook = object_pairs_hook + self.parse_float = parse_float or float + self.parse_int = parse_int or int + self.parse_constant = parse_constant or _CONSTANTS.__getitem__ + self.strict = strict + self.parse_object = JSONObject + self.parse_array = JSONArray + self.parse_string = scanstring + self.memo = {} + self.scan_once = make_scanner(self) + + def decode(self, s, _w=WHITESPACE.match, _PY3=PY3): + """Return the Python representation of ``s`` (a ``str`` or ``unicode`` + instance containing a JSON document) + + """ + if _PY3 and isinstance(s, binary_type): + s = s.decode(self.encoding) + obj, end = self.raw_decode(s) + end = _w(s, end).end() + if end != len(s): + raise JSONDecodeError("Extra data", s, end, len(s)) + return obj + + def raw_decode(self, s, idx=0, _w=WHITESPACE.match, _PY3=PY3): + """Decode a JSON document from ``s`` (a ``str`` or ``unicode`` + beginning with a JSON document) and return a 2-tuple of the Python + representation and the index in ``s`` where the document ended. + Optionally, ``idx`` can be used to specify an offset in ``s`` where + the JSON document begins. + + This can be used to decode a JSON document from a string that may + have extraneous data at the end. + + """ + if idx < 0: + # Ensure that raw_decode bails on negative indexes, the regex + # would otherwise mask this behavior. #98 + raise JSONDecodeError('Expecting value', s, idx) + if _PY3 and not isinstance(s, text_type): + raise TypeError("Input string must be text, not bytes") + return self.scan_once(s, idx=_w(s, idx).end()) diff --git a/pyload/lib/simplejson/encoder.py b/pyload/lib/simplejson/encoder.py new file mode 100644 index 000000000..db18244ec --- /dev/null +++ b/pyload/lib/simplejson/encoder.py @@ -0,0 +1,648 @@ +"""Implementation of JSONEncoder +""" +from __future__ import absolute_import +import re +from operator import itemgetter +from decimal import Decimal +from .compat import u, unichr, binary_type, string_types, integer_types, PY3 +def _import_speedups(): + try: + from . import _speedups + return _speedups.encode_basestring_ascii, _speedups.make_encoder + except ImportError: + return None, None +c_encode_basestring_ascii, c_make_encoder = _import_speedups() + +from simplejson.decoder import PosInf + +#ESCAPE = re.compile(ur'[\x00-\x1f\\"\b\f\n\r\t\u2028\u2029]') +# This is required because u() will mangle the string and ur'' isn't valid +# python3 syntax +ESCAPE = re.compile(u'[\\x00-\\x1f\\\\"\\b\\f\\n\\r\\t\u2028\u2029]') +ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') +HAS_UTF8 = re.compile(r'[\x80-\xff]') +ESCAPE_DCT = { + '\\': '\\\\', + '"': '\\"', + '\b': '\\b', + '\f': '\\f', + '\n': '\\n', + '\r': '\\r', + '\t': '\\t', +} +for i in range(0x20): + #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) + ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,)) +for i in [0x2028, 0x2029]: + ESCAPE_DCT.setdefault(unichr(i), '\\u%04x' % (i,)) + +FLOAT_REPR = repr + +def encode_basestring(s, _PY3=PY3, _q=u('"')): + """Return a JSON representation of a Python string + + """ + if _PY3: + if isinstance(s, binary_type): + s = s.decode('utf-8') + else: + if isinstance(s, str) and HAS_UTF8.search(s) is not None: + s = s.decode('utf-8') + def replace(match): + return ESCAPE_DCT[match.group(0)] + return _q + ESCAPE.sub(replace, s) + _q + + +def py_encode_basestring_ascii(s, _PY3=PY3): + """Return an ASCII-only JSON representation of a Python string + + """ + if _PY3: + if isinstance(s, binary_type): + s = s.decode('utf-8') + else: + if isinstance(s, str) and HAS_UTF8.search(s) is not None: + s = s.decode('utf-8') + def replace(match): + s = match.group(0) + try: + return ESCAPE_DCT[s] + except KeyError: + n = ord(s) + if n < 0x10000: + #return '\\u{0:04x}'.format(n) + return '\\u%04x' % (n,) + else: + # surrogate pair + n -= 0x10000 + s1 = 0xd800 | ((n >> 10) & 0x3ff) + s2 = 0xdc00 | (n & 0x3ff) + #return '\\u{0:04x}\\u{1:04x}'.format(s1, s2) + return '\\u%04x\\u%04x' % (s1, s2) + return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"' + + +encode_basestring_ascii = ( + c_encode_basestring_ascii or py_encode_basestring_ascii) + +class JSONEncoder(object): + """Extensible JSON encoder for Python data structures. + + Supports the following objects and types by default: + + +-------------------+---------------+ + | Python | JSON | + +===================+===============+ + | dict, namedtuple | object | + +-------------------+---------------+ + | list, tuple | array | + +-------------------+---------------+ + | str, unicode | string | + +-------------------+---------------+ + | int, long, float | number | + +-------------------+---------------+ + | True | true | + +-------------------+---------------+ + | False | false | + +-------------------+---------------+ + | None | null | + +-------------------+---------------+ + + To extend this to recognize other objects, subclass and implement a + ``.default()`` method with another method that returns a serializable + object for ``o`` if possible, otherwise it should call the superclass + implementation (to raise ``TypeError``). + + """ + item_separator = ', ' + key_separator = ': ' + + def __init__(self, skipkeys=False, ensure_ascii=True, + check_circular=True, allow_nan=True, sort_keys=False, + indent=None, separators=None, encoding='utf-8', default=None, + use_decimal=True, namedtuple_as_object=True, + tuple_as_array=True, bigint_as_string=False, + item_sort_key=None, for_json=False, ignore_nan=False, + int_as_string_bitcount=None): + """Constructor for JSONEncoder, with sensible defaults. + + If skipkeys is false, then it is a TypeError to attempt + encoding of keys that are not str, int, long, float or None. If + skipkeys is True, such items are simply skipped. + + If ensure_ascii is true, the output is guaranteed to be str + objects with all incoming unicode characters escaped. If + ensure_ascii is false, the output will be unicode object. + + If check_circular is true, then lists, dicts, and custom encoded + objects will be checked for circular references during encoding to + prevent an infinite recursion (which would cause an OverflowError). + Otherwise, no such check takes place. + + If allow_nan is true, then NaN, Infinity, and -Infinity will be + encoded as such. This behavior is not JSON specification compliant, + but is consistent with most JavaScript based encoders and decoders. + Otherwise, it will be a ValueError to encode such floats. + + If sort_keys is true, then the output of dictionaries will be + sorted by key; this is useful for regression tests to ensure + that JSON serializations can be compared on a day-to-day basis. + + If indent is a string, then JSON array elements and object members + will be pretty-printed with a newline followed by that string repeated + for each level of nesting. ``None`` (the default) selects the most compact + representation without any newlines. For backwards compatibility with + versions of simplejson earlier than 2.1.0, an integer is also accepted + and is converted to a string with that many spaces. + + If specified, separators should be an (item_separator, key_separator) + tuple. The default is (', ', ': ') if *indent* is ``None`` and + (',', ': ') otherwise. To get the most compact JSON representation, + you should specify (',', ':') to eliminate whitespace. + + If specified, default is a function that gets called for objects + that can't otherwise be serialized. It should return a JSON encodable + version of the object or raise a ``TypeError``. + + If encoding is not None, then all input strings will be + transformed into unicode using that encoding prior to JSON-encoding. + The default is UTF-8. + + If use_decimal is true (not the default), ``decimal.Decimal`` will + be supported directly by the encoder. For the inverse, decode JSON + with ``parse_float=decimal.Decimal``. + + If namedtuple_as_object is true (the default), objects with + ``_asdict()`` methods will be encoded as JSON objects. + + If tuple_as_array is true (the default), tuple (and subclasses) will + be encoded as JSON arrays. + + If bigint_as_string is true (not the default), ints 2**53 and higher + or lower than -2**53 will be encoded as strings. This is to avoid the + rounding that happens in Javascript otherwise. + + If int_as_string_bitcount is a positive number (n), then int of size + greater than or equal to 2**n or lower than or equal to -2**n will be + encoded as strings. + + If specified, item_sort_key is a callable used to sort the items in + each dictionary. This is useful if you want to sort items other than + in alphabetical order by key. + + If for_json is true (not the default), objects with a ``for_json()`` + method will use the return value of that method for encoding as JSON + instead of the object. + + If *ignore_nan* is true (default: ``False``), then out of range + :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized + as ``null`` in compliance with the ECMA-262 specification. If true, + this will override *allow_nan*. + + """ + + self.skipkeys = skipkeys + self.ensure_ascii = ensure_ascii + self.check_circular = check_circular + self.allow_nan = allow_nan + self.sort_keys = sort_keys + self.use_decimal = use_decimal + self.namedtuple_as_object = namedtuple_as_object + self.tuple_as_array = tuple_as_array + self.bigint_as_string = bigint_as_string + self.item_sort_key = item_sort_key + self.for_json = for_json + self.ignore_nan = ignore_nan + self.int_as_string_bitcount = int_as_string_bitcount + if indent is not None and not isinstance(indent, string_types): + indent = indent * ' ' + self.indent = indent + if separators is not None: + self.item_separator, self.key_separator = separators + elif indent is not None: + self.item_separator = ',' + if default is not None: + self.default = default + self.encoding = encoding + + def default(self, o): + """Implement this method in a subclass such that it returns + a serializable object for ``o``, or calls the base implementation + (to raise a ``TypeError``). + + For example, to support arbitrary iterators, you could + implement default like this:: + + def default(self, o): + try: + iterable = iter(o) + except TypeError: + pass + else: + return list(iterable) + return JSONEncoder.default(self, o) + + """ + raise TypeError(repr(o) + " is not JSON serializable") + + def encode(self, o): + """Return a JSON string representation of a Python data structure. + + >>> from simplejson import JSONEncoder + >>> JSONEncoder().encode({"foo": ["bar", "baz"]}) + '{"foo": ["bar", "baz"]}' + + """ + # This is for extremely simple cases and benchmarks. + if isinstance(o, binary_type): + _encoding = self.encoding + if (_encoding is not None and not (_encoding == 'utf-8')): + o = o.decode(_encoding) + if isinstance(o, string_types): + if self.ensure_ascii: + return encode_basestring_ascii(o) + else: + return encode_basestring(o) + # This doesn't pass the iterator directly to ''.join() because the + # exceptions aren't as detailed. The list call should be roughly + # equivalent to the PySequence_Fast that ''.join() would do. + chunks = self.iterencode(o, _one_shot=True) + if not isinstance(chunks, (list, tuple)): + chunks = list(chunks) + if self.ensure_ascii: + return ''.join(chunks) + else: + return u''.join(chunks) + + def iterencode(self, o, _one_shot=False): + """Encode the given object and yield each string + representation as available. + + For example:: + + for chunk in JSONEncoder().iterencode(bigobject): + mysocket.write(chunk) + + """ + if self.check_circular: + markers = {} + else: + markers = None + if self.ensure_ascii: + _encoder = encode_basestring_ascii + else: + _encoder = encode_basestring + if self.encoding != 'utf-8': + def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding): + if isinstance(o, binary_type): + o = o.decode(_encoding) + return _orig_encoder(o) + + def floatstr(o, allow_nan=self.allow_nan, ignore_nan=self.ignore_nan, + _repr=FLOAT_REPR, _inf=PosInf, _neginf=-PosInf): + # Check for specials. Note that this type of test is processor + # and/or platform-specific, so do tests which don't depend on + # the internals. + + if o != o: + text = 'NaN' + elif o == _inf: + text = 'Infinity' + elif o == _neginf: + text = '-Infinity' + else: + return _repr(o) + + if ignore_nan: + text = 'null' + elif not allow_nan: + raise ValueError( + "Out of range float values are not JSON compliant: " + + repr(o)) + + return text + + key_memo = {} + int_as_string_bitcount = ( + 53 if self.bigint_as_string else self.int_as_string_bitcount) + if (_one_shot and c_make_encoder is not None + and self.indent is None): + _iterencode = c_make_encoder( + markers, self.default, _encoder, self.indent, + self.key_separator, self.item_separator, self.sort_keys, + self.skipkeys, self.allow_nan, key_memo, self.use_decimal, + self.namedtuple_as_object, self.tuple_as_array, + int_as_string_bitcount, + self.item_sort_key, self.encoding, self.for_json, + self.ignore_nan, Decimal) + else: + _iterencode = _make_iterencode( + markers, self.default, _encoder, self.indent, floatstr, + self.key_separator, self.item_separator, self.sort_keys, + self.skipkeys, _one_shot, self.use_decimal, + self.namedtuple_as_object, self.tuple_as_array, + int_as_string_bitcount, + self.item_sort_key, self.encoding, self.for_json, + Decimal=Decimal) + try: + return _iterencode(o, 0) + finally: + key_memo.clear() + + +class JSONEncoderForHTML(JSONEncoder): + """An encoder that produces JSON safe to embed in HTML. + + To embed JSON content in, say, a script tag on a web page, the + characters &, < and > should be escaped. They cannot be escaped + with the usual entities (e.g. &) because they are not expanded + within ', response)[-1] + jseval = self.js.eval("document = { write: function(e) { return e; } }; %s" % jscode) + dlLink = re.search(r'http://linksave\.in/dl-\w+', jseval).group(0) + self.logDebug("JsEngine returns value [%s] for redirection link" % dlLink) + response = self.load(dlLink) + link = unescape(re.search(r'') + for pattern in patterns: + rexpr = re.compile(pattern, re.DOTALL) + content = re.sub(rexpr, "", content) + return content + + def isOnline(self): + if "Your folder does not exist" in self.cleanedHtml: + self.logDebug("File not m") + return False + return True + + def isProtected(self): + form = re.search(r'(.*?)', self.cleanedHtml, re.DOTALL) + if form is not None: + content = form.group(1) + for keyword in ("password", "captcha"): + if keyword in content: + self.protection_type = keyword + self.logDebug("Links are %s protected" % self.protection_type) + return True + return False + + def getPackageInfo(self): + m = re.search(self.NAME_PATTERN, self.html) + if m: + name = folder = m.group('N').strip() + self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) + else: + name = self.package.name + folder = self.package.folder + self.logDebug("Package info not m, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) + return name, folder + + def unlockProtection(self): + + postData = {} + + form = re.search(r'
        ', self.cleanedHtml, re.DOTALL).group(1) + + # Submit package password + if "password" in form: + password = self.getPassword() + self.logDebug("Submitting password [%s] for protected links" % password) + postData['password'] = password + + # Resolve anicaptcha + if "anicaptcha" in form: + self.logDebug("Captcha protected") + captchaUri = re.search(r'src="(/temp/anicaptcha/[^"]+)', form).group(1) + captcha = self.decryptCaptcha("http://ncrypt.in" + captchaUri) + self.logDebug("Captcha resolved [%s]" % captcha) + postData['captcha'] = captcha + + # Resolve recaptcha + if "recaptcha" in form: + self.logDebug("ReCaptcha protected") + captcha_key = re.search(r'\?k=(.*?)"', form).group(1) + self.logDebug("Resolving ReCaptcha with key [%s]" % captcha_key) + recaptcha = ReCaptcha(self) + challenge, code = recaptcha.challenge(captcha_key) + postData['recaptcha_challenge_field'] = challenge + postData['recaptcha_response_field'] = code + + # Resolve circlecaptcha + if "circlecaptcha" in form: + self.logDebug("CircleCaptcha protected") + captcha_img_url = "http://ncrypt.in/classes/captcha/circlecaptcha.php" + coords = self.decryptCaptcha(captcha_img_url, forceUser=True, imgtype="png", result_type='positional') + self.logDebug("Captcha resolved, coords [%s]" % str(coords)) + postData['circle.x'] = coords[0] + postData['circle.y'] = coords[1] + + # Unlock protection + postData['submit_protected'] = 'Continue to folder' + return self.load(self.pyfile.url, post=postData, decode=True) + + def handleErrors(self): + if self.protection_type == "password": + if "This password is invalid!" in self.cleanedHtml: + self.logDebug("Incorrect password, please set right password on 'Edit package' form and retry") + self.fail("Incorrect password, please set right password on 'Edit package' form and retry") + + if self.protection_type == "captcha": + if "The securitycheck was wrong!" in self.cleanedHtml: + self.logDebug("Invalid captcha, retrying") + self.invalidCaptcha() + self.retry() + else: + self.correctCaptcha() + + def handleLinkSource(self, link_source_type): + # Check for JS engine + require_js_engine = link_source_type in ("cnl2", "rsdf", "ccf", "dlc") + if require_js_engine and not self.js: + self.logDebug("No JS engine available, skip %s links" % link_source_type) + return [] + + # Select suitable handler + if link_source_type == 'single': + return self.handleSingleLink() + if link_source_type == 'cnl2': + return self.handleCNL2() + elif link_source_type in ("rsdf", "ccf", "dlc"): + return self.handleContainer(link_source_type) + elif link_source_type == "web": + return self.handleWebLinks() + else: + self.fail('unknown source type "%s" (this is probably a bug)' % link_source_type) + + def handleSingleLink(self): + + self.logDebug("Handling Single link") + package_links = [] + + # Decrypt single link + decrypted_link = self.decryptLink(self.pyfile.url) + if decrypted_link: + package_links.append(decrypted_link) + + return package_links + + def handleCNL2(self): + + self.logDebug("Handling CNL2 links") + package_links = [] + + if 'cnl2_output' in self.cleanedHtml: + try: + (vcrypted, vjk) = self._getCipherParams() + for (crypted, jk) in zip(vcrypted, vjk): + package_links.extend(self._getLinks(crypted, jk)) + except: + self.fail("Unable to decrypt CNL2 links") + + return package_links + + def handleContainers(self): + + self.logDebug("Handling Container links") + package_links = [] + + pattern = r"/container/(rsdf|dlc|ccf)/([a-z0-9]+)" + containersLinks = re.findall(pattern, self.html) + self.logDebug("Decrypting %d Container links" % len(containersLinks)) + for containerLink in containersLinks: + link = "http://ncrypt.in/container/%s/%s.%s" % (containerLink[0], containerLink[1], containerLink[0]) + package_links.append(link) + + return package_links + + def handleWebLinks(self): + + self.logDebug("Handling Web links") + pattern = r"(http://ncrypt\.in/link-.*?=)" + links = re.findall(pattern, self.html) + + package_links = [] + self.logDebug("Decrypting %d Web links" % len(links)) + for i, link in enumerate(links): + self.logDebug("Decrypting Web link %d, %s" % (i + 1, link)) + decrypted_link = self.decrypt(link) + if decrypted_link: + package_links.append(decrypted_link) + + return package_links + + def decryptLink(self, link): + try: + url = link.replace("link-", "frame-") + link = self.load(url, just_header=True)['location'] + return link + except Exception, detail: + self.logDebug("Error decrypting link %s, %s" % (link, detail)) + + def _getCipherParams(self): + + pattern = r'\w+)/\w+|folder.php\?folder_id=(?P\w+))' + + __description__ = """NetFolder.in decrypter plugin""" + __author_name__ = ("RaNaN", "fragonib") + __author_mail__ = ("RaNaN@pyload.org", "fragonib[AT]yahoo[DOT]es") + + TITLE_PATTERN = r'

        Inhalt des Ordners (?P.+)</span></div>' + + + def decrypt(self, pyfile): + # Request package + self.html = self.load(pyfile.url) + + # Check for password protection + if self.isPasswordProtected(): + self.html = self.submitPassword() + if not self.html: + self.fail("Incorrect password, please set right password on Add package form and retry") + + # Get package name and folder + (package_name, folder_name) = self.getPackageNameAndFolder() + + # Get package links + package_links = self.getLinks() + + # Set package + self.packages = [(package_name, package_links, folder_name)] + + def isPasswordProtected(self): + if '<input type="password" name="password"' in self.html: + self.logDebug("Links are password protected") + return True + return False + + def submitPassword(self): + # Gather data + try: + m = re.match(self.__pattern__, self.pyfile.url) + id = max(m.group('id1'), m.group('id2')) + except AttributeError: + self.logDebug("Unable to get package id from url [%s]" % self.pyfile.url) + return + url = "http://netfolder.in/folder.php?folder_id=" + id + password = self.getPassword() + + # Submit package password + post = {'password': password, 'save': 'Absenden'} + self.logDebug("Submitting password [%s] for protected links with id [%s]" % (password, id)) + html = self.load(url, {}, post) + + # Check for invalid password + if '<div class="InPage_Error">' in html: + self.logDebug("Incorrect password, please set right password on Edit package form and retry") + return None + + return html + + def getLinks(self): + links = re.search(r'name="list" value="(.*?)"', self.html).group(1).split(",") + self.logDebug("Package has %d links" % len(links)) + return links diff --git a/pyload/plugins/crypter/NosvideoCom.py b/pyload/plugins/crypter/NosvideoCom.py new file mode 100644 index 000000000..e1c9e2c55 --- /dev/null +++ b/pyload/plugins/crypter/NosvideoCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter + + +class NosvideoCom(SimpleCrypter): + __name__ = "NosvideoCom" + __type__ = "crypter" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?nosvideo\.com/\?v=\w+' + + __description__ = """Nosvideo.com decrypter plugin""" + __author_name__ = "igel" + __author_mail__ = "igelkun@myopera.com" + + LINK_PATTERN = r'href="(http://(?:w{3}\.)?nosupload.com/\?d=\w+)"' + TITLE_PATTERN = r'<[tT]itle>Watch (?P<title>.+)</[tT]itle>' diff --git a/pyload/plugins/crypter/OneKhDe.py b/pyload/plugins/crypter/OneKhDe.py new file mode 100644 index 000000000..320eaf6c6 --- /dev/null +++ b/pyload/plugins/crypter/OneKhDe.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.unescape import unescape +from pyload.plugins.Crypter import Crypter + + +class OneKhDe(Crypter): + __name__ = "OneKhDe" + __type__ = "crypter" + __version__ = "0.1" + + __pattern__ = r'http://(?:www\.)?1kh.de/f/' + + __description__ = """1kh.de decrypter plugin""" + __author_name__ = "spoob" + __author_mail__ = "spoob@pyload.org" + + + def __init__(self, parent): + Crypter.__init__(self, parent) + self.parent = parent + self.html = None + + def file_exists(self): + """ returns True or False + """ + return True + + def proceed(self, url, location): + url = self.parent.url + self.html = self.req.load(url) + link_ids = re.findall(r"<a id=\"DownloadLink_(\d*)\" href=\"http://1kh.de/", self.html) + for id in link_ids: + new_link = unescape( + re.search("width=\"100%\" src=\"(.*)\"></iframe>", self.req.load("http://1kh.de/l/" + id)).group(1)) + self.urls.append(new_link) diff --git a/pyload/plugins/crypter/OronComFolder.py b/pyload/plugins/crypter/OronComFolder.py new file mode 100644 index 000000000..9b5fb3959 --- /dev/null +++ b/pyload/plugins/crypter/OronComFolder.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadCrypter import DeadCrypter + + +class OronComFolder(DeadCrypter): + __name__ = "OronComFolder" + __type__ = "crypter" + __version__ = "0.11" + + __pattern__ = r'http://(?:www\.)?oron.com/folder/\w+' + + __description__ = """Oron.com folder decrypter plugin""" + __author_name__ = "DHMH" + __author_mail__ = "webmaster@pcProfil.de" diff --git a/pyload/plugins/crypter/PastebinCom.py b/pyload/plugins/crypter/PastebinCom.py new file mode 100644 index 000000000..8e394ac3a --- /dev/null +++ b/pyload/plugins/crypter/PastebinCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter + + +class PastebinCom(SimpleCrypter): + __name__ = "PastebinCom" + __type__ = "crypter" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?pastebin\.com/\w+' + + __description__ = """Pastebin.com decrypter plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + LINK_PATTERN = r'<div class="de\d+">(https?://[^ <]+)(?:[^<]*)</div>' + TITLE_PATTERN = r'<div class="paste_box_line1" title="(?P<title>[^"]+)">' diff --git a/pyload/plugins/crypter/QuickshareCzFolder.py b/pyload/plugins/crypter/QuickshareCzFolder.py new file mode 100644 index 000000000..5d99cbffd --- /dev/null +++ b/pyload/plugins/crypter/QuickshareCzFolder.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +import re +from pyload.plugins.Crypter import Crypter + + +class QuickshareCzFolder(Crypter): + __name__ = "QuickshareCzFolder" + __type__ = "crypter" + __version__ = "0.1" + + __pattern__ = r'http://(?:www\.)?quickshare.cz/slozka-\d+.*' + + __description__ = """Quickshare.cz folder decrypter plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FOLDER_PATTERN = r'<textarea[^>]*>(.*?)</textarea>' + LINK_PATTERN = r'(http://www.quickshare.cz/\S+)' + + + def decrypt(self, pyfile): + html = self.load(pyfile.url) + + m = re.search(self.FOLDER_PATTERN, html, re.DOTALL) + if m is None: + self.fail("Parse error (FOLDER)") + self.urls.extend(re.findall(self.LINK_PATTERN, m.group(1))) + + if not self.urls: + self.fail('Could not extract any links') diff --git a/pyload/plugins/crypter/RSLayerCom.py b/pyload/plugins/crypter/RSLayerCom.py new file mode 100644 index 000000000..ded550a50 --- /dev/null +++ b/pyload/plugins/crypter/RSLayerCom.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadCrypter import DeadCrypter + + +class RSLayerCom(DeadCrypter): + __name__ = "RSLayerCom" + __type__ = "crypter" + __version__ = "0.21" + + __pattern__ = r'http://(?:www\.)?rs-layer.com/directory-' + + __description__ = """RS-Layer.com decrypter plugin""" + __author_name__ = "hzpz" + __author_mail__ = None diff --git a/pyload/plugins/crypter/RelinkUs.py b/pyload/plugins/crypter/RelinkUs.py new file mode 100644 index 000000000..74228d41a --- /dev/null +++ b/pyload/plugins/crypter/RelinkUs.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- + +import base64 +import binascii +import re +import os + +from Crypto.Cipher import AES +from pyload.plugins.Crypter import Crypter + + +class RelinkUs(Crypter): + __name__ = "RelinkUs" + __type__ = "crypter" + __version__ = "3.0" + + __pattern__ = r'http://(?:www\.)?relink.us/(f/|((view|go).php\?id=))(?P<id>.+)' + + __description__ = """Relink.us decrypter plugin""" + __author_name__ = "fragonib" + __author_mail__ = "fragonib[AT]yahoo[DOT]es" + + # Constants + PREFERRED_LINK_SOURCES = ["cnl2", "dlc", "web"] + + OFFLINE_TOKEN = r'<title>Tattooside' + PASSWORD_TOKEN = r'container_password\.php' + PASSWORD_ERROR_ROKEN = r'You have entered an incorrect password' + PASSWORD_SUBMIT_URL = r'http://www\.relink\.us/container_password\.php' + CAPTCHA_TOKEN = r'container_captcha\.php' + CAPTCHA_ERROR_ROKEN = r'You have solved the captcha wrong' + CAPTCHA_IMG_URL = r'http://www\.relink\.us/core/captcha/circlecaptcha\.php' + CAPTCHA_SUBMIT_URL = r'http://www\.relink\.us/container_captcha\.php' + FILE_TITLE_REGEX = r'<th>Title</th><td><i>(.*)</i></td></tr>' + FILE_NOTITLE = r'No title' + + CNL2_FORM_REGEX = r'<form id="cnl_form-(.*?)</form>' + CNL2_FORMINPUT_REGEX = r'<input.*?name="%s".*?value="(.*?)"' + CNL2_JK_KEY = "jk" + CNL2_CRYPTED_KEY = "crypted" + DLC_LINK_REGEX = r'<a href=".*?" class="dlc_button" target="_blank">' + DLC_DOWNLOAD_URL = r'http://www\.relink\.us/download\.php' + WEB_FORWARD_REGEX = r"getFile\('(?P<link>.+)'\)" + WEB_FORWARD_URL = r'http://www\.relink\.us/frame\.php' + WEB_LINK_REGEX = r'<iframe name="Container" height="100%" frameborder="no" width="100%" src="(?P<link>.+)"></iframe>' + + + def setup(self): + self.fileid = None + self.package = None + self.password = None + self.html = None + self.captcha = False + + def decrypt(self, pyfile): + # Init + self.initPackage(pyfile) + + # Request package + self.requestPackage() + + # Check for online + if not self.isOnline(): + self.offline() + + # Check for protection + if self.isPasswordProtected(): + self.unlockPasswordProtection() + self.handleErrors() + + if self.isCaptchaProtected(): + self.captcha = True + self.unlockCaptchaProtection() + self.handleErrors() + + # Get package name and folder + (package_name, folder_name) = self.getPackageInfo() + + # Extract package links + package_links = [] + for sources in self.PREFERRED_LINK_SOURCES: + package_links.extend(self.handleLinkSource(sources)) + if package_links: # use only first source which provides links + break + package_links = set(package_links) + + # Pack + if package_links: + self.packages = [(package_name, package_links, folder_name)] + else: + self.fail('Could not extract any links') + + def initPackage(self, pyfile): + self.fileid = re.match(self.__pattern__, pyfile.url).group('id') + self.package = pyfile.package() + self.password = self.getPassword() + + def requestPackage(self): + self.html = self.load(self.pyfile.url, decode=True) + + def isOnline(self): + if self.OFFLINE_TOKEN in self.html: + self.logDebug("File not found") + return False + return True + + def isPasswordProtected(self): + if self.PASSWORD_TOKEN in self.html: + self.logDebug("Links are password protected") + return True + + def isCaptchaProtected(self): + if self.CAPTCHA_TOKEN in self.html: + self.logDebug("Links are captcha protected") + return True + return False + + def unlockPasswordProtection(self): + self.logDebug("Submitting password [%s] for protected links" % self.password) + passwd_url = self.PASSWORD_SUBMIT_URL + "?id=%s" % self.fileid + passwd_data = {'id': self.fileid, 'password': self.password, 'pw': 'submit'} + self.html = self.load(passwd_url, post=passwd_data, decode=True) + + def unlockCaptchaProtection(self): + self.logDebug("Request user positional captcha resolving") + captcha_img_url = self.CAPTCHA_IMG_URL + "?id=%s" % self.fileid + coords = self.decryptCaptcha(captcha_img_url, forceUser=True, imgtype="png", result_type='positional') + self.logDebug("Captcha resolved, coords [%s]" % str(coords)) + captcha_post_url = self.CAPTCHA_SUBMIT_URL + "?id=%s" % self.fileid + captcha_post_data = {'button.x': coords[0], 'button.y': coords[1], 'captcha': 'submit'} + self.html = self.load(captcha_post_url, post=captcha_post_data, decode=True) + + def getPackageInfo(self): + name = folder = None + + # Try to get info from web + m = re.search(self.FILE_TITLE_REGEX, self.html) + if m is not None: + title = m.group(1).strip() + if not self.FILE_NOTITLE in title: + name = folder = title + self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) + + # Fallback to defaults + if not name or not folder: + name = self.package.name + folder = self.package.folder + self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) + + # Return package info + return name, folder + + def handleErrors(self): + if self.PASSWORD_ERROR_ROKEN in self.html: + msg = "Incorrect password, please set right password on 'Edit package' form and retry" + self.logDebug(msg) + self.fail(msg) + + if self.captcha: + if self.CAPTCHA_ERROR_ROKEN in self.html: + self.logDebug("Invalid captcha, retrying") + self.invalidCaptcha() + self.retry() + else: + self.correctCaptcha() + + def handleLinkSource(self, source): + if source == 'cnl2': + return self.handleCNL2Links() + elif source == 'dlc': + return self.handleDLCLinks() + elif source == 'web': + return self.handleWEBLinks() + else: + self.fail('Unknown source [%s] (this is probably a bug)' % source) + + def handleCNL2Links(self): + self.logDebug("Search for CNL2 links") + package_links = [] + m = re.search(self.CNL2_FORM_REGEX, self.html, re.DOTALL) + if m is not None: + cnl2_form = m.group(1) + try: + (vcrypted, vjk) = self._getCipherParams(cnl2_form) + for (crypted, jk) in zip(vcrypted, vjk): + package_links.extend(self._getLinks(crypted, jk)) + except: + self.logDebug("Unable to decrypt CNL2 links") + return package_links + + def handleDLCLinks(self): + self.logDebug('Search for DLC links') + package_links = [] + m = re.search(self.DLC_LINK_REGEX, self.html) + if m is not None: + container_url = self.DLC_DOWNLOAD_URL + "?id=%s&dlc=1" % self.fileid + self.logDebug("Downloading DLC container link [%s]" % container_url) + try: + dlc = self.load(container_url) + dlc_filename = self.fileid + ".dlc" + dlc_filepath = os.path.join(self.config['general']['download_folder'], dlc_filename) + f = open(dlc_filepath, "wb") + f.write(dlc) + f.close() + package_links.append(dlc_filepath) + except: + self.logDebug("Unable to download DLC container") + return package_links + + def handleWEBLinks(self): + self.logDebug("Search for WEB links") + package_links = [] + fw_params = re.findall(self.WEB_FORWARD_REGEX, self.html) + self.logDebug("Decrypting %d Web links" % len(fw_params)) + for index, fw_param in enumerate(fw_params): + try: + fw_url = self.WEB_FORWARD_URL + "?%s" % fw_param + self.logDebug("Decrypting Web link %d, %s" % (index + 1, fw_url)) + fw_response = self.load(fw_url, decode=True) + dl_link = re.search(self.WEB_LINK_REGEX, fw_response).group('link') + package_links.append(dl_link) + except Exception, detail: + self.logDebug("Error decrypting Web link %s, %s" % (index, detail)) + self.setWait(4) + self.wait() + return package_links + + def _getCipherParams(self, cnl2_form): + # Get jk + jk_re = self.CNL2_FORMINPUT_REGEX % self.CNL2_JK_KEY + vjk = re.findall(jk_re, cnl2_form, re.IGNORECASE) + + # Get crypted + crypted_re = self.CNL2_FORMINPUT_REGEX % RelinkUs.CNL2_CRYPTED_KEY + vcrypted = re.findall(crypted_re, cnl2_form, re.IGNORECASE) + + # Log and return + self.logDebug("Detected %d crypted blocks" % len(vcrypted)) + return vcrypted, vjk + + def _getLinks(self, crypted, jk): + # Get key + jreturn = self.js.eval("%s f()" % jk) + self.logDebug("JsEngine returns value [%s]" % jreturn) + key = binascii.unhexlify(jreturn) + + # Decode crypted + crypted = base64.standard_b64decode(crypted) + + # Decrypt + Key = key + IV = key + obj = AES.new(Key, AES.MODE_CBC, IV) + text = obj.decrypt(crypted) + + # Extract links + text = text.replace("\x00", "").replace("\r", "") + links = text.split("\n") + links = filter(lambda x: x != "", links) + + # Log and return + self.logDebug("Package has %d links" % len(links)) + return links diff --git a/pyload/plugins/crypter/SafelinkingNet.py b/pyload/plugins/crypter/SafelinkingNet.py new file mode 100644 index 000000000..62dcc6021 --- /dev/null +++ b/pyload/plugins/crypter/SafelinkingNet.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- + +import re + +from pycurl import FOLLOWLOCATION + +from pyload.lib.BeautifulSoup import BeautifulSoup + +from pyload.common.json_layer import json_loads +from pyload.plugins.Crypter import Crypter +from pyload.plugins.internal.CaptchaService import SolveMedia + + +class SafelinkingNet(Crypter): + __name__ = "SafelinkingNet" + __type__ = "crypter" + __version__ = "0.1" + + __pattern__ = r'https?://(?:www\.)?safelinking.net/([pd])/\w+' + + __description__ = """Safelinking.net decrypter plugin""" + __author_name__ = "quareevo" + __author_mail__ = "quareevo@arcor.de" + + SOLVEMEDIA_PATTERN = "solvemediaApiKey = '([\w\.\-_]+)';" + + + def decrypt(self, pyfile): + url = pyfile.url + if re.match(self.__pattern__, url).group(1) == "d": + self.req.http.c.setopt(FOLLOWLOCATION, 0) + self.load(url) + m = re.search("^Location: (.+)$", self.req.http.header, re.MULTILINE) + if m: + self.urls = [m.group(1)] + else: + self.fail("Couldn't find forwarded Link") + + else: + password = "" + postData = {"post-protect": "1"} + + self.html = self.load(url) + + if "link-password" in self.html: + password = pyfile.package().password + postData['link-password'] = password + + if "altcaptcha" in self.html: + for _ in xrange(5): + m = re.search(self.SOLVEMEDIA_PATTERN, self.html) + if m: + captchaKey = m.group(1) + captcha = SolveMedia(self) + captchaProvider = "Solvemedia" + else: + self.fail("Error parsing captcha") + + challenge, response = captcha.challenge(captchaKey) + postData['adcopy_challenge'] = challenge + postData['adcopy_response'] = response + + self.html = self.load(url, post=postData) + if "The password you entered was incorrect" in self.html: + self.fail("Incorrect Password") + if not "The CAPTCHA code you entered was wrong" in self.html: + break + + pyfile.package().password = "" + soup = BeautifulSoup(self.html) + scripts = soup.findAll("script") + for s in scripts: + if "d_links" in s.text: + break + m = re.search('d_links":(\[.*?\])', s.text) + if m: + linkDict = json_loads(m.group(1)) + for link in linkDict: + if not "http://" in link['full']: + self.urls.append("https://safelinking.net/d/" + link['full']) + else: + self.urls.append(link['full']) diff --git a/pyload/plugins/crypter/SecuredIn.py b/pyload/plugins/crypter/SecuredIn.py new file mode 100644 index 000000000..fc2667586 --- /dev/null +++ b/pyload/plugins/crypter/SecuredIn.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadCrypter import DeadCrypter + + +class SecuredIn(DeadCrypter): + __name__ = "SecuredIn" + __type__ = "crypter" + __version__ = "0.21" + + __pattern__ = r'http://(?:www\.)?secured\.in/download-[\d]+-[\w]{8}\.html' + + __description__ = """Secured.in decrypter plugin""" + __author_name__ = "mkaay" + __author_mail__ = "mkaay@mkaay.de" diff --git a/pyload/plugins/crypter/SerienjunkiesOrg.py b/pyload/plugins/crypter/SerienjunkiesOrg.py new file mode 100644 index 000000000..c7f7b1892 --- /dev/null +++ b/pyload/plugins/crypter/SerienjunkiesOrg.py @@ -0,0 +1,324 @@ +# -*- coding: utf-8 -*- + +import random +import re + +from time import sleep + +from pyload.lib.BeautifulSoup import BeautifulSoup + +from pyload.plugins.Crypter import Crypter +from pyload.unescape import unescape + + +class SerienjunkiesOrg(Crypter): + __name__ = "SerienjunkiesOrg" + __type__ = "crypter" + __version__ = "0.39" + + __pattern__ = r'http://(?:www\.)?(serienjunkies.org|dokujunkies.org)/.*?' + __config__ = [("changeNameSJ", "Packagename;Show;Season;Format;Episode", "Take SJ.org name", "Show"), + ("changeNameDJ", "Packagename;Show;Format;Episode", "Take DJ.org name", "Show"), + ("randomPreferred", "bool", "Randomize Preferred-List", False), + ("hosterListMode", "OnlyOne;OnlyPreferred(One);OnlyPreferred(All);All", + "Use for hosters (if supported)", "All"), + ("hosterList", "str", "Preferred Hoster list (comma separated)", + "RapidshareCom,UploadedTo,NetloadIn,FilefactoryCom,FreakshareNet,FilebaseTo,HotfileCom,DepositfilesCom,EasyshareCom,KickloadCom"), + ("ignoreList", "str", "Ignored Hoster list (comma separated)", "MegauploadCom")] + + __description__ = """Serienjunkies.org decrypter plugin""" + __author_name__ = ("mkaay", "godofdream") + __author_mail__ = ("mkaay@mkaay.de", "soilfiction@gmail.com") + + + def setup(self): + self.multiDL = False + + def getSJSrc(self, url): + src = self.req.load(str(url)) + if "This website is not available in your country" in src: + self.fail("Not available in your country") + if not src.find("Enter Serienjunkies") == -1: + sleep(1) + src = self.req.load(str(url)) + return src + + def handleShow(self, url): + src = self.getSJSrc(url) + soup = BeautifulSoup(src) + packageName = self.pyfile.package().name + if self.getConfig("changeNameSJ") == "Show": + found = unescape(soup.find("h2").find("a").string.split(' –')[0]) + if found: + packageName = found + + nav = soup.find("div", attrs={"id": "scb"}) + + package_links = [] + for a in nav.findAll("a"): + if self.getConfig("changeNameSJ") == "Show": + package_links.append(a['href']) + else: + package_links.append(a['href'] + "#hasName") + if self.getConfig("changeNameSJ") == "Show": + self.packages.append((packageName, package_links, packageName)) + else: + self.core.files.addLinks(package_links, self.pyfile.package().id) + + def handleSeason(self, url): + src = self.getSJSrc(url) + soup = BeautifulSoup(src) + post = soup.find("div", attrs={"class": "post-content"}) + ps = post.findAll("p") + + seasonName = unescape(soup.find("a", attrs={"rel": "bookmark"}).string).replace("–", "-") + groups = {} + gid = -1 + for p in ps: + if re.search("<strong>Sprache|<strong>Format", str(p)): + var = p.findAll("strong") + opts = {"Sprache": "", "Format": ""} + for v in var: + n = unescape(v.string).strip() + n = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', n) + if n.strip() not in opts: + continue + val = v.nextSibling + if not val: + continue + val = val.replace("|", "").strip() + val = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', val) + opts[n.strip()] = val.strip() + gid += 1 + groups[gid] = {} + groups[gid]['ep'] = {} + groups[gid]['opts'] = opts + elif re.search("<strong>Download:", str(p)): + parts = str(p).split("<br />") + if re.search("<strong>", parts[0]): + ename = re.search('<strong>(.*?)</strong>', parts[0]).group(1).strip().decode("utf-8").replace( + "–", "-") + groups[gid]['ep'][ename] = {} + parts.remove(parts[0]) + for part in parts: + hostername = re.search(r" \| ([-a-zA-Z0-9]+\.\w+)", part) + if hostername: + hostername = hostername.group(1) + groups[gid]['ep'][ename][hostername] = [] + links = re.findall('href="(.*?)"', part) + for link in links: + groups[gid]['ep'][ename][hostername].append(link + "#hasName") + + links = [] + for g in groups.values(): + for ename in g['ep']: + links.extend(self.getpreferred(g['ep'][ename])) + if self.getConfig("changeNameSJ") == "Episode": + self.packages.append((ename, links, ename)) + links = [] + package = "%s (%s, %s)" % (seasonName, g['opts']['Format'], g['opts']['Sprache']) + if self.getConfig("changeNameSJ") == "Format": + self.packages.append((package, links, package)) + links = [] + if (self.getConfig("changeNameSJ") == "Packagename") or re.search("#hasName", url): + self.core.files.addLinks(links, self.pyfile.package().id) + elif (self.getConfig("changeNameSJ") == "Season") or not re.search("#hasName", url): + self.packages.append((seasonName, links, seasonName)) + + def handleEpisode(self, url): + src = self.getSJSrc(url) + if not src.find( + "Du hast das Download-Limit überschritten! Bitte versuche es später nocheinmal.") == -1: + self.fail(_("Downloadlimit reached")) + else: + soup = BeautifulSoup(src) + form = soup.find("form") + h1 = soup.find("h1") + + if h1.get("class") == "wrap": + captchaTag = soup.find(attrs={"src": re.compile("^/secure/")}) + if not captchaTag: + sleep(5) + self.retry() + + captchaUrl = "http://download.serienjunkies.org" + captchaTag['src'] + result = self.decryptCaptcha(str(captchaUrl), imgtype="png") + sinp = form.find(attrs={"name": "s"}) + + self.req.lastURL = str(url) + sj = self.load(str(url), post={'s': sinp['value'], 'c': result, 'action': "Download"}) + + soup = BeautifulSoup(sj) + rawLinks = soup.findAll(attrs={"action": re.compile("^http://download.serienjunkies.org/")}) + + if not len(rawLinks) > 0: + sleep(1) + self.retry() + return + + self.correctCaptcha() + + links = [] + for link in rawLinks: + frameUrl = link['action'].replace("/go-", "/frame/go-") + links.append(self.handleFrame(frameUrl)) + if re.search("#hasName", url) or ((self.getConfig("changeNameSJ") == "Packagename") and + (self.getConfig("changeNameDJ") == "Packagename")): + self.core.files.addLinks(links, self.pyfile.package().id) + else: + if h1.text[2] == "_": + eName = h1.text[3:] + else: + eName = h1.text + self.packages.append((eName, links, eName)) + + def handleOldStyleLink(self, url): + sj = self.req.load(str(url)) + soup = BeautifulSoup(sj) + form = soup.find("form", attrs={"action": re.compile("^http://serienjunkies.org")}) + captchaTag = form.find(attrs={"src": re.compile("^/safe/secure/")}) + captchaUrl = "http://serienjunkies.org" + captchaTag['src'] + result = self.decryptCaptcha(str(captchaUrl)) + url = form['action'] + sinp = form.find(attrs={"name": "s"}) + + self.req.load(str(url), post={'s': sinp['value'], 'c': result, 'dl.start': "Download"}, cookies=False, + just_header=True) + decrypted = self.req.lastEffectiveURL + if decrypted == str(url): + self.retry() + self.core.files.addLinks([decrypted], self.pyfile.package().id) + + def handleFrame(self, url): + self.req.load(str(url)) + return self.req.lastEffectiveURL + + def handleShowDJ(self, url): + src = self.getSJSrc(url) + soup = BeautifulSoup(src) + post = soup.find("div", attrs={"id": "page_post"}) + ps = post.findAll("p") + found = unescape(soup.find("h2").find("a").string.split(' –')[0]) + if found: + seasonName = found + + groups = {} + gid = -1 + for p in ps: + if re.search("<strong>Sprache|<strong>Format", str(p)): + var = p.findAll("strong") + opts = {"Sprache": "", "Format": ""} + for v in var: + n = unescape(v.string).strip() + n = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', n) + if n.strip() not in opts: + continue + val = v.nextSibling + if not val: + continue + val = val.replace("|", "").strip() + val = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', val) + opts[n.strip()] = val.strip() + gid += 1 + groups[gid] = {} + groups[gid]['ep'] = {} + groups[gid]['opts'] = opts + elif re.search("<strong>Download:", str(p)): + parts = str(p).split("<br />") + if re.search("<strong>", parts[0]): + ename = re.search('<strong>(.*?)</strong>', parts[0]).group(1).strip().decode("utf-8").replace( + "–", "-") + groups[gid]['ep'][ename] = {} + parts.remove(parts[0]) + for part in parts: + hostername = re.search(r" \| ([-a-zA-Z0-9]+\.\w+)", part) + if hostername: + hostername = hostername.group(1) + groups[gid]['ep'][ename][hostername] = [] + links = re.findall('href="(.*?)"', part) + for link in links: + groups[gid]['ep'][ename][hostername].append(link + "#hasName") + + links = [] + for g in groups.values(): + for ename in g['ep']: + links.extend(self.getpreferred(g['ep'][ename])) + if self.getConfig("changeNameDJ") == "Episode": + self.packages.append((ename, links, ename)) + links = [] + package = "%s (%s, %s)" % (seasonName, g['opts']['Format'], g['opts']['Sprache']) + if self.getConfig("changeNameDJ") == "Format": + self.packages.append((package, links, package)) + links = [] + if (self.getConfig("changeNameDJ") == "Packagename") or re.search("#hasName", url): + self.core.files.addLinks(links, self.pyfile.package().id) + elif (self.getConfig("changeNameDJ") == "Show") or not re.search("#hasName", url): + self.packages.append((seasonName, links, seasonName)) + + def handleCategoryDJ(self, url): + package_links = [] + src = self.getSJSrc(url) + soup = BeautifulSoup(src) + content = soup.find("div", attrs={"id": "content"}) + for a in content.findAll("a", attrs={"rel": "bookmark"}): + package_links.append(a['href']) + self.core.files.addLinks(package_links, self.pyfile.package().id) + + def decrypt(self, pyfile): + showPattern = re.compile("^http://serienjunkies.org/serie/(.*)/$") + seasonPattern = re.compile("^http://serienjunkies.org/.*?/(.*)/$") + episodePattern = re.compile("^http://download.serienjunkies.org/f-.*?.html(#hasName)?$") + oldStyleLink = re.compile("^http://serienjunkies.org/safe/(.*)$") + categoryPatternDJ = re.compile("^http://dokujunkies.org/.*?(.*)$") + showPatternDJ = re.compile(r"^http://dokujunkies.org/.*?/(.*)\.html(#hasName)?$") + framePattern = re.compile("^http://download.(serienjunkies.org|dokujunkies.org)/frame/go-.*?/$") + url = pyfile.url + if framePattern.match(url): + self.packages.append((pyfile.package().name, [self.handleFrame(url)], pyfile.package().name)) + elif episodePattern.match(url): + self.handleEpisode(url) + elif oldStyleLink.match(url): + self.handleOldStyleLink(url) + elif showPattern.match(url): + self.handleShow(url) + elif showPatternDJ.match(url): + self.handleShowDJ(url) + elif seasonPattern.match(url): + self.handleSeason(url) + elif categoryPatternDJ.match(url): + self.handleCategoryDJ(url) + + #selects the preferred hoster, after that selects any hoster (ignoring the one to ignore) + def getpreferred(self, hosterlist): + + result = [] + preferredList = self.getConfig("hosterList").strip().lower().replace( + '|', ',').replace('.', '').replace(';', ',').split(',') + if (self.getConfig("randomPreferred") is True) and ( + self.getConfig("hosterListMode") in ["OnlyOne", "OnlyPreferred(One)"]): + random.shuffle(preferredList) + # we don't want hosters be read two times + hosterlist2 = hosterlist.copy() + + for preferred in preferredList: + for Hoster in hosterlist: + if preferred == Hoster.lower().replace('.', ''): + for Part in hosterlist[Hoster]: + self.logDebug("selected " + Part) + result.append(str(Part)) + del (hosterlist2[Hoster]) + if self.getConfig("hosterListMode") in ["OnlyOne", "OnlyPreferred(One)"]: + return result + + ignorelist = self.getConfig("ignoreList").strip().lower().replace( + '|', ',').replace('.', '').replace(';', ',').split(',') + if self.getConfig('hosterListMode') in ["OnlyOne", "All"]: + for Hoster in hosterlist2: + if Hoster.strip().lower().replace('.', '') not in ignorelist: + for Part in hosterlist2[Hoster]: + self.logDebug("selected2 " + Part) + result.append(str(Part)) + + if self.getConfig('hosterListMode') == "OnlyOne": + return result + return result diff --git a/pyload/plugins/crypter/ShareLinksBiz.py b/pyload/plugins/crypter/ShareLinksBiz.py new file mode 100644 index 000000000..132d2160b --- /dev/null +++ b/pyload/plugins/crypter/ShareLinksBiz.py @@ -0,0 +1,269 @@ +# -*- coding: utf-8 -*- + +import base64 +import binascii +import re + +from Crypto.Cipher import AES +from pyload.plugins.Crypter import Crypter + + +class ShareLinksBiz(Crypter): + __name__ = "ShareLinksBiz" + __type__ = "crypter" + __version__ = "1.13" + + __pattern__ = r'http://(?:www\.)?(share-links|s2l)\.biz/(?P<ID>_?\w+)' + + __description__ = """Share-Links.biz decrypter plugin""" + __author_name__ = "fragonib" + __author_mail__ = "fragonib[AT]yahoo[DOT]es" + + + def setup(self): + self.baseUrl = None + self.fileId = None + self.package = None + self.html = None + self.captcha = False + + def decrypt(self, pyfile): + # Init + self.initFile(pyfile) + + # Request package + url = self.baseUrl + '/' + self.fileId + self.html = self.load(url, decode=True) + + # Unblock server (load all images) + self.unblockServer() + + # Check for protection + if self.isPasswordProtected(): + self.unlockPasswordProtection() + self.handleErrors() + + if self.isCaptchaProtected(): + self.captcha = True + self.unlockCaptchaProtection() + self.handleErrors() + + # Extract package links + package_links = [] + package_links.extend(self.handleWebLinks()) + package_links.extend(self.handleContainers()) + package_links.extend(self.handleCNL2()) + package_links = set(package_links) + + # Get package info + package_name, package_folder = self.getPackageInfo() + + # Pack + self.packages = [(package_name, package_links, package_folder)] + + def initFile(self, pyfile): + url = pyfile.url + if 's2l.biz' in url: + url = self.load(url, just_header=True)['location'] + self.baseUrl = "http://www.%s.biz" % re.match(self.__pattern__, url).group(1) + self.fileId = re.match(self.__pattern__, url).group('ID') + self.package = pyfile.package() + + def isOnline(self): + if "No usable content was found" in self.html: + self.logDebug("File not found") + return False + return True + + def isPasswordProtected(self): + if re.search(r'''<form.*?id="passwordForm".*?>''', self.html): + self.logDebug("Links are protected") + return True + return False + + def isCaptchaProtected(self): + if '<map id="captchamap"' in self.html: + self.logDebug("Links are captcha protected") + return True + return False + + def unblockServer(self): + imgs = re.findall(r"(/template/images/.*?\.gif)", self.html) + for img in imgs: + self.load(self.baseUrl + img) + + def unlockPasswordProtection(self): + password = self.getPassword() + self.logDebug("Submitting password [%s] for protected links" % password) + post = {"password": password, 'login': 'Submit form'} + url = self.baseUrl + '/' + self.fileId + self.html = self.load(url, post=post, decode=True) + + def unlockCaptchaProtection(self): + # Get captcha map + captchaMap = self._getCaptchaMap() + self.logDebug("Captcha map with [%d] positions" % len(captchaMap.keys())) + + # Request user for captcha coords + m = re.search(r'<img src="/captcha.gif\?d=(.*?)&PHPSESSID=(.*?)&legend=1"', self.html) + captchaUrl = self.baseUrl + '/captcha.gif?d=%s&PHPSESSID=%s' % (m.group(1), m.group(2)) + self.logDebug("Waiting user for correct position") + coords = self.decryptCaptcha(captchaUrl, forceUser=True, imgtype="gif", result_type='positional') + self.logDebug("Captcha resolved, coords [%s]" % str(coords)) + + # Resolve captcha + href = self._resolveCoords(coords, captchaMap) + if href is None: + self.logDebug("Invalid captcha resolving, retrying") + self.invalidCaptcha() + self.setWait(5, False) + self.wait() + self.retry() + url = self.baseUrl + href + self.html = self.load(url, decode=True) + + def _getCaptchaMap(self): + mapp = {} + for m in re.finditer(r'<area shape="rect" coords="(.*?)" href="(.*?)"', self.html): + rect = eval('(' + m.group(1) + ')') + href = m.group(2) + mapp[rect] = href + return mapp + + def _resolveCoords(self, coords, captchaMap): + x, y = coords + for rect, href in captchaMap.items(): + x1, y1, x2, y2 = rect + if (x >= x1 and x <= x2) and (y >= y1 and y <= y2): + return href + + def handleErrors(self): + if "The inserted password was wrong" in self.html: + self.logDebug("Incorrect password, please set right password on 'Edit package' form and retry") + self.fail("Incorrect password, please set right password on 'Edit package' form and retry") + + if self.captcha: + if "Your choice was wrong" in self.html: + self.logDebug("Invalid captcha, retrying") + self.invalidCaptcha() + self.setWait(5) + self.wait() + self.retry() + else: + self.correctCaptcha() + + def getPackageInfo(self): + name = folder = None + + # Extract from web package header + title_re = r'<h2><img.*?/>(.*)</h2>' + m = re.search(title_re, self.html, re.DOTALL) + if m is not None: + title = m.group(1).strip() + if 'unnamed' not in title: + name = folder = title + self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) + + # Fallback to defaults + if not name or not folder: + name = self.package.name + folder = self.package.folder + self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) + + # Return package info + return name, folder + + def handleWebLinks(self): + package_links = [] + self.logDebug("Handling Web links") + + #@TODO: Gather paginated web links + pattern = r"javascript:_get\('(.*?)', \d+, ''\)" + ids = re.findall(pattern, self.html) + self.logDebug("Decrypting %d Web links" % len(ids)) + for i, ID in enumerate(ids): + try: + self.logDebug("Decrypting Web link %d, [%s]" % (i + 1, ID)) + dwLink = self.baseUrl + "/get/lnk/" + ID + response = self.load(dwLink) + code = re.search(r'frm/(\d+)', response).group(1) + fwLink = self.baseUrl + "/get/frm/" + code + response = self.load(fwLink) + jscode = re.search(r'<script language="javascript">\s*eval\((.*)\)\s*</script>', response, + re.DOTALL).group(1) + jscode = self.js.eval("f = %s" % jscode) + jslauncher = "window=''; parent={frames:{Main:{location:{href:''}}},location:''}; %s; parent.frames.Main.location.href" + dlLink = self.js.eval(jslauncher % jscode) + self.logDebug("JsEngine returns value [%s] for redirection link" % dlLink) + package_links.append(dlLink) + except Exception, detail: + self.logDebug("Error decrypting Web link [%s], %s" % (ID, detail)) + return package_links + + def handleContainers(self): + package_links = [] + self.logDebug("Handling Container links") + + pattern = r"javascript:_get\('(.*?)', 0, '(rsdf|ccf|dlc)'\)" + containersLinks = re.findall(pattern, self.html) + self.logDebug("Decrypting %d Container links" % len(containersLinks)) + for containerLink in containersLinks: + link = "%s/get/%s/%s" % (self.baseUrl, containerLink[1], containerLink[0]) + package_links.append(link) + return package_links + + def handleCNL2(self): + package_links = [] + self.logDebug("Handling CNL2 links") + + if '/lib/cnl2/ClicknLoad.swf' in self.html: + try: + (crypted, jk) = self._getCipherParams() + package_links.extend(self._getLinks(crypted, jk)) + except: + self.fail("Unable to decrypt CNL2 links") + return package_links + + def _getCipherParams(self): + # Request CNL2 + code = re.search(r'ClicknLoad.swf\?code=(.*?)"', self.html).group(1) + url = "%s/get/cnl2/%s" % (self.baseUrl, code) + response = self.load(url) + params = response.split(";;") + + # Get jk + strlist = list(base64.standard_b64decode(params[1])) + strlist.reverse() + jk = ''.join(strlist) + + # Get crypted + strlist = list(base64.standard_b64decode(params[2])) + strlist.reverse() + crypted = ''.join(strlist) + + # Log and return + return crypted, jk + + def _getLinks(self, crypted, jk): + # Get key + jreturn = self.js.eval("%s f()" % jk) + self.logDebug("JsEngine returns value [%s]" % jreturn) + key = binascii.unhexlify(jreturn) + + # Decode crypted + crypted = base64.standard_b64decode(crypted) + + # Decrypt + Key = key + IV = key + obj = AES.new(Key, AES.MODE_CBC, IV) + text = obj.decrypt(crypted) + + # Extract links + text = text.replace("\x00", "").replace("\r", "") + links = text.split("\n") + links = filter(lambda x: x != "", links) + + # Log and return + self.logDebug("Block has %d links" % len(links)) + return links diff --git a/pyload/plugins/crypter/ShareRapidComFolder.py b/pyload/plugins/crypter/ShareRapidComFolder.py new file mode 100644 index 000000000..c8e95be1c --- /dev/null +++ b/pyload/plugins/crypter/ShareRapidComFolder.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter + + +class ShareRapidComFolder(SimpleCrypter): + __name__ = "ShareRapidComFolder" + __type__ = "crypter" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?((share(-?rapid\.(biz|com|cz|info|eu|net|org|pl|sk)|-(central|credit|free|net)\.cz|-ms\.net)|(s-?rapid|rapids)\.(cz|sk))|(e-stahuj|mediatack|premium-rapidshare|rapidshare-premium|qiuck)\.cz|kadzet\.com|stahuj-zdarma\.eu|strelci\.net|universal-share\.com)/(slozka/.+)' + + __description__ = """Share-Rapid.com folder decrypter plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + LINK_PATTERN = r'<td class="soubor"[^>]*><a href="([^"]+)">' diff --git a/pyload/plugins/crypter/SpeedLoadOrgFolder.py b/pyload/plugins/crypter/SpeedLoadOrgFolder.py new file mode 100644 index 000000000..fff119a93 --- /dev/null +++ b/pyload/plugins/crypter/SpeedLoadOrgFolder.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadCrypter import DeadCrypter + + +class SpeedLoadOrgFolder(DeadCrypter): + __name__ = "SpeedLoadOrgFolder" + __type__ = "crypter" + __version__ = "0.3" + + __pattern__ = r'http://(?:www\.)?speedload\.org/(\d+~f$|folder/\d+/)' + + __description__ = """Speedload decrypter plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" diff --git a/pyload/plugins/crypter/StealthTo.py b/pyload/plugins/crypter/StealthTo.py new file mode 100644 index 000000000..24489a1b3 --- /dev/null +++ b/pyload/plugins/crypter/StealthTo.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadCrypter import DeadCrypter + + +class StealthTo(DeadCrypter): + __name__ = "StealthTo" + __type__ = "crypter" + __version__ = "0.2" + + __pattern__ = r'http://(?:www\.)?stealth\.to/folder/.+' + + __description__ = """Stealth.to decrypter plugin""" + __author_name__ = "spoob" + __author_mail__ = "spoob@pyload.org" diff --git a/pyload/plugins/crypter/TnyCz.py b/pyload/plugins/crypter/TnyCz.py new file mode 100644 index 000000000..879941ba4 --- /dev/null +++ b/pyload/plugins/crypter/TnyCz.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter + +import re + + +class TnyCz(SimpleCrypter): + __name__ = "TnyCz" + __type__ = "crypter" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?tny\.cz/\w+' + + __description__ = """Tny.cz decrypter plugin""" + __author_name__ = "Walter Purcaro" + __author_mail__ = "vuolter@gmail.com" + + TITLE_PATTERN = r'<title>(?P<title>.+) - .+' + + + def getLinks(self): + m = re.search(r'', self.html) + return re.findall(".+", self.load(m.group(1), decode=True)) if m else None diff --git a/pyload/plugins/crypter/TrailerzoneInfo.py b/pyload/plugins/crypter/TrailerzoneInfo.py new file mode 100644 index 000000000..7be3beef0 --- /dev/null +++ b/pyload/plugins/crypter/TrailerzoneInfo.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadCrypter import DeadCrypter + + +class TrailerzoneInfo(DeadCrypter): + __name__ = "TrailerzoneInfo" + __type__ = "crypter" + __version__ = "0.03" + + __pattern__ = r'http://(?:www\.)?trailerzone.info/.*?' + + __description__ = """TrailerZone.info decrypter plugin""" + __author_name__ = "godofdream" + __author_mail__ = "soilfiction@gmail.com" diff --git a/pyload/plugins/crypter/TurbobitNetFolder.py b/pyload/plugins/crypter/TurbobitNetFolder.py new file mode 100644 index 000000000..48b28c28a --- /dev/null +++ b/pyload/plugins/crypter/TurbobitNetFolder.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter +from pyload.common.json_layer import json_loads + + +class TurbobitNetFolder(SimpleCrypter): + __name__ = "TurbobitNetFolder" + __type__ = "crypter" + __version__ = "0.03" + + __pattern__ = r'http://(?:www\.)?turbobit\.net/download/folder/(?P\w+)' + + __description__ = """Turbobit.net folder decrypter plugin""" + __author_name__ = ("stickell", "Walter Purcaro") + __author_mail__ = ("l.stickell@yahoo.it", "vuolter@gmail.com") + + TITLE_PATTERN = r"src='/js/lib/grid/icon/folder.png'> (?P.+?)</span>" + + + def _getLinks(self, id, page=1): + gridFile = self.load("http://turbobit.net/downloadfolder/gridFile", + get={"rootId": id, "rows": 200, "page": page}, decode=True) + grid = json_loads(gridFile) + + if grid['rows']: + for i in grid['rows']: + yield i['id'] + for id in self._getLinks(id, page + 1): + yield id + else: + return + + def getLinks(self): + id = re.match(self.__pattern__, self.pyfile.url).group("ID") + fixurl = lambda id: "http://turbobit.net/%s.html" % id + return map(fixurl, self._getLinks(id)) diff --git a/pyload/plugins/crypter/TusfilesNetFolder.py b/pyload/plugins/crypter/TusfilesNetFolder.py new file mode 100644 index 000000000..f4f1c7723 --- /dev/null +++ b/pyload/plugins/crypter/TusfilesNetFolder.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +import math +import re +from urlparse import urljoin + +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter + + +class TusfilesNetFolder(SimpleCrypter): + __name__ = "TusfilesNetFolder" + __type__ = "crypter" + __version__ = "0.02" + + __pattern__ = r'https?://(?:www\.)?tusfiles\.net/go/(?P<ID>\w+)/?' + + __description__ = """Tusfiles.net folder decrypter plugin""" + __author_name__ = ("Walter Purcaro", "stickell") + __author_mail__ = ("vuolter@gmail.com", "l.stickell@yahoo.it") + + LINK_PATTERN = r'<TD align=left><a href="(.*?)">' + TITLE_PATTERN = r'<Title>.*?\: (?P<title>.+) folder' + PAGES_PATTERN = r'>\((?P\d+) \w+\)<' + + URL_REPLACEMENTS = [(__pattern__, r'https://www.tusfiles.net/go/\g/')] + + + def loadPage(self, page_n): + return self.load(urljoin(self.pyfile.url, str(page_n)), decode=True) + + def handleMultiPages(self): + pages = re.search(self.PAGES_PATTERN, self.html) + if pages: + pages = int(math.ceil(int(pages.group('pages')) / 25.0)) + else: + return + + for p in xrange(2, pages + 1): + self.html = self.loadPage(p) + self.package_links += self.getLinks() diff --git a/pyload/plugins/crypter/UlozToFolder.py b/pyload/plugins/crypter/UlozToFolder.py new file mode 100644 index 000000000..2cc440a5d --- /dev/null +++ b/pyload/plugins/crypter/UlozToFolder.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +import re +from pyload.plugins.Crypter import Crypter + + +class UlozToFolder(Crypter): + __name__ = "UlozToFolder" + __type__ = "crypter" + __version__ = "0.2" + + __pattern__ = r'http://(?:www\.)?(uloz\.to|ulozto\.(cz|sk|net)|bagruj.cz|zachowajto.pl)/(m|soubory)/.*' + + __description__ = """Uloz.to folder decrypter plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FOLDER_PATTERN = r'
          (.*?)
        ' + LINK_PATTERN = r'
        [^<]+' + NEXT_PAGE_PATTERN = r'' + + + def decrypt(self, pyfile): + html = self.load(pyfile.url) + + new_links = [] + for i in xrange(1, 100): + self.logInfo("Fetching links from page %i" % i) + m = re.search(self.FOLDER_PATTERN, html, re.DOTALL) + if m is None: + self.fail("Parse error (FOLDER)") + + new_links.extend(re.findall(self.LINK_PATTERN, m.group(1))) + m = re.search(self.NEXT_PAGE_PATTERN, html) + if m: + html = self.load("http://ulozto.net/" + m.group(1)) + else: + break + else: + self.logInfo("Limit of 99 pages reached, aborting") + + if new_links: + self.urls = [map(lambda s: "http://ulozto.net/%s" % s, new_links)] + else: + self.fail('Could not extract any links') diff --git a/pyload/plugins/crypter/UploadableChFolder.py b/pyload/plugins/crypter/UploadableChFolder.py new file mode 100644 index 000000000..3be8b0167 --- /dev/null +++ b/pyload/plugins/crypter/UploadableChFolder.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter + + +class UploadableChFolder(SimpleCrypter): + __name__ = "UploadableChFolder" + __type__ = "crypter" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?uploadable\.ch/list/\w+' + + __description__ = """ Uploadable.ch folder decrypter plugin """ + __author_name__ = ("guidobelix", "Walter Purcaro") + __author_mail__ = ("guidobelix@hotmail.it", "vuolter@gmail.com") + + + LINK_PATTERN = r'"(.+?)" class="icon_zipfile">' + TITLE_PATTERN = r'
         (?P.+?)</div>' + OFFLINE_PATTERN = r'We are sorry... The URL you entered cannot be found on the server.' + TEMP_OFFLINE_PATTERN = r'<div class="icon_err">' diff --git a/pyload/plugins/crypter/UploadedToFolder.py b/pyload/plugins/crypter/UploadedToFolder.py new file mode 100644 index 000000000..31977409d --- /dev/null +++ b/pyload/plugins/crypter/UploadedToFolder.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter + + +class UploadedToFolder(SimpleCrypter): + __name__ = "UploadedToFolder" + __type__ = "crypter" + __version__ = "0.3" + + __pattern__ = r'http://(?:www\.)?(uploaded|ul)\.(to|net)/(f|folder|list)/(?P<id>\w+)' + + __description__ = """UploadedTo decrypter plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + PLAIN_PATTERN = r'<small class="date"><a href="(?P<plain>[\w/]+)" onclick=' + TITLE_PATTERN = r'<title>(?P<title>[^<]+)' + + + def decrypt(self, pyfile): + self.html = self.load(pyfile.url) + + package_name, folder_name = self.getPackageNameAndFolder() + + m = re.search(self.PLAIN_PATTERN, self.html) + if m: + plain_link = 'http://uploaded.net/' + m.group('plain') + else: + self.fail('Parse error - Unable to find plain url list') + + self.html = self.load(plain_link) + package_links = self.html.split('\n')[:-1] + self.logDebug('Package has %d links' % len(package_links)) + + self.packages = [(package_name, package_links, folder_name)] diff --git a/pyload/plugins/crypter/WiiReloadedOrg.py b/pyload/plugins/crypter/WiiReloadedOrg.py new file mode 100644 index 000000000..7dfe574ab --- /dev/null +++ b/pyload/plugins/crypter/WiiReloadedOrg.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadCrypter import DeadCrypter + + +class WiiReloadedOrg(DeadCrypter): + __name__ = "WiiReloadedOrg" + __type__ = "crypter" + __version__ = "0.11" + + __pattern__ = r'http://(?:www\.)?wii-reloaded\.org/protect/get\.php\?i=.+' + + __description__ = """Wii-Reloaded.org decrypter plugin""" + __author_name__ = "hzpz" + __author_mail__ = None diff --git a/pyload/plugins/crypter/XupPl.py b/pyload/plugins/crypter/XupPl.py new file mode 100644 index 000000000..8d09e28a3 --- /dev/null +++ b/pyload/plugins/crypter/XupPl.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.Crypter import Crypter + + +class XupPl(Crypter): + __name__ = "XupPl" + __type__ = "crypter" + __version__ = "0.1" + + __pattern__ = r'https?://(?:[^/]*\.)?xup\.pl/.*' + + __description__ = """Xup.pl decrypter plugin""" + __author_name__ = "z00nx" + __author_mail__ = "z00nx0@gmail.com" + + + def decrypt(self, pyfile): + header = self.load(pyfile.url, just_header=True) + if 'location' in header: + self.urls = [header['location']] + else: + self.fail('Unable to find link') diff --git a/pyload/plugins/crypter/YoutubeBatch.py b/pyload/plugins/crypter/YoutubeBatch.py new file mode 100644 index 000000000..5b7cb6530 --- /dev/null +++ b/pyload/plugins/crypter/YoutubeBatch.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- + +import re + +from urlparse import urljoin + +from pyload.common.json_layer import json_loads +from pyload.plugins.Crypter import Crypter +from pyload.utils import safe_join + +API_URL = "AIzaSyCKnWLNlkX-L4oD1aEzqqhRw1zczeD6_k0" + + +class YoutubeBatch(Crypter): + __name__ = "YoutubeBatch" + __type__ = "crypter" + __version__ = "1.00" + + __pattern__ = r'https?://(?:www\.|m\.)?youtube\.com/(?Puser|playlist|view_play_list)(/|.*?[?&](?:list|p)=)(?P[\w-]+)' + __config__ = [("likes", "bool", "Grab user (channel) liked videos", False), + ("favorites", "bool", "Grab user (channel) favorite videos", False), + ("uploads", "bool", "Grab channel unplaylisted videos", True)] + + __description__ = """Youtube.com channel & playlist decrypter plugin""" + __author_name__ = "Walter Purcaro" + __author_mail__ = "vuolter@gmail.com" + + + def api_response(self, ref, req): + req.update({"key": API_KEY}) + url = urljoin("https://www.googleapis.com/youtube/v3/", ref) + page = self.load(url, get=req) + return json_loads(page) + + def getChannel(self, user): + channels = self.api_response("channels", {"part": "id,snippet,contentDetails", "forUsername": user, "maxResults": "50"}) + if channels['items']: + channel = channels['items'][0] + return {"id": channel['id'], + "title": channel['snippet']['title'], + "relatedPlaylists": channel['contentDetails']['relatedPlaylists'], + "user": user} # One lone channel for user? + + def getPlaylist(self, p_id): + playlists = self.api_response("playlists", {"part": "snippet", "id": p_id}) + if playlists['items']: + playlist = playlists['items'][0] + return {"id": p_id, + "title": playlist['snippet']['title'], + "channelId": playlist['snippet']['channelId'], + "channelTitle": playlist['snippet']['channelTitle']} + + def _getPlaylists(self, id, token=None): + req = {"part": "id", "maxResults": "50", "channelId": id} + if token: + req.update({"pageToken": token}) + + playlists = self.api_response("playlists", req) + + for playlist in playlists['items']: + yield playlist['id'] + + if "nextPageToken" in playlists: + for item in self._getPlaylists(id, playlists['nextPageToken']): + yield item + + def getPlaylists(self, ch_id): + return map(self.getPlaylist, self._getPlaylists(ch_id)) + + def _getVideosId(self, id, token=None): + req = {"part": "contentDetails", "maxResults": "50", "playlistId": id} + if token: + req.update({"pageToken": token}) + + playlist = self.api_response("playlistItems", req) + + for item in playlist['items']: + yield item['contentDetails']['videoId'] + + if "nextPageToken" in playlist: + for item in self._getVideosId(id, playlist['nextPageToken']): + yield item + + def getVideosId(self, p_id): + return list(self._getVideosId(p_id)) + + def decrypt(self, pyfile): + m = re.match(self.__pattern__, pyfile.url) + m_id = m.group("ID") + m_type = m.group("TYPE") + + if m_type == "user": + self.logDebug("Url recognized as Channel") + user = m_id + channel = self.getChannel(user) + + if channel: + playlists = self.getPlaylists(channel['id']) + self.logDebug("%s playlist\s found on channel \"%s\"" % (len(playlists), channel['title'])) + + relatedplaylist = {p_name: self.getPlaylist(p_id) for p_name, p_id in channel['relatedPlaylists'].iteritems()} + self.logDebug("Channel's related playlists found = %s" % relatedplaylist.keys()) + + relatedplaylist['uploads']['title'] = "Unplaylisted videos" + relatedplaylist['uploads']['checkDups'] = True #: checkDups flag + + for p_name, p_data in relatedplaylist.iteritems(): + if self.getConfig(p_name): + p_data['title'] += " of " + user + playlists.append(p_data) + else: + playlists = [] + else: + self.logDebug("Url recognized as Playlist") + playlists = [self.getPlaylist(m_id)] + + if not playlists: + self.fail("No playlist available") + + addedvideos = [] + urlize = lambda x: "https://www.youtube.com/watch?v=" + x + for p in playlists: + p_name = p['title'] + p_videos = self.getVideosId(p['id']) + p_folder = safe_join(self.config['general']['download_folder'], p['channelTitle'], p_name) + self.logDebug("%s video\s found on playlist \"%s\"" % (len(p_videos), p_name)) + + if not p_videos: + continue + elif "checkDups" in p: + p_urls = [urlize(v_id) for v_id in p_videos if v_id not in addedvideos] + self.logDebug("%s video\s available on playlist \"%s\" after duplicates cleanup" % (len(p_urls), p_name)) + else: + p_urls = map(urlize, p_videos) + + self.packages.append((p_name, p_urls, p_folder)) #: folder is NOT recognized by pyload 0.4.9! + + addedvideos.extend(p_videos) diff --git a/pyload/plugins/crypter/__init__.py b/pyload/plugins/crypter/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pyload/plugins/hooks/AlldebridCom.py b/pyload/plugins/hooks/AlldebridCom.py new file mode 100644 index 000000000..8eade2941 --- /dev/null +++ b/pyload/plugins/hooks/AlldebridCom.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class AlldebridCom(MultiHoster): + __name__ = "AlldebridCom" + __type__ = "hook" + __version__ = "0.13" + + __config__ = [("activated", "bool", "Activated", False), + ("https", "bool", "Enable HTTPS", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to stanard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """Alldebrid.com hook plugin""" + __author_name__ = "Andy Voigt" + __author_mail__ = "spamsales@online.de" + + + def getHoster(self): + https = "https" if self.getConfig("https") else "http" + page = getURL(https + "://www.alldebrid.com/api.php?action=get_host").replace("\"", "").strip() + + return [x.strip() for x in page.split(",") if x.strip()] diff --git a/pyload/plugins/hooks/BypassCaptcha.py b/pyload/plugins/hooks/BypassCaptcha.py new file mode 100644 index 000000000..9558ba4c4 --- /dev/null +++ b/pyload/plugins/hooks/BypassCaptcha.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- + +from pycurl import FORM_FILE, LOW_SPEED_TIME +from thread import start_new_thread + +from pyload.network.HTTPRequest import BadHeader +from pyload.network.RequestFactory import getURL, getRequest +from pyload.plugins.Hook import Hook + + +class BypassCaptchaException(Exception): + + def __init__(self, err): + self.err = err + + def getCode(self): + return self.err + + def __str__(self): + return "" % self.err + + def __repr__(self): + return "" % self.err + + +class BypassCaptcha(Hook): + __name__ = "BypassCaptcha" + __type__ = "hook" + __version__ = "0.04" + + __config__ = [("activated", "bool", "Activated", False), + ("force", "bool", "Force BC even if client is connected", False), + ("passkey", "password", "Passkey", "")] + + __description__ = """Send captchas to BypassCaptcha.com""" + __author_name__ = ("RaNaN", "Godofdream", "zoidberg") + __author_mail__ = ("RaNaN@pyload.org", "soilfcition@gmail.com", "zoidberg@mujmail.cz") + + PYLOAD_KEY = "4f771155b640970d5607f919a615bdefc67e7d32" + + SUBMIT_URL = "http://bypasscaptcha.com/upload.php" + RESPOND_URL = "http://bypasscaptcha.com/check_value.php" + GETCREDITS_URL = "http://bypasscaptcha.com/ex_left.php" + + + def setup(self): + self.info = {} + + def getCredits(self): + response = getURL(self.GETCREDITS_URL, post={"key": self.getConfig("passkey")}) + + data = dict([x.split(' ', 1) for x in response.splitlines()]) + return int(data['Left']) + + def submit(self, captcha, captchaType="file", match=None): + req = getRequest() + + #raise timeout threshold + req.c.setopt(LOW_SPEED_TIME, 80) + + try: + response = req.load(self.SUBMIT_URL, + post={"vendor_key": self.PYLOAD_KEY, + "key": self.getConfig("passkey"), + "gen_task_id": "1", + "file": (FORM_FILE, captcha)}, + multipart=True) + finally: + req.close() + + data = dict([x.split(' ', 1) for x in response.splitlines()]) + if not data or "Value" not in data: + raise BypassCaptchaException(response) + + result = data['Value'] + ticket = data['TaskId'] + self.logDebug("result %s : %s" % (ticket, result)) + + return ticket, result + + def respond(self, ticket, success): + try: + response = getURL(self.RESPOND_URL, post={"task_id": ticket, "key": self.getConfig("passkey"), + "cv": 1 if success else 0}) + except BadHeader, e: + self.logError("Could not send response.", str(e)) + + def newCaptchaTask(self, task): + if "service" in task.data: + return False + + if not task.isTextual(): + return False + + if not self.getConfig("passkey"): + return False + + if self.core.isClientConnected() and not self.getConfig("force"): + return False + + if self.getCredits() > 0: + task.handler.append(self) + task.data['service'] = self.__name__ + task.setWaiting(100) + start_new_thread(self.processCaptcha, (task,)) + + else: + self.logInfo("Your %s account has not enough credits" % self.__name__) + + def captchaCorrect(self, task): + if task.data['service'] == self.__name__ and "ticket" in task.data: + self.respond(task.data['ticket'], True) + + def captchaInvalid(self, task): + if task.data['service'] == self.__name__ and "ticket" in task.data: + self.respond(task.data['ticket'], False) + + def processCaptcha(self, task): + c = task.captchaFile + try: + ticket, result = self.submit(c) + except BypassCaptchaException, e: + task.error = e.getCode() + return + + task.data['ticket'] = ticket + task.setResult(result) diff --git a/pyload/plugins/hooks/Captcha9kw.py b/pyload/plugins/hooks/Captcha9kw.py new file mode 100644 index 000000000..fcb5dd7c1 --- /dev/null +++ b/pyload/plugins/hooks/Captcha9kw.py @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import time + +from base64 import b64encode +from thread import start_new_thread + +from pyload.network.HTTPRequest import BadHeader +from pyload.network.RequestFactory import getURL +from pyload.plugins.Hook import Hook + + +class Captcha9kw(Hook): + __name__ = "Captcha9kw" + __type__ = "hook" + __version__ = "0.09" + + __config__ = [("activated", "bool", "Activated", False), + ("force", "bool", "Force CT even if client is connected", True), + ("https", "bool", "Enable HTTPS", False), + ("confirm", "bool", "Confirm Captcha (Cost +6)", False), + ("captchaperhour", "int", "Captcha per hour (max. 9999)", 9999), + ("prio", "int", "Prio 1-10 (Cost +1-10)", 0), + ("selfsolve", "bool", + "If enabled and you have a 9kw client active only you will get your captcha to solve it (Selfsolve)", + False), + ("timeout", "int", "Timeout (max. 300)", 300), + ("passkey", "password", "API key", "")] + + __description__ = """Send captchas to 9kw.eu""" + __author_name__ = "RaNaN" + __author_mail__ = "RaNaN@pyload.org" + + API_URL = "://www.9kw.eu/index.cgi" + + + def setup(self): + self.API_URL = "https" + self.API_URL if self.getConfig("https") else "http" + self.API_URL + self.info = {} + + def getCredits(self): + response = getURL(self.API_URL, get={"apikey": self.getConfig("passkey"), "pyload": "1", "source": "pyload", + "action": "usercaptchaguthaben"}) + + if response.isdigit(): + self.logInfo(_("%s credits left") % response) + self.info['credits'] = credits = int(response) + return credits + else: + self.logError(response) + return 0 + + def processCaptcha(self, task): + result = None + + with open(task.captchaFile, 'rb') as f: + data = f.read() + data = b64encode(data) + self.logDebug("%s : %s" % (task.captchaFile, data)) + if task.isPositional(): + mouse = 1 + else: + mouse = 0 + + response = getURL(self.API_URL, post={ + "apikey": self.getConfig("passkey"), + "prio": self.getConfig("prio"), + "confirm": self.getConfig("confirm"), + "captchaperhour": self.getConfig("captchaperhour"), + "maxtimeout": self.getConfig("timeout"), + "selfsolve": self.getConfig("selfsolve"), + "pyload": "1", + "source": "pyload", + "base64": "1", + "mouse": mouse, + "file-upload-01": data, + "action": "usercaptchaupload"}) + + if response.isdigit(): + self.logInfo(_("New CaptchaID from upload: %s : %s") % (response, task.captchaFile)) + + for _ in xrange(1, 100, 1): + response2 = getURL(self.API_URL, get={"apikey": self.getConfig("passkey"), "id": response, + "pyload": "1", "source": "pyload", + "action": "usercaptchacorrectdata"}) + + if response2 != "": + break + + time.sleep(3) + + result = response2 + task.data['ticket'] = response + self.logInfo("result %s : %s" % (response, result)) + task.setResult(result) + else: + self.logError("Bad upload: %s" % response) + return False + + def newCaptchaTask(self, task): + if not task.isTextual() and not task.isPositional(): + return False + + if not self.getConfig("passkey"): + return False + + if self.core.isClientConnected() and not self.getConfig("force"): + return False + + if self.getCredits() > 0: + task.handler.append(self) + task.setWaiting(self.getConfig("timeout")) + start_new_thread(self.processCaptcha, (task,)) + + else: + self.logError(_("Your Captcha 9kw.eu Account has not enough credits")) + + def captchaCorrect(self, task): + if "ticket" in task.data: + + try: + response = getURL(self.API_URL, + post={"action": "usercaptchacorrectback", + "apikey": self.getConfig("passkey"), + "api_key": self.getConfig("passkey"), + "correct": "1", + "pyload": "1", + "source": "pyload", + "id": task.data['ticket']}) + self.logInfo("Request correct: %s" % response) + + except BadHeader, e: + self.logError("Could not send correct request.", str(e)) + else: + self.logError("No CaptchaID for correct request (task %s) found." % task) + + def captchaInvalid(self, task): + if "ticket" in task.data: + + try: + response = getURL(self.API_URL, + post={"action": "usercaptchacorrectback", + "apikey": self.getConfig("passkey"), + "api_key": self.getConfig("passkey"), + "correct": "2", + "pyload": "1", + "source": "pyload", + "id": task.data['ticket']}) + self.logInfo("Request refund: %s" % response) + + except BadHeader, e: + self.logError("Could not send refund request.", str(e)) + else: + self.logError("No CaptchaID for not correct request (task %s) found." % task) diff --git a/pyload/plugins/hooks/CaptchaBrotherhood.py b/pyload/plugins/hooks/CaptchaBrotherhood.py new file mode 100644 index 000000000..81325be92 --- /dev/null +++ b/pyload/plugins/hooks/CaptchaBrotherhood.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import StringIO +import pycurl + +from PIL import Image +from thread import start_new_thread +from time import sleep +from urllib import urlencode + +from pyload.network.RequestFactory import getURL, getRequest +from pyload.plugins.Hook import Hook + + +class CaptchaBrotherhoodException(Exception): + + def __init__(self, err): + self.err = err + + def getCode(self): + return self.err + + def __str__(self): + return "" % self.err + + def __repr__(self): + return "" % self.err + + +class CaptchaBrotherhood(Hook): + __name__ = "CaptchaBrotherhood" + __type__ = "hook" + __version__ = "0.05" + + __config__ = [("activated", "bool", "Activated", False), + ("username", "str", "Username", ""), + ("force", "bool", "Force CT even if client is connected", False), + ("passkey", "password", "Password", "")] + + __description__ = """Send captchas to CaptchaBrotherhood.com""" + __author_name__ = ("RaNaN", "zoidberg") + __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") + + API_URL = "http://www.captchabrotherhood.com/" + + + def setup(self): + self.info = {} + + def getCredits(self): + response = getURL(self.API_URL + "askCredits.aspx", + get={"username": self.getConfig("username"), "password": self.getConfig("passkey")}) + if not response.startswith("OK"): + raise CaptchaBrotherhoodException(response) + else: + credits = int(response[3:]) + self.logInfo(_("%d credits left") % credits) + self.info['credits'] = credits + return credits + + def submit(self, captcha, captchaType="file", match=None): + try: + img = Image.open(captcha) + output = StringIO.StringIO() + self.logDebug("CAPTCHA IMAGE", img, img.format, img.mode) + if img.format in ("GIF", "JPEG"): + img.save(output, img.format) + else: + if img.mode != "RGB": + img = img.convert("RGB") + img.save(output, "JPEG") + data = output.getvalue() + output.close() + except Exception, e: + raise CaptchaBrotherhoodException("Reading or converting captcha image failed: %s" % e) + + req = getRequest() + + url = "%ssendNewCaptcha.aspx?%s" % (self.API_URL, + urlencode({"username": self.getConfig("username"), + "password": self.getConfig("passkey"), + "captchaSource": "pyLoad", + "timeout": "80"})) + + req.c.setopt(pycurl.URL, url) + req.c.setopt(pycurl.POST, 1) + req.c.setopt(pycurl.POSTFIELDS, data) + req.c.setopt(pycurl.HTTPHEADER, ["Content-Type: text/html"]) + + try: + req.c.perform() + response = req.getResponse() + except Exception, e: + raise CaptchaBrotherhoodException("Submit captcha image failed") + + req.close() + + if not response.startswith("OK"): + raise CaptchaBrotherhoodException(response[1]) + + ticket = response[3:] + + for _ in xrange(15): + sleep(5) + response = self.get_api("askCaptchaResult", ticket) + if response.startswith("OK-answered"): + return ticket, response[12:] + + raise CaptchaBrotherhoodException("No solution received in time") + + def get_api(self, api, ticket): + response = getURL("%s%s.aspx" % (self.API_URL, api), + get={"username": self.getConfig("username"), + "password": self.getConfig("passkey"), + "captchaID": ticket}) + if not response.startswith("OK"): + raise CaptchaBrotherhoodException("Unknown response: %s" % response) + + return response + + def newCaptchaTask(self, task): + if "service" in task.data: + return False + + if not task.isTextual(): + return False + + if not self.getConfig("username") or not self.getConfig("passkey"): + return False + + if self.core.isClientConnected() and not self.getConfig("force"): + return False + + if self.getCredits() > 10: + task.handler.append(self) + task.data['service'] = self.__name__ + task.setWaiting(100) + start_new_thread(self.processCaptcha, (task,)) + else: + self.logInfo("Your CaptchaBrotherhood Account has not enough credits") + + def captchaInvalid(self, task): + if task.data['service'] == self.__name__ and "ticket" in task.data: + response = self.get_api("complainCaptcha", task.data['ticket']) + + def processCaptcha(self, task): + c = task.captchaFile + try: + ticket, result = self.submit(c) + except CaptchaBrotherhoodException, e: + task.error = e.getCode() + return + + task.data['ticket'] = ticket + task.setResult(result) diff --git a/pyload/plugins/hooks/Checksum.py b/pyload/plugins/hooks/Checksum.py new file mode 100644 index 000000000..75ebcdc4c --- /dev/null +++ b/pyload/plugins/hooks/Checksum.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import hashlib +import re +import zlib + +from os import remove +from os.path import getsize, isfile, splitext + +from pyload.plugins.Hook import Hook +from pyload.utils import safe_join, fs_encode + + +def computeChecksum(local_file, algorithm): + if algorithm in getattr(hashlib, "algorithms", ("md5", "sha1", "sha224", "sha256", "sha384", "sha512")): + h = getattr(hashlib, algorithm)() + + with open(local_file, 'rb') as f: + for chunk in iter(lambda: f.read(128 * h.block_size), b''): + h.update(chunk) + + return h.hexdigest() + + elif algorithm in ("adler32", "crc32"): + hf = getattr(zlib, algorithm) + last = 0 + + with open(local_file, 'rb') as f: + for chunk in iter(lambda: f.read(8192), b''): + last = hf(chunk, last) + + return "%x" % last + + else: + return None + + +class Checksum(Hook): + __name__ = "Checksum" + __type__ = "hook" + __version__ = "0.13" + + __config__ = [("activated", "bool", "Activated", False), + ("check_checksum", "bool", "Check checksum? (If False only size will be verified)", True), + ("check_action", "fail;retry;nothing", "What to do if check fails?", "retry"), + ("max_tries", "int", "Number of retries", 2), + ("retry_action", "fail;nothing", "What to do if all retries fail?", "fail"), + ("wait_time", "int", "Time to wait before each retry (seconds)", 1)] + + __description__ = """Verify downloaded file size and checksum""" + __author_name__ = ("zoidberg", "Walter Purcaro", "stickell") + __author_mail__ = ("zoidberg@mujmail.cz", "vuolter@gmail.com", "l.stickell@yahoo.it") + + methods = {'sfv': 'crc32', 'crc': 'crc32', 'hash': 'md5'} + regexps = {'sfv': r'^(?P[^;].+)\s+(?P[0-9A-Fa-f]{8})$', + 'md5': r'^(?P[0-9A-Fa-f]{32}) (?P.+)$', + 'crc': r'filename=(?P.+)\nsize=(?P\d+)\ncrc32=(?P[0-9A-Fa-f]{8})$', + 'default': r'^(?P[0-9A-Fa-f]+)\s+\*?(?P.+)$'} + + + def coreReady(self): + if not self.getConfig("check_checksum"): + self.logInfo("Checksum validation is disabled in plugin configuration") + + def setup(self): + self.algorithms = sorted( + getattr(hashlib, "algorithms", ("md5", "sha1", "sha224", "sha256", "sha384", "sha512")), reverse=True) + self.algorithms.extend(["crc32", "adler32"]) + self.formats = self.algorithms + ["sfv", "crc", "hash"] + + def downloadFinished(self, pyfile): + """ + Compute checksum for the downloaded file and compare it with the hash provided by the hoster. + pyfile.plugin.check_data should be a dictionary which can contain: + a) if known, the exact filesize in bytes (e.g. "size": 123456789) + b) hexadecimal hash string with algorithm name as key (e.g. "md5": "d76505d0869f9f928a17d42d66326307") + """ + if hasattr(pyfile.plugin, "check_data") and (isinstance(pyfile.plugin.check_data, dict)): + data = pyfile.plugin.check_data.copy() + elif hasattr(pyfile.plugin, "api_data") and (isinstance(pyfile.plugin.api_data, dict)): + data = pyfile.plugin.api_data.copy() + else: + return + + self.logDebug(data) + + if not pyfile.plugin.lastDownload: + self.checkFailed(pyfile, None, "No file downloaded") + + local_file = fs_encode(pyfile.plugin.lastDownload) + #download_folder = self.config['general']['download_folder'] + #local_file = fs_encode(safe_join(download_folder, pyfile.package().folder, pyfile.name)) + + if not isfile(local_file): + self.checkFailed(pyfile, None, "File does not exist") + + # validate file size + if "size" in data: + api_size = int(data['size']) + file_size = getsize(local_file) + if api_size != file_size: + self.logWarning("File %s has incorrect size: %d B (%d expected)" % (pyfile.name, file_size, api_size)) + self.checkFailed(pyfile, local_file, "Incorrect file size") + del data['size'] + + # validate checksum + if data and self.getConfig("check_checksum"): + if "checksum" in data: + data['md5'] = data['checksum'] + + for key in self.algorithms: + if key in data: + checksum = computeChecksum(local_file, key.replace("-", "").lower()) + if checksum: + if checksum == data[key].lower(): + self.logInfo('File integrity of "%s" verified by %s checksum (%s).' % + (pyfile.name, key.upper(), checksum)) + break + else: + self.logWarning("%s checksum for file %s does not match (%s != %s)" % + (key.upper(), pyfile.name, checksum, data[key])) + self.checkFailed(pyfile, local_file, "Checksums do not match") + else: + self.logWarning("Unsupported hashing algorithm: %s" % key.upper()) + else: + self.logWarning("Unable to validate checksum for file %s" % pyfile.name) + + def checkFailed(self, pyfile, local_file, msg): + check_action = self.getConfig("check_action") + if check_action == "retry": + max_tries = self.getConfig("max_tries") + retry_action = self.getConfig("retry_action") + if pyfile.plugin.retries < max_tries: + if local_file: + remove(local_file) + pyfile.plugin.retry(max_tries=max_tries, wait_time=self.getConfig("wait_time"), reason=msg) + elif retry_action == "nothing": + return + elif check_action == "nothing": + return + pyfile.plugin.fail(reason=msg) + + def packageFinished(self, pypack): + download_folder = safe_join(self.config['general']['download_folder'], pypack.folder, "") + + for link in pypack.getChildren().itervalues(): + file_type = splitext(link['name'])[1][1:].lower() + #self.logDebug(link, file_type) + + if file_type not in self.formats: + continue + + hash_file = fs_encode(safe_join(download_folder, link['name'])) + if not isfile(hash_file): + self.logWarning("File not found: %s" % link['name']) + continue + + with open(hash_file) as f: + text = f.read() + + for m in re.finditer(self.regexps.get(file_type, self.regexps['default']), text): + data = m.groupdict() + self.logDebug(link['name'], data) + + local_file = fs_encode(safe_join(download_folder, data['name'])) + algorithm = self.methods.get(file_type, file_type) + checksum = computeChecksum(local_file, algorithm) + if checksum == data['hash']: + self.logInfo('File integrity of "%s" verified by %s checksum (%s).' % + (data['name'], algorithm, checksum)) + else: + self.logWarning("%s checksum for file %s does not match (%s != %s)" % + (algorithm, data['name'], checksum, data['hash'])) diff --git a/pyload/plugins/hooks/ClickAndLoad.py b/pyload/plugins/hooks/ClickAndLoad.py new file mode 100644 index 000000000..47163ceef --- /dev/null +++ b/pyload/plugins/hooks/ClickAndLoad.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- + +import socket +import thread + +from pyload.plugins.Hook import Hook + + +class ClickAndLoad(Hook): + __name__ = "ClickAndLoad" + __type__ = "hook" + __version__ = "0.22" + + __config__ = [("activated", "bool", "Activated", True), + ("extern", "bool", "Allow external link adding", False)] + + __description__ = """Gives abillity to use jd's click and load. depends on webinterface""" + __author_name__ = ("RaNaN", "mkaay") + __author_mail__ = ("RaNaN@pyload.de", "mkaay@mkaay.de") + + + def coreReady(self): + self.port = int(self.config['webinterface']['port']) + if self.config['webinterface']['activated']: + try: + if self.getConfig("extern"): + ip = "0.0.0.0" + else: + ip = "127.0.0.1" + + thread.start_new_thread(proxy, (self, ip, self.port, 9666)) + except: + self.logError("ClickAndLoad port already in use.") + + +def proxy(self, *settings): + thread.start_new_thread(server, (self,) + settings) + lock = thread.allocate_lock() + lock.acquire() + lock.acquire() + + +def server(self, *settings): + try: + dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + dock_socket.bind((settings[0], settings[2])) + dock_socket.listen(5) + while True: + client_socket = dock_socket.accept()[0] + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_socket.connect(("127.0.0.1", settings[1])) + thread.start_new_thread(forward, (client_socket, server_socket)) + thread.start_new_thread(forward, (server_socket, client_socket)) + except socket.error, e: + if hasattr(e, "errno"): + errno = e.errno + else: + errno = e.args[0] + + if errno == 98: + self.logWarning(_("Click'N'Load: Port 9666 already in use")) + return + thread.start_new_thread(server, (self,) + settings) + except: + thread.start_new_thread(server, (self,) + settings) + + +def forward(source, destination): + string = ' ' + while string: + string = source.recv(1024) + if string: + destination.sendall(string) + else: + #source.shutdown(socket.SHUT_RD) + destination.shutdown(socket.SHUT_WR) diff --git a/pyload/plugins/hooks/DeathByCaptcha.py b/pyload/plugins/hooks/DeathByCaptcha.py new file mode 100644 index 000000000..57bf9031f --- /dev/null +++ b/pyload/plugins/hooks/DeathByCaptcha.py @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import re + +from base64 import b64encode +from pycurl import FORM_FILE, HTTPHEADER +from thread import start_new_thread +from time import sleep + +from pyload.common.json_layer import json_loads +from pyload.network.HTTPRequest import BadHeader +from pyload.network.RequestFactory import getRequest +from pyload.plugins.Hook import Hook + + +class DeathByCaptchaException(Exception): + DBC_ERRORS = {'not-logged-in': 'Access denied, check your credentials', + 'invalid-credentials': 'Access denied, check your credentials', + 'banned': 'Access denied, account is suspended', + 'insufficient-funds': 'Insufficient account balance to decrypt CAPTCHA', + 'invalid-captcha': 'CAPTCHA is not a valid image', + 'service-overload': 'CAPTCHA was rejected due to service overload, try again later', + 'invalid-request': 'Invalid request', + 'timed-out': 'No CAPTCHA solution received in time'} + + def __init__(self, err): + self.err = err + + def getCode(self): + return self.err + + def getDesc(self): + if self.err in self.DBC_ERRORS.keys(): + return self.DBC_ERRORS[self.err] + else: + return self.err + + def __str__(self): + return "" % self.err + + def __repr__(self): + return "" % self.err + + +class DeathByCaptcha(Hook): + __name__ = "DeathByCaptcha" + __type__ = "hook" + __version__ = "0.03" + + __config__ = [("activated", "bool", "Activated", False), + ("username", "str", "Username", ""), + ("passkey", "password", "Password", ""), + ("force", "bool", "Force DBC even if client is connected", False)] + + __description__ = """Send captchas to DeathByCaptcha.com""" + __author_name__ = ("RaNaN", "zoidberg") + __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") + + API_URL = "http://api.dbcapi.me/api/" + + + def setup(self): + self.info = {} + + def call_api(self, api="captcha", post=False, multipart=False): + req = getRequest() + req.c.setopt(HTTPHEADER, ["Accept: application/json", "User-Agent: pyLoad %s" % self.core.version]) + + if post: + if not isinstance(post, dict): + post = {} + post.update({"username": self.getConfig("username"), + "password": self.getConfig("passkey")}) + + response = None + try: + json = req.load("%s%s" % (self.API_URL, api), + post=post, + multipart=multipart) + self.logDebug(json) + response = json_loads(json) + + if "error" in response: + raise DeathByCaptchaException(response['error']) + elif "status" not in response: + raise DeathByCaptchaException(str(response)) + + except BadHeader, e: + if 403 == e.code: + raise DeathByCaptchaException('not-logged-in') + elif 413 == e.code: + raise DeathByCaptchaException('invalid-captcha') + elif 503 == e.code: + raise DeathByCaptchaException('service-overload') + elif e.code in (400, 405): + raise DeathByCaptchaException('invalid-request') + else: + raise + + finally: + req.close() + + return response + + def getCredits(self): + response = self.call_api("user", True) + + if 'is_banned' in response and response['is_banned']: + raise DeathByCaptchaException('banned') + elif 'balance' in response and 'rate' in response: + self.info.update(response) + else: + raise DeathByCaptchaException(response) + + def getStatus(self): + response = self.call_api("status", False) + + if 'is_service_overloaded' in response and response['is_service_overloaded']: + raise DeathByCaptchaException('service-overload') + + def submit(self, captcha, captchaType="file", match=None): + #workaround multipart-post bug in HTTPRequest.py + if re.match("^[A-Za-z0-9]*$", self.getConfig("passkey")): + multipart = True + data = (FORM_FILE, captcha) + else: + multipart = False + with open(captcha, 'rb') as f: + data = f.read() + data = "base64:" + b64encode(data) + + response = self.call_api("captcha", {"captchafile": data}, multipart) + + if "captcha" not in response: + raise DeathByCaptchaException(response) + ticket = response['captcha'] + + for _ in xrange(24): + sleep(5) + response = self.call_api("captcha/%d" % ticket, False) + if response['text'] and response['is_correct']: + break + else: + raise DeathByCaptchaException('timed-out') + + result = response['text'] + self.logDebug("result %s : %s" % (ticket, result)) + + return ticket, result + + def newCaptchaTask(self, task): + if "service" in task.data: + return False + + if not task.isTextual(): + return False + + if not self.getConfig("username") or not self.getConfig("passkey"): + return False + + if self.core.isClientConnected() and not self.getConfig("force"): + return False + + try: + self.getStatus() + self.getCredits() + except DeathByCaptchaException, e: + self.logError(e.getDesc()) + return False + + balance, rate = self.info['balance'], self.info['rate'] + self.logInfo("Account balance: US$%.3f (%d captchas left at %.2f cents each)" % (balance / 100, + balance // rate, rate)) + + if balance > rate: + task.handler.append(self) + task.data['service'] = self.__name__ + task.setWaiting(180) + start_new_thread(self.processCaptcha, (task,)) + + def captchaInvalid(self, task): + if task.data['service'] == self.__name__ and "ticket" in task.data: + try: + response = self.call_api("captcha/%d/report" % task.data['ticket'], True) + except DeathByCaptchaException, e: + self.logError(e.getDesc()) + except Exception, e: + self.logError(e) + + def processCaptcha(self, task): + c = task.captchaFile + try: + ticket, result = self.submit(c) + except DeathByCaptchaException, e: + task.error = e.getCode() + self.logError(e.getDesc()) + return + + task.data['ticket'] = ticket + task.setResult(result) diff --git a/pyload/plugins/hooks/DebridItaliaCom.py b/pyload/plugins/hooks/DebridItaliaCom.py new file mode 100644 index 000000000..4272b758f --- /dev/null +++ b/pyload/plugins/hooks/DebridItaliaCom.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class DebridItaliaCom(MultiHoster): + __name__ = "DebridItaliaCom" + __type__ = "hook" + __version__ = "0.07" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to standard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """Debriditalia.com hook plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + + def getHoster(self): + return ["netload.in", "hotfile.com", "rapidshare.com", "multiupload.com", + "uploading.com", "megashares.com", "crocko.com", "filepost.com", + "bitshare.com", "share-links.biz", "putlocker.com", "uploaded.to", + "speedload.org", "rapidgator.net", "likeupload.net", "cyberlocker.ch", + "depositfiles.com", "extabit.com", "filefactory.com", "sharefiles.co", + "ryushare.com", "tusfiles.net", "nowvideo.co", "cloudzer.net", "letitbit.net", + "easybytez.com", "uptobox.com", "ddlstorage.com"] diff --git a/pyload/plugins/hooks/DeleteFinished.py b/pyload/plugins/hooks/DeleteFinished.py new file mode 100644 index 000000000..99aa040bf --- /dev/null +++ b/pyload/plugins/hooks/DeleteFinished.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +from pyload.database import style +from pyload.plugins.Hook import Hook + + +class DeleteFinished(Hook): + __name__ = "DeleteFinished" + __type__ = "hook" + __version__ = "1.09" + + __config__ = [('activated', 'bool', 'Activated', 'False'), + ('interval', 'int', 'Delete every (hours)', '72'), + ('deloffline', 'bool', 'Delete packages with offline links', 'False')] + + __description__ = """Automatically delete all finished packages from queue""" + __author_name__ = "Walter Purcaro" + __author_mail__ = "vuolter@gmail.com" + + + ## overwritten methods ## + def periodical(self): + if not self.info['sleep']: + deloffline = self.getConfig('deloffline') + mode = '0,1,4' if deloffline else '0,4' + msg = 'delete all finished packages in queue list (%s packages with offline links)' + self.logInfo(msg % ('including' if deloffline else 'excluding')) + self.deleteFinished(mode) + self.info['sleep'] = True + self.addEvent('packageFinished', self.wakeup) + + def pluginConfigChanged(self, plugin, name, value): + if name == 'interval' and value != self.interval: + self.interval = value * 3600 + self.initPeriodical() + + def unload(self): + self.removeEvent('packageFinished', self.wakeup) + + def coreReady(self): + self.info = {'sleep': True} + interval = self.getConfig('interval') + self.pluginConfigChanged('DeleteFinished', 'interval', interval) + self.addEvent('packageFinished', self.wakeup) + + ## own methods ## + @style.queue + def deleteFinished(self, mode): + self.c.execute('DELETE FROM packages WHERE NOT EXISTS(SELECT 1 FROM links WHERE package=packages.id AND status NOT IN (%s))' % mode) + self.c.execute('DELETE FROM links WHERE NOT EXISTS(SELECT 1 FROM packages WHERE id=links.package)') + + def wakeup(self, pypack): + self.removeEvent('packageFinished', self.wakeup) + self.info['sleep'] = False + + ## event managing ## + def addEvent(self, event, func): + """Adds an event listener for event name""" + if event in self.m.events: + if func in self.m.events[event]: + self.logDebug('Function already registered %s' % func) + else: + self.m.events[event].append(func) + else: + self.m.events[event] = [func] + + def setup(self): + self.m = self.manager + self.removeEvent = self.m.removeEvent diff --git a/pyload/plugins/hooks/DownloadScheduler.py b/pyload/plugins/hooks/DownloadScheduler.py new file mode 100644 index 000000000..fc2e10aac --- /dev/null +++ b/pyload/plugins/hooks/DownloadScheduler.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +import re + +from time import localtime + +from pyload.plugins.Hook import Hook + + +class DownloadScheduler(Hook): + __name__ = "DownloadScheduler" + __type__ = "hook" + __version__ = "0.21" + + __config__ = [("activated", "bool", "Activated", False), + ("timetable", "str", "List time periods as hh:mm full or number(kB/s)", + "0:00 full, 7:00 250, 10:00 0, 17:00 150"), + ("abort", "bool", "Abort active downloads when start period with speed 0", False)] + + __description__ = """Download Scheduler""" + __author_name__ = ("zoidberg", "stickell") + __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it") + + + def setup(self): + self.cb = None # callback to scheduler job; will be by removed hookmanager when hook unloaded + + def coreReady(self): + self.updateSchedule() + + def updateSchedule(self, schedule=None): + if schedule is None: + schedule = self.getConfig("timetable") + + schedule = re.findall("(\d{1,2}):(\d{2})[\s]*(-?\d+)", + schedule.lower().replace("full", "-1").replace("none", "0")) + if not schedule: + self.logError("Invalid schedule") + return + + t0 = localtime() + now = (t0.tm_hour, t0.tm_min, t0.tm_sec, "X") + schedule = sorted([(int(x[0]), int(x[1]), 0, int(x[2])) for x in schedule] + [now]) + + self.logDebug("Schedule", schedule) + + for i, v in enumerate(schedule): + if v[3] == "X": + last, next = schedule[i - 1], schedule[(i + 1) % len(schedule)] + self.logDebug("Now/Last/Next", now, last, next) + + self.setDownloadSpeed(last[3]) + + next_time = (((24 + next[0] - now[0]) * 60 + next[1] - now[1]) * 60 + next[2] - now[2]) % 86400 + self.core.scheduler.removeJob(self.cb) + self.cb = self.core.scheduler.addJob(next_time, self.updateSchedule, threaded=False) + + def setDownloadSpeed(self, speed): + if speed == 0: + abort = self.getConfig("abort") + self.logInfo("Stopping download server. (Running downloads will %sbe aborted.)" % ('' if abort else 'not ')) + self.core.api.pauseServer() + if abort: + self.core.api.stopAllDownloads() + else: + self.core.api.unpauseServer() + + if speed > 0: + self.logInfo("Setting download speed to %d kB/s" % speed) + self.core.api.setConfigValue("download", "limit_speed", 1) + self.core.api.setConfigValue("download", "max_speed", speed) + else: + self.logInfo("Setting download speed to FULL") + self.core.api.setConfigValue("download", "limit_speed", 0) + self.core.api.setConfigValue("download", "max_speed", -1) diff --git a/pyload/plugins/hooks/EasybytezCom.py b/pyload/plugins/hooks/EasybytezCom.py new file mode 100644 index 000000000..1ec8a98f1 --- /dev/null +++ b/pyload/plugins/hooks/EasybytezCom.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class EasybytezCom(MultiHoster): + __name__ = "EasybytezCom" + __type__ = "hook" + __version__ = "0.03" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", "")] + + __description__ = """EasyBytez.com hook plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + + def getHoster(self): + self.account = self.core.accountManager.getAccountPlugin(self.__name__) + user = self.account.selectAccount()[0] + + try: + req = self.account.getAccountRequest(user) + page = req.load("http://www.easybytez.com") + + m = re.search(r'\s*Supported sites:(.*)', page) + return m.group(1).split(',') + except Exception, e: + self.logDebug(e) + self.logWarning("Unable to load supported hoster list, using last known") + return ["bitshare.com", "crocko.com", "ddlstorage.com", "depositfiles.com", "extabit.com", "hotfile.com", + "mediafire.com", "netload.in", "rapidgator.net", "rapidshare.com", "uploading.com", "uload.to", + "uploaded.to"] diff --git a/pyload/plugins/hooks/Ev0InFetcher.py b/pyload/plugins/hooks/Ev0InFetcher.py new file mode 100644 index 000000000..5c2022bac --- /dev/null +++ b/pyload/plugins/hooks/Ev0InFetcher.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +from time import mktime, time + +from pyload.lib import feedparser + +from pyload.plugins.Hook import Hook + + +class Ev0InFetcher(Hook): + __name__ = "Ev0InFetcher" + __type__ = "hook" + __version__ = "0.21" + + __config__ = [("activated", "bool", "Activated", False), + ("interval", "int", "Check interval in minutes", 10), + ("queue", "bool", "Move new shows directly to Queue", False), + ("shows", "str", "Shows to check for (comma seperated)", ""), + ("quality", "xvid;x264;rmvb", "Video Format", "xvid"), + ("hoster", "str", "Hoster to use (comma seperated)", + "NetloadIn,RapidshareCom,MegauploadCom,HotfileCom")] + + __description__ = """Checks rss feeds for Ev0.in""" + __author_name__ = "mkaay" + __author_mail__ = "mkaay@mkaay.de" + + + def setup(self): + self.interval = self.getConfig("interval") * 60 + + def filterLinks(self, links): + results = self.core.pluginManager.parseUrls(links) + sortedLinks = {} + + for url, hoster in results: + if hoster not in sortedLinks: + sortedLinks[hoster] = [] + sortedLinks[hoster].append(url) + + for h in self.getConfig("hoster").split(","): + try: + return sortedLinks[h.strip()] + except: + continue + return [] + + + def periodical(self): + + def normalizefiletitle(filename): + filename = filename.replace('.', ' ') + filename = filename.replace('_', ' ') + filename = filename.lower() + return filename + + shows = [s.strip() for s in self.getConfig("shows").split(",")] + + feed = feedparser.parse("http://feeds.feedburner.com/ev0in/%s?format=xml" % self.getConfig("quality")) + + showStorage = {} + for show in shows: + showStorage[show] = int(self.getStorage("show_%s_lastfound" % show, 0)) + + found = False + for item in feed['items']: + for show, lastfound in showStorage.iteritems(): + if show.lower() in normalizefiletitle(item['title']) and lastfound < int(mktime(item.date_parsed)): + links = self.filterLinks(item['description'].split("
        ")) + packagename = item['title'].encode("utf-8") + self.logInfo("Ev0InFetcher: new episode '%s' (matched '%s')" % (packagename, show)) + self.core.api.addPackage(packagename, links, 1 if self.getConfig("queue") else 0) + self.setStorage("show_%s_lastfound" % show, int(mktime(item.date_parsed))) + found = True + if not found: + #self.logDebug("Ev0InFetcher: no new episodes found") + pass + + for show, lastfound in self.getStorage().iteritems(): + if int(lastfound) > 0 and int(lastfound) + (3600 * 24 * 30) < int(time()): + self.delStorage("show_%s_lastfound" % show) + self.logDebug("Ev0InFetcher: cleaned '%s' record" % show) diff --git a/pyload/plugins/hooks/ExpertDecoders.py b/pyload/plugins/hooks/ExpertDecoders.py new file mode 100644 index 000000000..ef5409b76 --- /dev/null +++ b/pyload/plugins/hooks/ExpertDecoders.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +from base64 import b64encode +from pycurl import LOW_SPEED_TIME +from thread import start_new_thread +from uuid import uuid4 + +from pyload.network.HTTPRequest import BadHeader +from pyload.network.RequestFactory import getURL, getRequest +from pyload.plugins.Hook import Hook + + +class ExpertDecoders(Hook): + __name__ = "ExpertDecoders" + __type__ = "hook" + __version__ = "0.01" + + __config__ = [("activated", "bool", "Activated", False), + ("force", "bool", "Force CT even if client is connected", False), + ("passkey", "password", "Access key", "")] + + __description__ = """Send captchas to expertdecoders.com""" + __author_name__ = ("RaNaN", "zoidberg") + __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") + + API_URL = "http://www.fasttypers.org/imagepost.ashx" + + + def setup(self): + self.info = {} + + def getCredits(self): + response = getURL(self.API_URL, post={"key": self.getConfig("passkey"), "action": "balance"}) + + if response.isdigit(): + self.logInfo(_("%s credits left") % response) + self.info['credits'] = credits = int(response) + return credits + else: + self.logError(response) + return 0 + + def processCaptcha(self, task): + task.data['ticket'] = ticket = uuid4() + result = None + + with open(task.captchaFile, 'rb') as f: + data = f.read() + data = b64encode(data) + #self.logDebug("%s: %s : %s" % (ticket, task.captchaFile, data)) + + req = getRequest() + #raise timeout threshold + req.c.setopt(LOW_SPEED_TIME, 80) + + try: + result = req.load(self.API_URL, post={"action": "upload", "key": self.getConfig("passkey"), + "file": data, "gen_task_id": ticket}) + finally: + req.close() + + self.logDebug("result %s : %s" % (ticket, result)) + task.setResult(result) + + def newCaptchaTask(self, task): + if not task.isTextual(): + return False + + if not self.getConfig("passkey"): + return False + + if self.core.isClientConnected() and not self.getConfig("force"): + return False + + if self.getCredits() > 0: + task.handler.append(self) + task.setWaiting(100) + start_new_thread(self.processCaptcha, (task,)) + + else: + self.logInfo(_("Your ExpertDecoders Account has not enough credits")) + + def captchaInvalid(self, task): + if "ticket" in task.data: + + try: + response = getURL(self.API_URL, post={"action": "refund", "key": self.getConfig("passkey"), + "gen_task_id": task.data['ticket']}) + self.logInfo("Request refund: %s" % response) + + except BadHeader, e: + self.logError("Could not send refund request.", str(e)) diff --git a/pyload/plugins/hooks/ExternalScripts.py b/pyload/plugins/hooks/ExternalScripts.py new file mode 100644 index 000000000..372035e82 --- /dev/null +++ b/pyload/plugins/hooks/ExternalScripts.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- + +import subprocess + +from os import listdir, access, X_OK, makedirs +from os.path import join, exists, basename, abspath + +from pyload.plugins.Hook import Hook +from pyload.utils import safe_join + + +class ExternalScripts(Hook): + __name__ = "ExternalScripts" + __type__ = "hook" + __version__ = "0.23" + + __config__ = [("activated", "bool", "Activated", True)] + + __description__ = """Run external scripts""" + __author_name__ = ("mkaay", "RaNaN", "spoob") + __author_mail__ = ("mkaay@mkaay.de", "ranan@pyload.org", "spoob@pyload.org") + + event_list = ["unrarFinished", "allDownloadsFinished", "allDownloadsProcessed"] + + + def setup(self): + self.scripts = {} + + folders = ["download_preparing", "download_finished", "package_finished", + "before_reconnect", "after_reconnect", "unrar_finished", + "all_dls_finished", "all_dls_processed"] + + for folder in folders: + self.scripts[folder] = [] + + self.initPluginType(folder, join(pypath, 'scripts', folder)) + self.initPluginType(folder, join('scripts', folder)) + + for script_type, names in self.scripts.iteritems(): + if names: + self.logInfo((_("Installed scripts for %s: ") % script_type) + ", ".join([basename(x) for x in names])) + + def initPluginType(self, folder, path): + if not exists(path): + try: + makedirs(path) + except: + self.logDebug("Script folder %s not created" % folder) + return + + for f in listdir(path): + if f.startswith("#") or f.startswith(".") or f.startswith("_") or f.endswith("~") or f.endswith(".swp"): + continue + + if not access(join(path, f), X_OK): + self.logWarning(_("Script not executable:") + " %s/%s" % (folder, f)) + + self.scripts[folder].append(join(path, f)) + + def callScript(self, script, *args): + try: + cmd = [script] + [str(x) if not isinstance(x, basestring) else x for x in args] + self.logDebug("Executing %(script)s: %(cmd)s" % {"script": abspath(script), "cmd": " ".join(cmd)}) + #output goes to pyload + subprocess.Popen(cmd, bufsize=-1) + except Exception, e: + self.logError(_("Error in %(script)s: %(error)s") % {"script": basename(script), "error": str(e)}) + + def downloadPreparing(self, pyfile): + for script in self.scripts['download_preparing']: + self.callScript(script, pyfile.pluginname, pyfile.url, pyfile.id) + + def downloadFinished(self, pyfile): + for script in self.scripts['download_finished']: + self.callScript(script, pyfile.pluginname, pyfile.url, pyfile.name, + safe_join(self.config['general']['download_folder'], + pyfile.package().folder, pyfile.name), pyfile.id) + + def packageFinished(self, pypack): + for script in self.scripts['package_finished']: + folder = self.config['general']['download_folder'] + folder = safe_join(folder, pypack.folder) + + self.callScript(script, pypack.name, folder, pypack.password, pypack.id) + + def beforeReconnecting(self, ip): + for script in self.scripts['before_reconnect']: + self.callScript(script, ip) + + def afterReconnecting(self, ip): + for script in self.scripts['after_reconnect']: + self.callScript(script, ip) + + def unrarFinished(self, folder, fname): + for script in self.scripts['unrar_finished']: + self.callScript(script, folder, fname) + + def allDownloadsFinished(self): + for script in self.scripts['all_dls_finished']: + self.callScript(script) + + def allDownloadsProcessed(self): + for script in self.scripts['all_dls_processed']: + self.callScript(script) diff --git a/pyload/plugins/hooks/ExtractArchive.py b/pyload/plugins/hooks/ExtractArchive.py new file mode 100644 index 000000000..1a2da53ad --- /dev/null +++ b/pyload/plugins/hooks/ExtractArchive.py @@ -0,0 +1,320 @@ +# -*- coding: utf-8 -*- + +import os +import sys + +from copy import copy +from os import remove, chmod, makedirs +from os.path import exists, basename, isfile, isdir +from traceback import print_exc + +# monkey patch bug in python 2.6 and lower +# http://bugs.python.org/issue6122 , http://bugs.python.org/issue1236 , http://bugs.python.org/issue1731717 +if sys.version_info < (2, 7) and os.name != "nt": + import errno + from subprocess import Popen + + def _eintr_retry_call(func, *args): + while True: + try: + return func(*args) + except OSError, e: + if e.errno == errno.EINTR: + continue + raise + + # unsued timeout option for older python version + def wait(self, timeout=0): + """Wait for child process to terminate. Returns returncode + attribute.""" + if self.returncode is None: + try: + pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) + except OSError, e: + if e.errno != errno.ECHILD: + raise + # This happens if SIGCLD is set to be ignored or waiting + # for child processes has otherwise been disabled for our + # process. This child is dead, we can't get the status. + sts = 0 + self._handle_exitstatus(sts) + return self.returncode + + Popen.wait = wait + +if os.name != "nt": + from grp import getgrnam + from os import chown + from pwd import getpwnam + +from pyload.plugins.Hook import Hook, threaded, Expose +from pyload.plugins.internal.AbstractExtractor import ArchiveError, CRCError, WrongPassword +from pyload.utils import safe_join, fs_encode + + +class ExtractArchive(Hook): + """ + Provides: unrarFinished (folder, filename) + """ + __name__ = "ExtractArchive" + __type__ = "hook" + __version__ = "0.16" + + __config__ = [("activated", "bool", "Activated", True), + ("fullpath", "bool", "Extract full path", True), + ("overwrite", "bool", "Overwrite files", True), + ("passwordfile", "file", "password file", "unrar_passwords.txt"), + ("deletearchive", "bool", "Delete archives when done", False), + ("subfolder", "bool", "Create subfolder for each package", False), + ("destination", "folder", "Extract files to", ""), + ("excludefiles", "str", "Exclude files from unpacking (seperated by ;)", ""), + ("recursive", "bool", "Extract archives in archvies", True), + ("queue", "bool", "Wait for all downloads to be finished", True), + ("renice", "int", "CPU Priority", 0)] + + __description__ = """Extract different kind of archives""" + __author_name__ = ("pyLoad Team", "AndroKev") + __author_mail__ = ("admin@pyload.org", "@pyloadforum") + + event_list = ["allDownloadsProcessed"] + + + def setup(self): + self.plugins = [] + self.passwords = [] + names = [] + + for p in ("UnRar", "UnZip"): + try: + module = self.core.pluginManager.loadModule("internal", p) + klass = getattr(module, p) + if klass.checkDeps(): + names.append(p) + self.plugins.append(klass) + + except OSError, e: + if e.errno == 2: + self.logInfo(_("No %s installed") % p) + else: + self.logWarning(_("Could not activate %s") % p, str(e)) + if self.core.debug: + print_exc() + + except Exception, e: + self.logWarning(_("Could not activate %s") % p, str(e)) + if self.core.debug: + print_exc() + + if names: + self.logInfo(_("Activated") + " " + " ".join(names)) + else: + self.logInfo(_("No Extract plugins activated")) + + # queue with package ids + self.queue = [] + + @Expose + def extractPackage(self, id): + """ Extract package with given id""" + self.manager.startThread(self.extract, [id]) + + def packageFinished(self, pypack): + if self.getConfig("queue"): + self.logInfo(_("Package %s queued for later extracting") % pypack.name) + self.queue.append(pypack.id) + else: + self.manager.startThread(self.extract, [pypack.id]) + + @threaded + def allDownloadsProcessed(self, thread): + local = copy(self.queue) + del self.queue[:] + self.extract(local, thread) + + def extract(self, ids, thread=None): + # reload from txt file + self.reloadPasswords() + + # dl folder + dl = self.config['general']['download_folder'] + + extracted = [] + + #iterate packages -> plugins -> targets + for pid in ids: + p = self.core.files.getPackage(pid) + self.logInfo(_("Check package %s") % p.name) + if not p: + continue + + # determine output folder + out = safe_join(dl, p.folder, "") + # force trailing slash + + if self.getConfig("destination") and self.getConfig("destination").lower() != "none": + + out = safe_join(dl, p.folder, self.getConfig("destination"), "") + #relative to package folder if destination is relative, otherwise absolute path overwrites them + + if self.getConfig("subfolder"): + out = safe_join(out, fs_encode(p.folder)) + + if not exists(out): + makedirs(out) + + files_ids = [(safe_join(dl, p.folder, x['name']), x['id']) for x in p.getChildren().itervalues()] + matched = False + + # check as long there are unseen files + while files_ids: + new_files_ids = [] + + for plugin in self.plugins: + targets = plugin.getTargets(files_ids) + if targets: + self.logDebug("Targets for %s: %s" % (plugin.__name__, targets)) + matched = True + for target, fid in targets: + if target in extracted: + self.logDebug(basename(target), "skipped") + continue + extracted.append(target) # prevent extracting same file twice + + klass = plugin(self, target, out, self.getConfig("fullpath"), self.getConfig("overwrite"), self.getConfig("excludefiles"), + self.getConfig("renice")) + klass.init() + + self.logInfo(basename(target), _("Extract to %s") % out) + new_files = self.startExtracting(klass, fid, p.password.strip().splitlines(), thread) + self.logDebug("Extracted: %s" % new_files) + self.setPermissions(new_files) + + for file in new_files: + if not exists(file): + self.logDebug("new file %s does not exists" % file) + continue + if self.getConfig("recursive") and isfile(file): + new_files_ids.append((file, fid)) # append as new target + + files_ids = new_files_ids # also check extracted files + + if not matched: + self.logInfo(_("No files found to extract")) + + def startExtracting(self, plugin, fid, passwords, thread): + pyfile = self.core.files.getFile(fid) + if not pyfile: + return [] + + pyfile.setCustomStatus(_("extracting")) + thread.addActive(pyfile) # keep this file until everything is done + + try: + progress = lambda x: pyfile.setProgress(x) + success = False + + if not plugin.checkArchive(): + plugin.extract(progress) + success = True + else: + self.logInfo(basename(plugin.file), _("Password protected")) + self.logDebug("Passwords: %s" % str(passwords)) + + pwlist = copy(self.getPasswords()) + #remove already supplied pws from list (only local) + for pw in passwords: + if pw in pwlist: + pwlist.remove(pw) + + for pw in passwords + pwlist: + try: + self.logDebug("Try password: %s" % pw) + if plugin.checkPassword(pw): + plugin.extract(progress, pw) + self.addPassword(pw) + success = True + break + except WrongPassword: + self.logDebug("Password was wrong") + + if not success: + self.logError(basename(plugin.file), _("Wrong password")) + return [] + + if self.core.debug: + self.logDebug("Would delete: %s" % ", ".join(plugin.getDeleteFiles())) + + if self.getConfig("deletearchive"): + files = plugin.getDeleteFiles() + self.logInfo(_("Deleting %s files") % len(files)) + for f in files: + if exists(f): + remove(f) + else: + self.logDebug("%s does not exists" % f) + + self.logInfo(basename(plugin.file), _("Extracting finished")) + self.manager.dispatchEvent("unrarFinished", plugin.out, plugin.file) + + return plugin.getExtractedFiles() + + except ArchiveError, e: + self.logError(basename(plugin.file), _("Archive Error"), str(e)) + except CRCError: + self.logError(basename(plugin.file), _("CRC Mismatch")) + except Exception, e: + if self.core.debug: + print_exc() + self.logError(basename(plugin.file), _("Unknown Error"), str(e)) + + return [] + + @Expose + def getPasswords(self): + """ List of saved passwords """ + return self.passwords + + def reloadPasswords(self): + pwfile = self.getConfig("passwordfile") + if not exists(pwfile): + open(pwfile, "wb").close() + + passwords = [] + f = open(pwfile, "rb") + for pw in f.read().splitlines(): + passwords.append(pw) + f.close() + + self.passwords = passwords + + @Expose + def addPassword(self, pw): + """ Adds a password to saved list""" + pwfile = self.getConfig("passwordfile") + + if pw in self.passwords: + self.passwords.remove(pw) + self.passwords.insert(0, pw) + + f = open(pwfile, "wb") + for pw in self.passwords: + f.write(pw + "\n") + f.close() + + def setPermissions(self, files): + for f in files: + if not exists(f): + continue + try: + if self.config['permission']['change_file']: + if isfile(f): + chmod(f, int(self.config['permission']['file'], 8)) + elif isdir(f): + chmod(f, int(self.config['permission']['folder'], 8)) + + if self.config['permission']['change_dl'] and os.name != "nt": + uid = getpwnam(self.config['permission']['user'])[2] + gid = getgrnam(self.config['permission']['group'])[2] + chown(f, uid, gid) + except Exception, e: + self.logWarning(_("Setting User and Group failed"), e) diff --git a/pyload/plugins/hooks/FastixRu.py b/pyload/plugins/hooks/FastixRu.py new file mode 100644 index 000000000..966bc6bd3 --- /dev/null +++ b/pyload/plugins/hooks/FastixRu.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +from pyload.common.json_layer import json_loads +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class FastixRu(MultiHoster): + __name__ = "FastixRu" + __type__ = "hook" + __version__ = "0.02" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("unloadFailing", "bool", "Revert to standard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """Fastix.ru hook plugin""" + __author_name__ = "Massimo Rosamilia" + __author_mail__ = "max@spiritix.eu" + + + def getHoster(self): + page = getURL( + "http://fastix.ru/api_v2/?apikey=5182964c3f8f9a7f0b00000a_kelmFB4n1IrnCDYuIFn2y&sub=allowed_sources") + host_list = json_loads(page) + host_list = host_list['allow'] + return host_list diff --git a/pyload/plugins/hooks/FreeWayMe.py b/pyload/plugins/hooks/FreeWayMe.py new file mode 100644 index 000000000..35b275067 --- /dev/null +++ b/pyload/plugins/hooks/FreeWayMe.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class FreeWayMe(MultiHoster): + __name__ = "FreeWayMe" + __type__ = "hook" + __version__ = "0.11" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to stanard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """FreeWay.me hook plugin""" + __author_name__ = "Nicolas Giese" + __author_mail__ = "james@free-way.me" + + + def getHoster(self): + hostis = getURL("https://www.free-way.me/ajax/jd.php", get={"id": 3}).replace("\"", "").strip() + self.logDebug("hosters: %s" % hostis) + return [x.strip() for x in hostis.split(",") if x.strip()] diff --git a/pyload/plugins/hooks/HotFolder.py b/pyload/plugins/hooks/HotFolder.py new file mode 100644 index 000000000..f76e95af4 --- /dev/null +++ b/pyload/plugins/hooks/HotFolder.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- + +import time + +from os import listdir, makedirs +from os.path import exists, isfile, join +from shutil import move + +from pyload.plugins.Hook import Hook + + +class HotFolder(Hook): + __name__ = "HotFolder" + __type__ = "hook" + __version__ = "0.11" + + __config__ = [("activated", "bool", "Activated", False), + ("folder", "str", "Folder to observe", "container"), + ("watch_file", "bool", "Observe link file", False), + ("keep", "bool", "Keep added containers", True), + ("file", "str", "Link file", "links.txt")] + + __description__ = """Observe folder and file for changes and add container and links""" + __author_name__ = "RaNaN" + __author_mail__ = "RaNaN@pyload.de" + + + def setup(self): + self.interval = 10 + + def periodical(self): + if not exists(join(self.getConfig("folder"), "finished")): + makedirs(join(self.getConfig("folder"), "finished")) + + if self.getConfig("watch_file"): + + if not exists(self.getConfig("file")): + f = open(self.getConfig("file"), "wb") + f.close() + + f = open(self.getConfig("file"), "rb") + content = f.read().strip() + f.close() + f = open(self.getConfig("file"), "wb") + f.close() + if content: + name = "%s_%s.txt" % (self.getConfig("file"), time.strftime("%H-%M-%S_%d%b%Y")) + + f = open(join(self.getConfig("folder"), "finished", name), "wb") + f.write(content) + f.close() + + self.core.api.addPackage(f.name, [f.name], 1) + + for f in listdir(self.getConfig("folder")): + path = join(self.getConfig("folder"), f) + + if not isfile(path) or f.endswith("~") or f.startswith("#") or f.startswith("."): + continue + + newpath = join(self.getConfig("folder"), "finished", f if self.getConfig("keep") else "tmp_" + f) + move(path, newpath) + + self.logInfo(_("Added %s from HotFolder") % f) + self.core.api.addPackage(f, [newpath], 1) diff --git a/pyload/plugins/hooks/IRCInterface.py b/pyload/plugins/hooks/IRCInterface.py new file mode 100644 index 000000000..af8d8fa69 --- /dev/null +++ b/pyload/plugins/hooks/IRCInterface.py @@ -0,0 +1,404 @@ +# -*- coding: utf-8 -*- + +import re +import socket +import time + +from pycurl import FORM_FILE +from select import select +from threading import Thread +from time import sleep +from traceback import print_exc + +from pyload.Api import PackageDoesNotExists, FileDoesNotExists +from pyload.network.RequestFactory import getURL +from pyload.plugins.Hook import Hook +from pyload.utils import formatSize + + +class IRCInterface(Thread, Hook): + __name__ = "IRCInterface" + __type__ = "hook" + __version__ = "0.11" + + __config__ = [("activated", "bool", "Activated", False), + ("host", "str", "IRC-Server Address", "Enter your server here!"), + ("port", "int", "IRC-Server Port", 6667), + ("ident", "str", "Clients ident", "pyload-irc"), + ("realname", "str", "Realname", "pyload-irc"), + ("nick", "str", "Nickname the Client will take", "pyLoad-IRC"), + ("owner", "str", "Nickname the Client will accept commands from", "Enter your nick here!"), + ("info_file", "bool", "Inform about every file finished", False), + ("info_pack", "bool", "Inform about every package finished", True), + ("captcha", "bool", "Send captcha requests", True)] + + __description__ = """Connect to irc and let owner perform different tasks""" + __author_name__ = "Jeix" + __author_mail__ = "Jeix@hasnomail.com" + + + def __init__(self, core, manager): + Thread.__init__(self) + Hook.__init__(self, core, manager) + self.setDaemon(True) + # self.sm = core.server_methods + self.api = core.api # todo, only use api + + def coreReady(self): + self.abort = False + self.more = [] + self.new_package = {} + + self.start() + + def packageFinished(self, pypack): + try: + if self.getConfig("info_pack"): + self.response(_("Package finished: %s") % pypack.name) + except: + pass + + def downloadFinished(self, pyfile): + try: + if self.getConfig("info_file"): + self.response( + _("Download finished: %(name)s @ %(plugin)s ") % {"name": pyfile.name, "plugin": pyfile.pluginname}) + except: + pass + + def newCaptchaTask(self, task): + if self.getConfig("captcha") and task.isTextual(): + task.handler.append(self) + task.setWaiting(60) + + page = getURL("http://www.freeimagehosting.net/upload.php", + post={"attached": (FORM_FILE, task.captchaFile)}, multipart=True) + + url = re.search(r"\[img\]([^\[]+)\[/img\]\[/url\]", page).group(1) + self.response(_("New Captcha Request: %s") % url) + self.response(_("Answer with 'c %s text on the captcha'") % task.id) + + def run(self): + # connect to IRC etc. + self.sock = socket.socket() + host = self.getConfig("host") + self.sock.connect((host, self.getConfig("port"))) + nick = self.getConfig("nick") + self.sock.send("NICK %s\r\n" % nick) + self.sock.send("USER %s %s bla :%s\r\n" % (nick, host, nick)) + for t in self.getConfig("owner").split(): + if t.strip().startswith("#"): + self.sock.send("JOIN %s\r\n" % t.strip()) + self.logInfo("pyLoad IRC: Connected to %s!" % host) + self.logInfo("pyLoad IRC: Switching to listening mode!") + try: + self.main_loop() + + except IRCError, ex: + self.sock.send("QUIT :byebye\r\n") + print_exc() + self.sock.close() + + def main_loop(self): + readbuffer = "" + while True: + sleep(1) + fdset = select([self.sock], [], [], 0) + if self.sock not in fdset[0]: + continue + + if self.abort: + raise IRCError("quit") + + readbuffer += self.sock.recv(1024) + temp = readbuffer.split("\n") + readbuffer = temp.pop() + + for line in temp: + line = line.rstrip() + first = line.split() + + if first[0] == "PING": + self.sock.send("PONG %s\r\n" % first[1]) + + if first[0] == "ERROR": + raise IRCError(line) + + msg = line.split(None, 3) + if len(msg) < 4: + continue + + msg = { + "origin": msg[0][1:], + "action": msg[1], + "target": msg[2], + "text": msg[3][1:] + } + + self.handle_events(msg) + + def handle_events(self, msg): + if not msg['origin'].split("!", 1)[0] in self.getConfig("owner").split(): + return + + if msg['target'].split("!", 1)[0] != self.getConfig("nick"): + return + + if msg['action'] != "PRIVMSG": + return + + # HANDLE CTCP ANTI FLOOD/BOT PROTECTION + if msg['text'] == "\x01VERSION\x01": + self.logDebug("Sending CTCP VERSION.") + self.sock.send("NOTICE %s :%s\r\n" % (msg['origin'], "pyLoad! IRC Interface")) + return + elif msg['text'] == "\x01TIME\x01": + self.logDebug("Sending CTCP TIME.") + self.sock.send("NOTICE %s :%d\r\n" % (msg['origin'], time.time())) + return + elif msg['text'] == "\x01LAG\x01": + self.logDebug("Received CTCP LAG.") # don't know how to answer + return + + trigger = "pass" + args = None + + try: + temp = msg['text'].split() + trigger = temp[0] + if len(temp) > 1: + args = temp[1:] + except: + pass + + handler = getattr(self, "event_%s" % trigger, self.event_pass) + try: + res = handler(args) + for line in res: + self.response(line, msg['origin']) + except Exception, e: + self.logError("pyLoad IRC: " + repr(e)) + + def response(self, msg, origin=""): + if origin == "": + for t in self.getConfig("owner").split(): + self.sock.send("PRIVMSG %s :%s\r\n" % (t.strip(), msg)) + else: + self.sock.send("PRIVMSG %s :%s\r\n" % (origin.split("!", 1)[0], msg)) + + #### Events + + def event_pass(self, args): + return [] + + def event_status(self, args): + downloads = self.api.statusDownloads() + if not downloads: + return ["INFO: There are no active downloads currently."] + + temp_progress = "" + lines = ["ID - Name - Status - Speed - ETA - Progress"] + for data in downloads: + + if data.status == 5: + temp_progress = data.format_wait + else: + temp_progress = "%d%% (%s)" % (data.percent, data.format_size) + + lines.append("#%d - %s - %s - %s - %s - %s" % + ( + data.fid, + data.name, + data.statusmsg, + "%s/s" % formatSize(data.speed), + "%s" % data.format_eta, + temp_progress + )) + return lines + + def event_queue(self, args): + ps = self.api.getQueueData() + + if not ps: + return ["INFO: There are no packages in queue."] + + lines = [] + for pack in ps: + lines.append('PACKAGE #%s: "%s" with %d links.' % (pack.pid, pack.name, len(pack.links))) + + return lines + + def event_collector(self, args): + ps = self.api.getCollectorData() + if not ps: + return ["INFO: No packages in collector!"] + + lines = [] + for pack in ps: + lines.append('PACKAGE #%s: "%s" with %d links.' % (pack.pid, pack.name, len(pack.links))) + + return lines + + def event_info(self, args): + if not args: + return ["ERROR: Use info like this: info "] + + info = None + try: + info = self.api.getFileData(int(args[0])) + + except FileDoesNotExists: + return ["ERROR: Link doesn't exists."] + + return ['LINK #%s: %s (%s) [%s][%s]' % (info.fid, info.name, info.format_size, info.statusmsg, info.plugin)] + + def event_packinfo(self, args): + if not args: + return ["ERROR: Use packinfo like this: packinfo "] + + lines = [] + pack = None + try: + pack = self.api.getPackageData(int(args[0])) + + except PackageDoesNotExists: + return ["ERROR: Package doesn't exists."] + + id = args[0] + + self.more = [] + + lines.append('PACKAGE #%s: "%s" with %d links' % (id, pack.name, len(pack.links))) + for pyfile in pack.links: + self.more.append('LINK #%s: %s (%s) [%s][%s]' % (pyfile.fid, pyfile.name, pyfile.format_size, + pyfile.statusmsg, pyfile.plugin)) + + if len(self.more) < 6: + lines.extend(self.more) + self.more = [] + else: + lines.extend(self.more[:6]) + self.more = self.more[6:] + lines.append("%d more links do display." % len(self.more)) + + return lines + + def event_more(self, args): + if not self.more: + return ["No more information to display."] + + lines = self.more[:6] + self.more = self.more[6:] + lines.append("%d more links do display." % len(self.more)) + + return lines + + def event_start(self, args): + self.api.unpauseServer() + return ["INFO: Starting downloads."] + + def event_stop(self, args): + self.api.pauseServer() + return ["INFO: No new downloads will be started."] + + def event_add(self, args): + if len(args) < 2: + return ['ERROR: Add links like this: "add links". ', + "This will add the link to to the package / the package with id !"] + + pack = args[0].strip() + links = [x.strip() for x in args[1:]] + + count_added = 0 + count_failed = 0 + try: + id = int(pack) + pack = self.api.getPackageData(id) + if not pack: + return ["ERROR: Package doesn't exists."] + + #TODO add links + + return ["INFO: Added %d links to Package %s [#%d]" % (len(links), pack['name'], id)] + + except: + # create new package + id = self.api.addPackage(pack, links, 1) + return ["INFO: Created new Package %s [#%d] with %d links." % (pack, id, len(links))] + + def event_del(self, args): + if len(args) < 2: + return ["ERROR: Use del command like this: del -p|-l [...] (-p indicates that the ids are from packages, -l indicates that the ids are from links)"] + + if args[0] == "-p": + ret = self.api.deletePackages(map(int, args[1:])) + return ["INFO: Deleted %d packages!" % len(args[1:])] + + elif args[0] == "-l": + ret = self.api.delLinks(map(int, args[1:])) + return ["INFO: Deleted %d links!" % len(args[1:])] + + else: + return ["ERROR: Use del command like this: del <-p|-l> [...] (-p indicates that the ids are from packages, -l indicates that the ids are from links)"] + + def event_push(self, args): + if not args: + return ["ERROR: Push package to queue like this: push "] + + id = int(args[0]) + try: + info = self.api.getPackageInfo(id) + except PackageDoesNotExists: + return ["ERROR: Package #%d does not exist." % id] + + self.api.pushToQueue(id) + return ["INFO: Pushed package #%d to queue." % id] + + def event_pull(self, args): + if not args: + return ["ERROR: Pull package from queue like this: pull ."] + + id = int(args[0]) + if not self.api.getPackageData(id): + return ["ERROR: Package #%d does not exist." % id] + + self.api.pullFromQueue(id) + return ["INFO: Pulled package #%d from queue to collector." % id] + + def event_c(self, args): + """ captcha answer """ + if not args: + return ["ERROR: Captcha ID missing."] + + task = self.core.captchaManager.getTaskByID(args[0]) + if not task: + return ["ERROR: Captcha Task with ID %s does not exists." % args[0]] + + task.setResult(" ".join(args[1:])) + return ["INFO: Result %s saved." % " ".join(args[1:])] + + def event_help(self, args): + lines = ["The following commands are available:", + "add [...] Adds link to package. (creates new package if it does not exist)", + "queue Shows all packages in the queue", + "collector Shows all packages in collector", + "del -p|-l [...] Deletes all packages|links with the ids specified", + "info Shows info of the link with id ", + "packinfo Shows info of the package with id ", + "more Shows more info when the result was truncated", + "start Starts all downloads", + "stop Stops the download (but not abort active downloads)", + "push Push package to queue", + "pull Pull package from queue", + "status Show general download status", + "help Shows this help message"] + return lines + + +class IRCError(Exception): + + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) diff --git a/pyload/plugins/hooks/ImageTyperz.py b/pyload/plugins/hooks/ImageTyperz.py new file mode 100644 index 000000000..2591a1c78 --- /dev/null +++ b/pyload/plugins/hooks/ImageTyperz.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import re + +from base64 import b64encode +from pycurl import FORM_FILE, LOW_SPEED_TIME +from thread import start_new_thread + +from pyload.network.RequestFactory import getURL, getRequest +from pyload.plugins.Hook import Hook + + +class ImageTyperzException(Exception): + + def __init__(self, err): + self.err = err + + def getCode(self): + return self.err + + def __str__(self): + return "" % self.err + + def __repr__(self): + return "" % self.err + + +class ImageTyperz(Hook): + __name__ = "ImageTyperz" + __type__ = "hook" + __version__ = "0.04" + + __config__ = [("activated", "bool", "Activated", False), + ("username", "str", "Username", ""), + ("passkey", "password", "Password", ""), + ("force", "bool", "Force IT even if client is connected", False)] + + __description__ = """Send captchas to ImageTyperz.com""" + __author_name__ = ("RaNaN", "zoidberg") + __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") + + SUBMIT_URL = "http://captchatypers.com/Forms/UploadFileAndGetTextNEW.ashx" + RESPOND_URL = "http://captchatypers.com/Forms/SetBadImage.ashx" + GETCREDITS_URL = "http://captchatypers.com/Forms/RequestBalance.ashx" + + + def setup(self): + self.info = {} + + def getCredits(self): + response = getURL(self.GETCREDITS_URL, post={"action": "REQUESTBALANCE", "username": self.getConfig("username"), + "password": self.getConfig("passkey")}) + + if response.startswith('ERROR'): + raise ImageTyperzException(response) + + try: + balance = float(response) + except: + raise ImageTyperzException("invalid response") + + self.logInfo("Account balance: $%s left" % response) + return balance + + def submit(self, captcha, captchaType="file", match=None): + req = getRequest() + #raise timeout threshold + req.c.setopt(LOW_SPEED_TIME, 80) + + try: + #workaround multipart-post bug in HTTPRequest.py + if re.match("^[A-Za-z0-9]*$", self.getConfig("passkey")): + multipart = True + data = (FORM_FILE, captcha) + else: + multipart = False + with open(captcha, 'rb') as f: + data = f.read() + data = b64encode(data) + + response = req.load(self.SUBMIT_URL, post={"action": "UPLOADCAPTCHA", + "username": self.getConfig("username"), + "password": self.getConfig("passkey"), "file": data}, + multipart=multipart) + finally: + req.close() + + if response.startswith("ERROR"): + raise ImageTyperzException(response) + else: + data = response.split('|') + if len(data) == 2: + ticket, result = data + else: + raise ImageTyperzException("Unknown response %s" % response) + + return ticket, result + + def newCaptchaTask(self, task): + if "service" in task.data: + return False + + if not task.isTextual(): + return False + + if not self.getConfig("username") or not self.getConfig("passkey"): + return False + + if self.core.isClientConnected() and not self.getConfig("force"): + return False + + if self.getCredits() > 0: + task.handler.append(self) + task.data['service'] = self.__name__ + task.setWaiting(100) + start_new_thread(self.processCaptcha, (task,)) + + else: + self.logInfo("Your %s account has not enough credits" % self.__name__) + + def captchaInvalid(self, task): + if task.data['service'] == self.__name__ and "ticket" in task.data: + response = getURL(self.RESPOND_URL, post={"action": "SETBADIMAGE", "username": self.getConfig("username"), + "password": self.getConfig("passkey"), + "imageid": task.data['ticket']}) + + if response == "SUCCESS": + self.logInfo("Bad captcha solution received, requested refund") + else: + self.logError("Bad captcha solution received, refund request failed", response) + + def processCaptcha(self, task): + c = task.captchaFile + try: + ticket, result = self.submit(c) + except ImageTyperzException, e: + task.error = e.getCode() + return + + task.data['ticket'] = ticket + task.setResult(result) diff --git a/pyload/plugins/hooks/LinkdecrypterCom.py b/pyload/plugins/hooks/LinkdecrypterCom.py new file mode 100644 index 000000000..34517761a --- /dev/null +++ b/pyload/plugins/hooks/LinkdecrypterCom.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.network.RequestFactory import getURL +from pyload.plugins.Hook import Hook +from pyload.utils import remove_chars + + +class LinkdecrypterCom(Hook): + __name__ = "LinkdecrypterCom" + __type__ = "hook" + __version__ = "0.19" + + __config__ = [("activated", "bool", "Activated", False)] + + __description__ = """Linkdecrypter.com hook plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + + def coreReady(self): + try: + self.loadPatterns() + except Exception, e: + self.logError(e) + + def loadPatterns(self): + page = getURL("http://linkdecrypter.com/") + m = re.search(r'Supported\(\d+\): ([^+<]*)', page) + if m is None: + self.logError(_("Crypter list not found")) + return + + builtin = [name.lower() for name in self.core.pluginManager.crypterPlugins.keys()] + builtin.append("downloadserienjunkiesorg") + + crypter_pattern = re.compile("(\w[\w.-]+)") + online = [] + for crypter in m.group(1).split(', '): + m = re.match(crypter_pattern, crypter) + if m and remove_chars(m.group(1), "-.") not in builtin: + online.append(m.group(1).replace(".", "\\.")) + + if not online: + self.logError(_("Crypter list is empty")) + return + + regexp = r"https?://([^.]+\.)*?(%s)/.*" % "|".join(online) + + dict = self.core.pluginManager.crypterPlugins[self.__name__] + dict['pattern'] = regexp + dict['re'] = re.compile(regexp) + + self.logDebug("REGEXP: " + regexp) diff --git a/pyload/plugins/hooks/LinksnappyCom.py b/pyload/plugins/hooks/LinksnappyCom.py new file mode 100644 index 000000000..f662ae4e9 --- /dev/null +++ b/pyload/plugins/hooks/LinksnappyCom.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +from pyload.common.json_layer import json_loads +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class LinksnappyCom(MultiHoster): + __name__ = "LinksnappyCom" + __type__ = "hook" + __version__ = "0.01" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to standard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """Linksnappy.com hook plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + + def getHoster(self): + json_data = getURL('http://gen.linksnappy.com/lseAPI.php?act=FILEHOSTS') + json_data = json_loads(json_data) + + return json_data['return'].keys() diff --git a/pyload/plugins/hooks/MegaDebridEu.py b/pyload/plugins/hooks/MegaDebridEu.py new file mode 100644 index 000000000..da151f9aa --- /dev/null +++ b/pyload/plugins/hooks/MegaDebridEu.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +from pyload.common.json_layer import json_loads +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class MegaDebridEu(MultiHoster): + __name__ = "MegaDebridEu" + __type__ = "hook" + __version__ = "0.02" + + __config__ = [("activated", "bool", "Activated", False), + ("unloadFailing", "bool", "Revert to standard download if download fails", False)] + + __description__ = """mega-debrid.eu hook plugin""" + __author_name__ = "D.Ducatel" + __author_mail__ = "dducatel@je-geek.fr" + + + def getHoster(self): + reponse = getURL('http://www.mega-debrid.eu/api.php?action=getHosters') + json_data = json_loads(reponse) + + if json_data['response_code'] == "ok": + host_list = [element[0] for element in json_data['hosters']] + else: + self.logError("Unable to retrieve hoster list") + host_list = list() + + return host_list diff --git a/pyload/plugins/hooks/MergeFiles.py b/pyload/plugins/hooks/MergeFiles.py new file mode 100644 index 000000000..5761a5990 --- /dev/null +++ b/pyload/plugins/hooks/MergeFiles.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- + +import os +import re +import traceback + +from pyload.plugins.Hook import Hook, threaded +from pyload.utils import safe_join, fs_encode + + +class MergeFiles(Hook): + __name__ = "MergeFiles" + __type__ = "hook" + __version__ = "0.12" + + __config__ = [("activated", "bool", "Activated", False)] + + __description__ = """Merges parts splitted with hjsplit""" + __author_name__ = "and9000" + __author_mail__ = "me@has-no-mail.com" + + BUFFER_SIZE = 4096 + + + def setup(self): + # nothing to do + pass + + @threaded + def packageFinished(self, pack): + files = {} + fid_dict = {} + for fid, data in pack.getChildren().iteritems(): + if re.search("\.[0-9]{3}$", data['name']): + if data['name'][:-4] not in files: + files[data['name'][:-4]] = [] + files[data['name'][:-4]].append(data['name']) + files[data['name'][:-4]].sort() + fid_dict[data['name']] = fid + + download_folder = self.config['general']['download_folder'] + + if self.config['general']['folder_per_package']: + download_folder = safe_join(download_folder, pack.folder) + + for name, file_list in files.iteritems(): + self.logInfo("Starting merging of %s" % name) + final_file = open(safe_join(download_folder, name), "wb") + + for splitted_file in file_list: + self.logDebug("Merging part %s" % splitted_file) + pyfile = self.core.files.getFile(fid_dict[splitted_file]) + pyfile.setStatus("processing") + try: + s_file = open(os.path.join(download_folder, splitted_file), "rb") + size_written = 0 + s_file_size = int(os.path.getsize(os.path.join(download_folder, splitted_file))) + while True: + f_buffer = s_file.read(self.BUFFER_SIZE) + if f_buffer: + final_file.write(f_buffer) + size_written += self.BUFFER_SIZE + pyfile.setProgress((size_written * 100) / s_file_size) + else: + break + s_file.close() + self.logDebug("Finished merging part %s" % splitted_file) + except Exception, e: + print traceback.print_exc() + finally: + pyfile.setProgress(100) + pyfile.setStatus("finished") + pyfile.release() + + final_file.close() + self.logInfo("Finished merging of %s" % name) diff --git a/pyload/plugins/hooks/MultiDebridCom.py b/pyload/plugins/hooks/MultiDebridCom.py new file mode 100644 index 000000000..7d9b6526a --- /dev/null +++ b/pyload/plugins/hooks/MultiDebridCom.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from pyload.common.json_layer import json_loads +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class MultiDebridCom(MultiHoster): + __name__ = "MultiDebridCom" + __type__ = "hook" + __version__ = "0.01" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to standard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """Multi-debrid.com hook plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + + def getHoster(self): + json_data = getURL('http://multi-debrid.com/api.php?hosts', decode=True) + self.logDebug('JSON data: ' + json_data) + json_data = json_loads(json_data) + + return json_data['hosts'] diff --git a/pyload/plugins/hooks/MultiHome.py b/pyload/plugins/hooks/MultiHome.py new file mode 100644 index 000000000..61fbdd230 --- /dev/null +++ b/pyload/plugins/hooks/MultiHome.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +from time import time + +from pyload.plugins.Hook import Hook + + +class MultiHome(Hook): + __name__ = "MultiHome" + __type__ = "hook" + __version__ = "0.11" + + __config__ = [("activated", "bool", "Activated", False), + ("interfaces", "str", "Interfaces", "None")] + + __description__ = """Ip address changer""" + __author_name__ = "mkaay" + __author_mail__ = "mkaay@mkaay.de" + + + def setup(self): + self.register = {} + self.interfaces = [] + self.parseInterfaces(self.getConfig("interfaces").split(";")) + if not self.interfaces: + self.parseInterfaces([self.config['download']['interface']]) + self.setConfig("interfaces", self.toConfig()) + + def toConfig(self): + return ";".join([i.adress for i in self.interfaces]) + + def parseInterfaces(self, interfaces): + for interface in interfaces: + if not interface or str(interface).lower() == "none": + continue + self.interfaces.append(Interface(interface)) + + def coreReady(self): + requestFactory = self.core.requestFactory + oldGetRequest = requestFactory.getRequest + + def getRequest(pluginName, account=None): + iface = self.bestInterface(pluginName, account) + if iface: + iface.useFor(pluginName, account) + requestFactory.iface = lambda: iface.adress + self.logDebug("Multihome: using address: " + iface.adress) + return oldGetRequest(pluginName, account) + + requestFactory.getRequest = getRequest + + def bestInterface(self, pluginName, account): + best = None + for interface in self.interfaces: + if not best or interface.lastPluginAccess(pluginName, account) < best.lastPluginAccess(pluginName, account): + best = interface + return best + + +class Interface(object): + + def __init__(self, adress): + self.adress = adress + self.history = {} + + def lastPluginAccess(self, pluginName, account): + if (pluginName, account) in self.history: + return self.history[(pluginName, account)] + return 0 + + def useFor(self, pluginName, account): + self.history[(pluginName, account)] = time() + + def __repr__(self): + return "" % self.adress diff --git a/pyload/plugins/hooks/MultishareCz.py b/pyload/plugins/hooks/MultishareCz.py new file mode 100644 index 000000000..9e1bd50a4 --- /dev/null +++ b/pyload/plugins/hooks/MultishareCz.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class MultishareCz(MultiHoster): + __name__ = "MultishareCz" + __type__ = "hook" + __version__ = "0.04" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", "uloz.to")] + + __description__ = """MultiShare.cz hook plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + HOSTER_PATTERN = r']*?alt="([^"]+)">\s*
        \s*' + OFFLINE_PATTERN = r'

        Soubor nebyl nalezen

        ' + + FILE_URL_REPLACEMENTS = [(__pattern__, r'http://www.dataport.cz/file/\1')] + + CAPTCHA_URL_PATTERN = r'
        \s*(\d+)
        ' + + + def handleFree(self): + captchas = {"1": "jkeG", "2": "hMJQ", "3": "vmEK", "4": "ePQM", "5": "blBd"} + + for _ in xrange(60): + action, inputs = self.parseHtmlForm('free_download_form') + self.logDebug(action, inputs) + if not action or not inputs: + self.parseError('free_download_form') + + if "captchaId" in inputs and inputs['captchaId'] in captchas: + inputs['captchaCode'] = captchas[inputs['captchaId']] + else: + self.parseError('captcha') + + self.html = self.download("http://www.dataport.cz%s" % action, post=inputs) + + check = self.checkDownload({"captcha": 'alert("\u0160patn\u011b opsan\u00fd k\u00f3d z obr\u00e1zu");', + "slot": 'alert("Je n\u00e1m l\u00edto, ale moment\u00e1ln\u011b nejsou'}) + if check == "captcha": + self.parseError('invalid captcha') + elif check == "slot": + self.logDebug("No free slots - wait 60s and retry") + self.wait(60, False) + self.html = self.load(self.pyfile.url, decode=True) + continue + else: + break + + +create_getInfo(DataportCz) diff --git a/pyload/plugins/hoster/DateiTo.py b/pyload/plugins/hoster/DateiTo.py new file mode 100644 index 000000000..1e8ca3614 --- /dev/null +++ b/pyload/plugins/hoster/DateiTo.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.CaptchaService import ReCaptcha +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class DateiTo(SimpleHoster): + __name__ = "DateiTo" + __type__ = "hoster" + __version__ = "0.02" + + __pattern__ = r'http://(?:www\.)?datei\.to/datei/(?P\w+)\.html' + + __description__ = """Datei.to hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FILE_NAME_PATTERN = r'Dateiname:\s*
        ' + FILE_SIZE_PATTERN = r'' + USER_CAPTCHA_PATTERN = r'' + + + def handleFree(self): + params = {} + for _ in xrange(3): + m = re.search(self.LINK_PATTERN, self.html) + if m: + if 'captcha_hash' in params: + self.correctCaptcha() + download_url = m.group(1) + break + + m = re.search(self.CAPTCHA_PATTERN, self.html) + if m: + if 'captcha_hash' in params: + self.invalidCaptcha() + captcha_url1 = "http://www.sendspace.com/" + m.group(1) + m = re.search(self.USER_CAPTCHA_PATTERN, self.html) + captcha_url2 = "http://www.sendspace.com/" + m.group(1) + params = {'captcha_hash': m.group(2), + 'captcha_submit': 'Verify', + 'captcha_answer': self.decryptCaptcha(captcha_url1) + " " + self.decryptCaptcha(captcha_url2)} + else: + params = {'download': "Regular Download"} + + self.logDebug(params) + self.html = self.load(self.pyfile.url, post=params) + else: + self.fail("Download link not found") + + self.logDebug("Download URL: %s" % download_url) + self.download(download_url) + + +create_getInfo(SendspaceCom) diff --git a/pyload/plugins/hoster/Share4webCom.py b/pyload/plugins/hoster/Share4webCom.py new file mode 100644 index 000000000..a3d92d9f4 --- /dev/null +++ b/pyload/plugins/hoster/Share4webCom.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.hoster.UnibytesCom import UnibytesCom +from pyload.plugins.internal.SimpleHoster import create_getInfo + + +class Share4webCom(UnibytesCom): + __name__ = "Share4webCom" + __type__ = "hoster" + __version__ = "0.1" + + __pattern__ = r'http://(?:www\.)?share4web\.com/get/\w+' + + __description__ = """Share4web.com hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + HOSTER_NAME = "share4web.com" + + +getInfo = create_getInfo(UnibytesCom) diff --git a/pyload/plugins/hoster/Share76Com.py b/pyload/plugins/hoster/Share76Com.py new file mode 100644 index 000000000..2cd736992 --- /dev/null +++ b/pyload/plugins/hoster/Share76Com.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class Share76Com(DeadHoster): + __name__ = "Share76Com" + __type__ = "hoster" + __version__ = "0.04" + + __pattern__ = r'http://(?:www\.)?share76.com/\w{12}' + + __description__ = """Share76.com hoster plugin""" + __author_name__ = "me" + __author_mail__ = None + + +getInfo = create_getInfo(Share76Com) diff --git a/pyload/plugins/hoster/ShareFilesCo.py b/pyload/plugins/hoster/ShareFilesCo.py new file mode 100644 index 000000000..b75eb0740 --- /dev/null +++ b/pyload/plugins/hoster/ShareFilesCo.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class ShareFilesCo(DeadHoster): + __name__ = "ShareFilesCo" + __type__ = "hoster" + __version__ = "0.02" + + __pattern__ = r'http://(?:www\.)?sharefiles\.co/\w{12}' + + __description__ = """Sharefiles.co hoster plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + +getInfo = create_getInfo(ShareFilesCo) diff --git a/pyload/plugins/hoster/ShareRapidCom.py b/pyload/plugins/hoster/ShareRapidCom.py new file mode 100644 index 000000000..b474103fc --- /dev/null +++ b/pyload/plugins/hoster/ShareRapidCom.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +import re + +from pycurl import HTTPHEADER + +from pyload.network.RequestFactory import getRequest +from pyload.plugins.internal.SimpleHoster import SimpleHoster, parseFileInfo + + +def getInfo(urls): + h = getRequest() + h.c.setopt(HTTPHEADER, + ["Accept: text/html", + "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0"]) + for url in urls: + html = h.load(url, decode=True) + file_info = parseFileInfo(ShareRapidCom, url, html) + yield file_info + + +class ShareRapidCom(SimpleHoster): + __name__ = "ShareRapidCom" + __type__ = "hoster" + __version__ = "0.54" + + __pattern__ = r'http://(?:www\.)?(share|mega)rapid\.cz/soubor/\d+/.+' + + __description__ = """MegaRapid.cz hoster plugin""" + __author_name__ = ("MikyWoW", "zoidberg", "stickell", "Walter Purcaro") + __author_mail__ = ("mikywow@seznam.cz", "zoidberg@mujmail.cz", "l.stickell@yahoo.it", "vuolter@gmail.com") + + FILE_NAME_PATTERN = r']*>]*>(?:]*>)?(?P[^<]+)' + FILE_SIZE_PATTERN = r'\s*' + OFFLINE_PATTERN = ur'Nastala chyba 404|Soubor byl smazán' + + SH_CHECK_TRAFFIC = True + + LINK_PATTERN = r'([^<]+)' + ERR_LOGIN_PATTERN = ur'
        Stahování je přístupné pouze přihlášeným uživatelům' + ERR_CREDIT_PATTERN = ur'
        Stahování zdarma je možné jen přes náš' + + + def setup(self): + self.chunkLimit = 1 + + def handlePremium(self): + try: + self.html = self.load(self.pyfile.url, decode=True) + except BadHeader, e: + self.account.relogin(self.user) + self.retry(max_tries=3, reason=str(e)) + + m = re.search(self.LINK_PATTERN, self.html) + if m: + link = m.group(1) + self.logDebug("Premium link: %s" % link) + self.download(link, disposition=True) + else: + if re.search(self.ERR_LOGIN_PATTERN, self.html): + self.relogin(self.user) + self.retry(max_tries=3, reason="User login failed") + elif re.search(self.ERR_CREDIT_PATTERN, self.html): + self.fail("Not enough credit left") + else: + self.fail("Download link not found") diff --git a/pyload/plugins/hoster/SharebeesCom.py b/pyload/plugins/hoster/SharebeesCom.py new file mode 100644 index 000000000..287dbf59c --- /dev/null +++ b/pyload/plugins/hoster/SharebeesCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class SharebeesCom(DeadHoster): + __name__ = "SharebeesCom" + __type__ = "hoster" + __version__ = "0.02" + + __pattern__ = r'http://(?:www\.)?sharebees.com/\w{12}' + + __description__ = """ShareBees hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + +getInfo = create_getInfo(SharebeesCom) diff --git a/pyload/plugins/hoster/ShareonlineBiz.py b/pyload/plugins/hoster/ShareonlineBiz.py new file mode 100644 index 000000000..b1d9ae5cb --- /dev/null +++ b/pyload/plugins/hoster/ShareonlineBiz.py @@ -0,0 +1,199 @@ +# -*- coding: utf-8 -*- + +import re + +from time import time + +from pyload.network.RequestFactory import getURL +from pyload.plugins.Hoster import Hoster +from pyload.plugins.Plugin import chunks +from pyload.plugins.internal.CaptchaService import ReCaptcha + + +def getInfo(urls): + api_url_base = "http://api.share-online.biz/linkcheck.php" + + urls = [url.replace("https://", "http://") for url in urls] + + for chunk in chunks(urls, 90): + api_param_file = {"links": "\n".join(x.replace("http://www.share-online.biz/dl/", "").rstrip("/") for x in + chunk)} # api only supports old style links + src = getURL(api_url_base, post=api_param_file, decode=True) + result = [] + for i, res in enumerate(src.split("\n")): + if not res: + continue + fields = res.split(";") + + if fields[1] == "OK": + status = 2 + elif fields[1] in ("DELETED", "NOT FOUND"): + status = 1 + else: + status = 3 + + result.append((fields[2], int(fields[3]), status, chunk[i])) + yield result + + +class ShareonlineBiz(Hoster): + __name__ = "ShareonlineBiz" + __type__ = "hoster" + __version__ = "0.40" + + __pattern__ = r'https?://(?:www\.)?(share-online\.biz|egoshare\.com)/(download.php\?id=|dl/)(?P\w+)' + + __description__ = """Shareonline.biz hoster plugin""" + __author_name__ = ("spoob", "mkaay", "zoidberg", "Walter Purcaro") + __author_mail__ = ("spoob@pyload.org", "mkaay@mkaay.de", "zoidberg@mujmail.cz", "vuolter@gmail.com") + + ERROR_INFO_PATTERN = r'

        Information:

        \s*
        \s*(.*?)' + + + def setup(self): + # range request not working? + # api supports resume, only one chunk + # website isn't supporting resuming in first place + self.file_id = re.match(self.__pattern__, self.pyfile.url).group("ID") + self.pyfile.url = "http://www.share-online.biz/dl/" + self.file_id + + self.resumeDownload = self.premium + self.multiDL = False + #self.chunkLimit = 1 + + self.check_data = None + + def process(self, pyfile): + if self.premium: + self.handlePremium() + #web-download fallback removed - didn't work anyway + else: + self.handleFree() + + # check = self.checkDownload({"failure": re.compile(self.ERROR_INFO_PATTERN)}) + # if check == "failure": + # try: + # self.retry(reason=self.lastCheck.group(1).decode("utf8")) + # except: + # self.retry(reason="Unknown error") + + if self.api_data: + self.check_data = {"size": int(self.api_data['size']), "md5": self.api_data['md5']} + + def loadAPIData(self): + api_url_base = "http://api.share-online.biz/linkcheck.php?md5=1" + api_param_file = {"links": self.file_id} # api only supports old style links + src = self.load(api_url_base, cookies=False, post=api_param_file, decode=True) + + fields = src.split(";") + self.api_data = {"fileid": fields[0], + "status": fields[1]} + if not self.api_data['status'] == "OK": + self.offline() + else: + self.api_data['filename'] = fields[2] + self.api_data['size'] = fields[3] # in bytes + self.api_data['md5'] = fields[4].strip().lower().replace("\n\n", "") # md5 + + def handleFree(self): + self.loadAPIData() + self.pyfile.name = self.api_data['filename'] + self.pyfile.size = int(self.api_data['size']) + + self.html = self.load(self.pyfile.url, cookies=True) # refer, stuff + self.setWait(3) + self.wait() + + self.html = self.load("%s/free/" % self.pyfile.url, post={"dl_free": "1", "choice": "free"}, decode=True) + self.checkErrors() + + m = re.search(r'var wait=(\d+);', self.html) + + recaptcha = ReCaptcha(self) + for _ in xrange(5): + challenge, response = recaptcha.challenge("6LdatrsSAAAAAHZrB70txiV5p-8Iv8BtVxlTtjKX") + self.setWait(int(m.group(1)) if m else 30) + response = self.load("%s/free/captcha/%d" % (self.pyfile.url, int(time() * 1000)), post={ + 'dl_free': '1', + 'recaptcha_challenge_field': challenge, + 'recaptcha_response_field': response}) + + if not response == '0': + self.correctCaptcha() + break + else: + self.invalidCaptcha() + else: + self.invalidCaptcha() + self.fail("No valid captcha solution received") + + download_url = response.decode("base64") + self.logDebug(download_url) + if not download_url.startswith("http://"): + self.parseError("download url") + + self.wait() + self.download(download_url) + # check download + check = self.checkDownload({ + "cookie": re.compile(r'
        Share-Online") + }) + if check == "cookie": + self.invalidCaptcha() + self.retry(5, 60, "Cookie failure") + elif check == "fail": + self.invalidCaptcha() + self.retry(5, 5 * 60, "Download failed") + else: + self.correctCaptcha() + + def handlePremium(self): #: should be working better loading (account) api internally + self.account.getAccountInfo(self.user, True) + src = self.load("http://api.share-online.biz/account.php", + {"username": self.user, "password": self.account.accounts[self.user]['password'], + "act": "download", "lid": self.file_id}) + + self.api_data = dlinfo = {} + for line in src.splitlines(): + key, value = line.split(": ") + dlinfo[key.lower()] = value + + self.logDebug(dlinfo) + if not dlinfo['status'] == "online": + self.offline() + else: + self.pyfile.name = dlinfo['name'] + self.pyfile.size = int(dlinfo['size']) + + dlLink = dlinfo['url'] + if dlLink == "server_under_maintenance": + self.tempOffline() + else: + self.multiDL = True + self.download(dlLink) + + def checkErrors(self): + m = re.search(r"/failure/(.*?)/1", self.req.lastEffectiveURL) + if m is None: + return + + err = m.group(1) + m = re.search(self.ERROR_INFO_PATTERN, self.html) + msg = m.group(1) if m else "" + self.logError(err, msg or "Unknown error occurred") + + if err == "invalid": + self.fail(msg or "File not available") + elif err in ("freelimit", "size", "proxy"): + self.fail(msg or "Premium account needed") + else: + if err in 'server': + self.setWait(600, False) + elif err in 'expired': + self.setWait(30, False) + else: + self.setWait(300, True) + + self.wait() + self.retry(max_tries=25, reason=msg) diff --git a/pyload/plugins/hoster/ShareplaceCom.py b/pyload/plugins/hoster/ShareplaceCom.py new file mode 100644 index 000000000..60bb596cc --- /dev/null +++ b/pyload/plugins/hoster/ShareplaceCom.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- + +import re + +from urllib import unquote + +from pyload.plugins.Hoster import Hoster + + +class ShareplaceCom(Hoster): + __name__ = "ShareplaceCom" + __type__ = "hoster" + __version__ = "0.11" + + __pattern__ = r'(http://)?(?:www\.)?shareplace\.(com|org)/\?[a-zA-Z0-9]+' + + __description__ = """Shareplace.com hoster plugin""" + __author_name__ = "ACCakut" + __author_mail__ = None + + + def process(self, pyfile): + self.pyfile = pyfile + self.prepare() + self.download(self.get_file_url()) + + def prepare(self): + if not self.file_exists(): + self.offline() + + self.pyfile.name = self.get_file_name() + + wait_time = self.get_waiting_time() + self.setWait(wait_time) + self.logDebug("%s: Waiting %d seconds." % (self.__name__, wait_time)) + self.wait() + + def get_waiting_time(self): + if not self.html: + self.download_html() + + #var zzipitime = 15; + m = re.search(r'var zzipitime = (\d+);', self.html) + if m: + sec = int(m.group(1)) + else: + sec = 0 + + return sec + + def download_html(self): + url = re.sub("shareplace.com\/\?", "shareplace.com//index1.php/?a=", self.pyfile.url) + self.html = self.load(url, decode=True) + + def get_file_url(self): + """ returns the absolute downloadable filepath + """ + url = re.search(r"var beer = '(.*?)';", self.html) + if url: + url = url.group(1) + url = unquote( + url.replace("http://http:/", "").replace("vvvvvvvvv", "").replace("lllllllll", "").replace( + "teletubbies", "")) + self.logDebug("URL: %s" % url) + return url + else: + self.fail("absolute filepath could not be found. offline? ") + + def get_file_name(self): + if not self.html: + self.download_html() + + return re.search("\s*(.*?)\s*", self.html).group(1) + + def file_exists(self): + """ returns True or False + """ + if not self.html: + self.download_html() + + if re.search(r"HTTP Status 404", self.html) is not None: + return False + else: + return True diff --git a/pyload/plugins/hoster/ShragleCom.py b/pyload/plugins/hoster/ShragleCom.py new file mode 100644 index 000000000..0ec93fcdc --- /dev/null +++ b/pyload/plugins/hoster/ShragleCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class ShragleCom(DeadHoster): + __name__ = "ShragleCom" + __type__ = "hoster" + __version__ = "0.22" + + __pattern__ = r'http://(?:www\.)?(cloudnator|shragle).com/files/(?P.*?)/' + + __description__ = """Cloudnator.com (Shragle.com) hoster plugin""" + __author_name__ = ("RaNaN", "zoidberg") + __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") + + +getInfo = create_getInfo(ShragleCom) diff --git a/pyload/plugins/hoster/SimplyPremiumCom.py b/pyload/plugins/hoster/SimplyPremiumCom.py new file mode 100644 index 000000000..760b7ff1b --- /dev/null +++ b/pyload/plugins/hoster/SimplyPremiumCom.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +import re + +from datetime import datetime, timedelta + +from pyload.plugins.Hoster import Hoster +from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight + + +class SimplyPremiumCom(Hoster): + __name__ = "SimplyPremiumCom" + __type__ = "hoster" + __version__ = "0.03" + + __pattern__ = r'https?://.*(simply-premium)\.com' + + __description__ = """Simply-Premium.com hoster plugin""" + __author_name__ = "EvolutionClip" + __author_mail__ = "evolutionclip@live.de" + + + def setup(self): + self.chunkLimit = 16 + self.resumeDownload = False + + def process(self, pyfile): + if re.match(self.__pattern__, pyfile.url): + new_url = pyfile.url + elif not self.account: + self.logError(_("Please enter your %s account or deactivate this plugin") % "Simply-Premium.com") + self.fail("No Simply-Premium.com account provided") + else: + self.logDebug("Old URL: %s" % pyfile.url) + for i in xrange(5): + page = self.load('http://www.simply-premium.com/premium.php?info&link=' + pyfile.url) + self.logDebug("JSON data: " + page) + if page != '': + break + else: + self.logInfo("Unable to get API data, waiting 1 minute and retry") + self.retry(5, 60, "Unable to get API data") + + if '0' in page or ( + "You are not allowed to download from this host" in page and self.premium): + self.account.relogin(self.user) + self.retry() + elif "NOTFOUND" in page: + self.offline() + elif "downloadlimit" in page: + self.logWarning("Reached maximum connctions") + self.retry(5, 60, "Reached maximum connctions") + elif "trafficlimit" in page: + self.logWarning("Reached daily limit for this host") + self.retry(1, secondsToMidnight(gmt=2), "Daily limit for this host reached") + elif "hostererror" in page: + self.logWarning("Hoster temporarily unavailable, waiting 1 minute and retry") + self.retry(5, 60, "Hoster is temporarily unavailable") + #page = json_loads(page) + #new_url = page.keys()[0] + #self.api_data = page[new_url] + + try: + self.pyfile.name = re.search(r'([^<]+)', page).group(1) + except AttributeError: + self.pyfile.name = "" + + try: + self.pyfile.size = re.search(r'(\d+)', page).group(1) + except AttributeError: + self.pyfile.size = 0 + + try: + new_url = re.search(r'([^<]+)', page).group(1) + except AttributeError: + new_url = 'http://www.simply-premium.com/premium.php?link=' + pyfile.url + + if new_url != pyfile.url: + self.logDebug("New URL: " + new_url) + + self.download(new_url, disposition=True) diff --git a/pyload/plugins/hoster/SimplydebridCom.py b/pyload/plugins/hoster/SimplydebridCom.py new file mode 100644 index 000000000..c6b03c124 --- /dev/null +++ b/pyload/plugins/hoster/SimplydebridCom.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.Hoster import Hoster + + +class SimplydebridCom(Hoster): + __name__ = "SimplydebridCom" + __type__ = "hoster" + __version__ = "0.1" + + __pattern__ = r'http://(?:www\.)?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/sd.php/*' + + __description__ = """Simply-debrid.com hoster plugin""" + __author_name__ = "Kagenoshin" + __author_mail__ = "kagenoshin@gmx.ch" + + + def setup(self): + self.resumeDownload = self.multiDL = True + self.chunkLimit = 1 + + def process(self, pyfile): + if not self.account: + self.logError(_("Please enter your %s account or deactivate this plugin") % "simply-debrid.com") + self.fail("No simply-debrid.com account provided") + + self.logDebug("Old URL: %s" % pyfile.url) + + #fix the links for simply-debrid.com! + new_url = pyfile.url + new_url = new_url.replace("clz.to", "cloudzer.net/file") + new_url = new_url.replace("http://share-online", "http://www.share-online") + new_url = new_url.replace("ul.to", "uploaded.net/file") + new_url = new_url.replace("uploaded.com", "uploaded.net") + new_url = new_url.replace("filerio.com", "filerio.in") + new_url = new_url.replace("lumfile.com", "lumfile.se") + if('fileparadox' in new_url): + new_url = new_url.replace("http://", "https://") + + if re.match(self.__pattern__, new_url): + new_url = new_url + + self.logDebug("New URL: %s" % new_url) + + if not re.match(self.__pattern__, new_url): + page = self.load('http://simply-debrid.com/api.php', get={'dl': new_url}) # +'&u='+self.user+'&p='+self.account.getAccountData(self.user)['password']) + if 'tiger Link' in page or 'Invalid Link' in page or ('API' in page and 'ERROR' in page): + self.fail('Unable to unrestrict link') + new_url = page + + self.setWait(5) + self.wait() + self.logDebug("Unrestricted URL: " + new_url) + + self.download(new_url, disposition=True) + + check = self.checkDownload({"bad1": "No address associated with hostname", "bad2": "\w+)' + + __description__ = """Sockshare.com hoster plugin""" + __author_name__ = ("jeix", "stickell", "Walter Purcaro") + __author_mail__ = ("jeix@hasnomail.de", "l.stickell@yahoo.it", "vuolter@gmail.com") + + FILE_INFO_PATTERN = r'site-content">\s*

        (?P.+)\( (?P[^)]+) \)

        ' + OFFLINE_PATTERN = r'>This file doesn\'t exist, or has been removed.<' + TEMP_OFFLINE_PATTERN = r'(>This content server has been temporarily disabled for upgrades|Try again soon\\. You can still download it below\\.<)' + + FILE_URL_REPLACEMENTS = [(__pattern__, r'http://www.sockshare.com/file/\g')] + + + def setup(self): + self.multiDL = self.resumeDownload = True + self.chunkLimit = -1 + + def handleFree(self): + name = self.pyfile.name + link = self._getLink() + self.logDebug("Direct link: " + link) + self.download(link, disposition=True) + self.processName(name) + + def _getLink(self): + hash_data = re.search(r'', self.html) + if not hash_data: + self.parseError("Unable to detect hash") + + post_data = {"hash": hash_data.group(1), "confirm": "Continue+as+Free+User"} + self.html = self.load(self.pyfile.url, post=post_data) + if ">You have exceeded the daily stream limit for your country\\. You can wait until tomorrow" in self.html: + self.logWarning("You have exceeded your daily stream limit for today") + self.wait(secondsToMidnight(gmt=2), True) + elif re.search(self.TEMP_OFFLINE_PATTERN, self.html): + self.retry(wait_time=2 * 60 * 60, reason="Server temporarily offline") # 2 hours wait + + patterns = (r'(/get_file\.php\?id=[A-Z0-9]+&key=[a-zA-Z0-9=]+&original=1)', + r'(/get_file\.php\?download=[A-Z0-9]+&key=[a-z0-9]+)', + r'(/get_file\.php\?download=[A-Z0-9]+&key=[a-z0-9]+&original=1)', + r'Tired of ads and waiting\? Go Pro![\t\n\rn ]+
        [\t\n\rn ]+.*?)/(?P.*)' + + __description__ = """SoundCloud.com hoster plugin""" + __author_name__ = "Peekayy" + __author_mail__ = "peekayy.dev@gmail.com" + + + def process(self, pyfile): + # default UserAgent of HTTPRequest fails for this hoster so we use this one + self.req.http.c.setopt(pycurl.USERAGENT, 'Mozilla/5.0') + page = self.load(pyfile.url) + m = re.search(r'
        .*?)"', page) + if m: + clientId = m.group("CID") + + if len(clientId) <= 0: + clientId = "b45b1aa10f1ac2941910a7f0d10f8e28" + + m = re.search(r'\s(?P.*?)\s</em>', page) + if m: + pyfile.name = m.group("TITLE") + ".mp3" + else: + pyfile.name = re.match(self.__pattern__, pyfile.url).group("SID") + ".mp3" + + # url to retrieve the actual song url + page = self.load("https://api.sndcdn.com/i1/tracks/%s/streams" % songId, get={"client_id": clientId}) + # getting streams + # for now we choose the first stream found in all cases + # it could be improved if relevant for this hoster + streams = [ + (result.group("QUALITY"), result.group("URL")) + for result in re.finditer(r'"(?P<QUALITY>.*?)":"(?P<URL>.*?)"', page) + ] + self.logDebug("Found Streams", streams) + self.logDebug("Downloading", streams[0][0], streams[0][1]) + self.download(streams[0][1]) diff --git a/pyload/plugins/hoster/SpeedLoadOrg.py b/pyload/plugins/hoster/SpeedLoadOrg.py new file mode 100644 index 000000000..74753b029 --- /dev/null +++ b/pyload/plugins/hoster/SpeedLoadOrg.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class SpeedLoadOrg(DeadHoster): + __name__ = "SpeedLoadOrg" + __type__ = "hoster" + __version__ = "1.02" + + __pattern__ = r'http://(?:www\.)?speedload\.org/(?P<ID>\w+)' + + __description__ = """Speedload.org hoster plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + +getInfo = create_getInfo(SpeedLoadOrg) diff --git a/pyload/plugins/hoster/SpeedfileCz.py b/pyload/plugins/hoster/SpeedfileCz.py new file mode 100644 index 000000000..85df88d85 --- /dev/null +++ b/pyload/plugins/hoster/SpeedfileCz.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class SpeedfileCz(DeadHoster): + __name__ = "SpeedFileCz" + __type__ = "hoster" + __version__ = "0.32" + + __pattern__ = r'http://(?:www\.)?speedfile.cz/.*' + + __description__ = """Speedfile.cz hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + +getInfo = create_getInfo(SpeedfileCz) diff --git a/pyload/plugins/hoster/SpeedyshareCom.py b/pyload/plugins/hoster/SpeedyshareCom.py new file mode 100644 index 000000000..ed6fc443f --- /dev/null +++ b/pyload/plugins/hoster/SpeedyshareCom.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# Testlink: +# http://speedy.sh/ep2qY/Zapp-Brannigan.jpg + +import re + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class SpeedyshareCom(SimpleHoster): + __name__ = "SpeedyshareCom" + __type__ = "hoster" + __pattern__ = r"https?://(www\.)?(speedyshare.com|speedy.sh)/.*" + __version__ = "0.01" + __description__ = """speedyshare.com hoster plugin""" + __author_name__ = ("zapp-brannigan") + __author_mail__ = ("fuerst.reinje@web.de") + + FILE_NAME_PATTERN = r'class=downloadfilename>(?P<N>.*)</span></td>' + FILE_SIZE_PATTERN = r'class=sizetagtext>(?P<S>.*) (?P<U>[kKmM]?[iI]?[bB]?)</div>' + LINK_PATTERN = r'<a href=\'(.*)\'><img src=/gf/slowdownload.png alt=\'Slow Download\' border=0' + FILE_OFFLINE_PATTERN = r'class=downloadfilenamenotfound>.*</span>' + BASE_URL = 'www.speedyshare.com' + + def setup(self): + self.multiDL = False + self.chunkLimit = 1 + + def process(self, pyfile): + self.html = self.load(pyfile.url, decode=True) + try: + dl_link = re.search(self.LINK_PATTERN, self.html).group(1) + self.logDebug("Link: " + dl_link) + except: + self.parseError("Unable to find download link") + self.download(self.BASE_URL + dl_link, disposition=True) + check = self.checkDownload({"is_html": re.compile("html")}) + if check == "is_html": + self.fail("The downloaded file is html, maybe the plugin is out of date") + + +getInfo = create_getInfo(SpeedyshareCom) diff --git a/pyload/plugins/hoster/StreamCz.py b/pyload/plugins/hoster/StreamCz.py new file mode 100644 index 000000000..7b20049be --- /dev/null +++ b/pyload/plugins/hoster/StreamCz.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.network.RequestFactory import getURL +from pyload.plugins.Hoster import Hoster + + +def getInfo(urls): + result = [] + + for url in urls: + + html = getURL(url) + if re.search(StreamCz.OFFLINE_PATTERN, html): + # File offline + result.append((url, 0, 1, url)) + else: + result.append((url, 0, 2, url)) + yield result + + +class StreamCz(Hoster): + __name__ = "StreamCz" + __type__ = "hoster" + __version__ = "0.2" + + __pattern__ = r'https?://(?:www\.)?stream\.cz/[^/]+/\d+.*' + + __description__ = """Stream.cz hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FILE_NAME_PATTERN = r'<link rel="video_src" href="http://www.stream.cz/\w+/(\d+)-([^"]+)" />' + OFFLINE_PATTERN = r'<h1 class="commonTitle">Str.nku nebylo mo.n. nal.zt \(404\)</h1>' + + CDN_PATTERN = r'<param name="flashvars" value="[^"]*&id=(?P<ID>\d+)(?:&cdnLQ=(?P<cdnLQ>\d*))?(?:&cdnHQ=(?P<cdnHQ>\d*))?(?:&cdnHD=(?P<cdnHD>\d*))?&' + + + def setup(self): + self.multiDL = True + self.resumeDownload = True + + def process(self, pyfile): + + self.html = self.load(pyfile.url, decode=True) + + if re.search(self.OFFLINE_PATTERN, self.html): + self.offline() + + m = re.search(self.CDN_PATTERN, self.html) + if m is None: + self.fail("Parse error (CDN)") + cdn = m.groupdict() + self.logDebug(cdn) + for cdnkey in ("cdnHD", "cdnHQ", "cdnLQ"): + if cdnkey in cdn and cdn[cdnkey] > '': + cdnid = cdn[cdnkey] + break + else: + self.fail("Stream URL not found") + + m = re.search(self.FILE_NAME_PATTERN, self.html) + if m is None: + self.fail("Parse error (NAME)") + pyfile.name = "%s-%s.%s.mp4" % (m.group(2), m.group(1), cdnkey[-2:]) + + download_url = "http://cdn-dispatcher.stream.cz/?id=" + cdnid + self.logInfo("STREAM (%s): %s" % (cdnkey[-2:], download_url)) + self.download(download_url) diff --git a/pyload/plugins/hoster/StreamcloudEu.py b/pyload/plugins/hoster/StreamcloudEu.py new file mode 100644 index 000000000..0e36a047c --- /dev/null +++ b/pyload/plugins/hoster/StreamcloudEu.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- + +import re + +from time import sleep + +from pyload.network.HTTPRequest import HTTPRequest +from pyload.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo + + +class StreamcloudEu(XFileSharingPro): + __name__ = "StreamcloudEu" + __type__ = "hoster" + __version__ = "0.04" + + __pattern__ = r'http://(?:www\.)?streamcloud\.eu/\S+' + + __description__ = """Streamcloud.eu hoster plugin""" + __author_name__ = "seoester" + __author_mail__ = "seoester@googlemail.com" + + HOSTER_NAME = "streamcloud.eu" + + LINK_PATTERN = r'file: "(http://(stor|cdn)\d+\.streamcloud.eu:?\d*/.*/video\.(mp4|flv))",' + + + def setup(self): + super(StreamcloudEu, self).setup() + self.multiDL = True + + def getDownloadLink(self): + m = re.search(self.LINK_PATTERN, self.html, re.S) + if m: + return m.group(1) + + for i in xrange(5): + self.logDebug("Getting download link: #%d" % i) + data = self.getPostParameters() + httpRequest = HTTPRequest(options=self.req.options) + httpRequest.cj = self.req.cj + sleep(10) + self.html = httpRequest.load(self.pyfile.url, post=data, referer=False, cookies=True, decode=True) + self.header = httpRequest.header + + m = re.search("Location\s*:\s*(.*)", self.header, re.I) + if m: + break + + m = re.search(self.LINK_PATTERN, self.html, re.S) + if m: + break + + else: + if self.errmsg and 'captcha' in self.errmsg: + self.fail("No valid captcha code entered") + else: + self.fail("Download link not found") + + return m.group(1) + + def getPostParameters(self): + for i in xrange(3): + if not self.errmsg: + self.checkErrors() + + if hasattr(self, "FORM_PATTERN"): + action, inputs = self.parseHtmlForm(self.FORM_PATTERN) + else: + action, inputs = self.parseHtmlForm(input_names={"op": re.compile("^download")}) + + if not inputs: + action, inputs = self.parseHtmlForm('F1') + if not inputs: + if self.errmsg: + self.retry() + else: + self.parseError("Form not found") + + self.logDebug(self.HOSTER_NAME, inputs) + + if 'op' in inputs and inputs['op'] in ("download1", "download2", "download3"): + if "password" in inputs: + if self.passwords: + inputs['password'] = self.passwords.pop(0) + else: + self.fail("No or invalid passport") + + if not self.premium: + m = re.search(self.WAIT_PATTERN, self.html) + if m: + wait_time = int(m.group(1)) + 1 + self.setWait(wait_time, False) + else: + wait_time = 0 + + self.captcha = self.handleCaptcha(inputs) + + if wait_time: + self.wait() + + self.errmsg = None + self.logDebug("getPostParameters {0}".format(i)) + return inputs + + else: + inputs['referer'] = self.pyfile.url + + if self.premium: + inputs['method_premium'] = "Premium Download" + if 'method_free' in inputs: + del inputs['method_free'] + else: + inputs['method_free'] = "Free Download" + if 'method_premium' in inputs: + del inputs['method_premium'] + + self.html = self.load(self.pyfile.url, post=inputs, ref=False) + self.errmsg = None + + else: + self.parseError('FORM: %s' % (inputs['op'] if 'op' in inputs else 'UNKNOWN')) + + +getInfo = create_getInfo(StreamcloudEu) diff --git a/pyload/plugins/hoster/TurbobitNet.py b/pyload/plugins/hoster/TurbobitNet.py new file mode 100644 index 000000000..1fbdf9e87 --- /dev/null +++ b/pyload/plugins/hoster/TurbobitNet.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +import random +import re +import time + +from Crypto.Cipher import ARC4 +from binascii import hexlify, unhexlify +from pycurl import HTTPHEADER +from urllib import quote + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.CaptchaService import ReCaptcha +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, timestamp + + +class TurbobitNet(SimpleHoster): + __name__ = "TurbobitNet" + __type__ = "hoster" + __version__ = "0.11" + + __pattern__ = r'http://(?:www\.)?(turbobit.net|unextfiles.com)/(?!download/folder/)(?:download/free/)?(?P<ID>\w+).*' + + __description__ = """Turbobit.net plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FILE_INFO_PATTERN = r"<span class='file-icon1[^>]*>(?P<N>[^<]+)</span>\s*\((?P<S>[^\)]+)\)\s*</h1>" #: long filenames are shortened + FILE_NAME_PATTERN = r'<meta name="keywords" content="\s+(?P<N>[^,]+)' #: full name but missing on page2 + OFFLINE_PATTERN = r'<h2>File Not Found</h2>|html\(\'File (?:was )?not found' + + FILE_URL_REPLACEMENTS = [(r"http://(?:www\.)?(turbobit.net|unextfiles.com)/(?:download/free/)?(?P<ID>\w+).*", + "http://turbobit.net/\g<ID>.html")] + SH_COOKIES = [(".turbobit.net", "user_lang", "en")] + + LINK_PATTERN = r'(?P<url>/download/redirect/[^"\']+)' + LIMIT_WAIT_PATTERN = r'<div id="time-limit-text">\s*.*?<span id=\'timeout\'>(\d+)</span>' + CAPTCHA_KEY_PATTERN = r'src="http://api\.recaptcha\.net/challenge\?k=([^"]+)"' + CAPTCHA_SRC_PATTERN = r'<img alt="Captcha" src="(.*?)"' + + + def handleFree(self): + self.url = "http://turbobit.net/download/free/%s" % self.file_info['ID'] + self.html = self.load(self.url) + + rtUpdate = self.getRtUpdate() + + self.solveCaptcha() + self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With: XMLHttpRequest"]) + self.url = self.getDownloadUrl(rtUpdate) + + self.wait() + self.html = self.load(self.url) + self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With:"]) + self.downloadFile() + + def solveCaptcha(self): + for _ in xrange(5): + m = re.search(self.LIMIT_WAIT_PATTERN, self.html) + if m: + wait_time = int(m.group(1)) + self.wait(wait_time, wait_time > 60) + self.retry() + + action, inputs = self.parseHtmlForm("action='#'") + if not inputs: + self.parseError("captcha form") + self.logDebug(inputs) + + if inputs['captcha_type'] == 'recaptcha': + recaptcha = ReCaptcha(self) + m = re.search(self.CAPTCHA_KEY_PATTERN, self.html) + captcha_key = m.group(1) if m else '6LcTGLoSAAAAAHCWY9TTIrQfjUlxu6kZlTYP50_c' + inputs['recaptcha_challenge_field'], inputs['recaptcha_response_field'] = recaptcha.challenge( + captcha_key) + else: + m = re.search(self.CAPTCHA_SRC_PATTERN, self.html) + if m is None: + self.parseError('captcha') + captcha_url = m.group(1) + inputs['captcha_response'] = self.decryptCaptcha(captcha_url) + + self.logDebug(inputs) + self.html = self.load(self.url, post=inputs) + + if not "<div class='download-timer-header'>" in self.html: + self.invalidCaptcha() + else: + self.correctCaptcha() + break + else: + self.fail("Invalid captcha") + + def getRtUpdate(self): + rtUpdate = self.getStorage("rtUpdate") + if not rtUpdate: + if self.getStorage("version") != self.__version__ or int( + self.getStorage("timestamp", 0)) + 86400000 < timestamp(): + # that's right, we are even using jdownloader updates + rtUpdate = getURL("http://update0.jdownloader.org/pluginstuff/tbupdate.js") + rtUpdate = self.decrypt(rtUpdate.splitlines()[1]) + # but we still need to fix the syntax to work with other engines than rhino + rtUpdate = re.sub(r'for each\(var (\w+) in(\[[^\]]+\])\)\{', + r'zza=\2;for(var zzi=0;zzi<zza.length;zzi++){\1=zza[zzi];', rtUpdate) + rtUpdate = re.sub(r"for\((\w+)=", r"for(var \1=", rtUpdate) + + self.logDebug("rtUpdate") + self.setStorage("rtUpdate", rtUpdate) + self.setStorage("timestamp", timestamp()) + self.setStorage("version", self.__version__) + else: + self.logError("Unable to download, wait for update...") + self.tempOffline() + + return rtUpdate + + def getDownloadUrl(self, rtUpdate): + self.req.http.lastURL = self.url + + m = re.search("(/\w+/timeout\.js\?\w+=)([^\"\'<>]+)", self.html) + url = "http://turbobit.net%s%s" % (m.groups() if m else ( + '/files/timeout.js?ver=', ''.join(random.choice('0123456789ABCDEF') for _ in xrange(32)))) + fun = self.load(url) + + self.setWait(65, False) + + for b in [1, 3]: + self.jscode = "var id = \'%s\';var b = %d;var inn = \'%s\';%sout" % ( + self.file_info['ID'], b, quote(fun), rtUpdate) + + try: + out = self.js.eval(self.jscode) + self.logDebug("URL", self.js.engine, out) + if out.startswith('/download/'): + return "http://turbobit.net%s" % out.strip() + except Exception, e: + self.logError(e) + else: + if self.retries >= 2: + # retry with updated js + self.delStorage("rtUpdate") + self.retry() + + def decrypt(self, data): + cipher = ARC4.new(hexlify('E\x15\xa1\x9e\xa3M\xa0\xc6\xa0\x84\xb6H\x83\xa8o\xa0')) + return unhexlify(cipher.encrypt(unhexlify(data))) + + def getLocalTimeString(self): + lt = time.localtime() + tz = time.altzone if lt.tm_isdst else time.timezone + return "%s GMT%+03d%02d" % (time.strftime("%a %b %d %Y %H:%M:%S", lt), -tz // 3600, tz % 3600) + + def handlePremium(self): + self.logDebug("Premium download as user %s" % self.user) + self.html = self.load(self.pyfile.url) # Useless in 0.5 + self.downloadFile() + + def downloadFile(self): + m = re.search(self.LINK_PATTERN, self.html) + if m is None: + self.parseError("download link") + self.url = "http://turbobit.net" + m.group('url') + self.logDebug(self.url) + self.download(self.url) + + +getInfo = create_getInfo(TurbobitNet) diff --git a/pyload/plugins/hoster/TurbouploadCom.py b/pyload/plugins/hoster/TurbouploadCom.py new file mode 100644 index 000000000..eb5978145 --- /dev/null +++ b/pyload/plugins/hoster/TurbouploadCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class TurbouploadCom(DeadHoster): + __name__ = "TurbouploadCom" + __type__ = "hoster" + __version__ = "0.03" + + __pattern__ = r'http://(?:www\.)?turboupload.com/(\w+).*' + + __description__ = """Turboupload.com hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + +getInfo = create_getInfo(TurbouploadCom) diff --git a/pyload/plugins/hoster/TusfilesNet.py b/pyload/plugins/hoster/TusfilesNet.py new file mode 100644 index 000000000..0e01ec805 --- /dev/null +++ b/pyload/plugins/hoster/TusfilesNet.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo + + +class TusfilesNet(XFileSharingPro): + __name__ = "TusfilesNet" + __type__ = "hoster" + __version__ = "0.03" + + __pattern__ = r'https?://(?:www\.)?tusfiles\.net/(?P<ID>\w+)' + + __description__ = """Tusfiles.net hoster plugin""" + __author_name__ = "Walter Purcaro" + __author_mail__ = "vuolter@gmail.com" + + HOSTER_NAME = "tusfiles.net" + + FILE_INFO_PATTERN = r'\](?P<N>.+) - (?P<S>[\d.]+) (?P<U>\w+)\[' + OFFLINE_PATTERN = r'>File Not Found|<Title>TusFiles - Fast Sharing Files!' + + SH_COOKIES = [(".tusfiles.net", "lang", "english")] + + + def setup(self): + self.multiDL = False + self.chunkLimit = -1 + self.resumeDownload = True + + +getInfo = create_getInfo(TusfilesNet) diff --git a/pyload/plugins/hoster/TwoSharedCom.py b/pyload/plugins/hoster/TwoSharedCom.py new file mode 100644 index 000000000..108d31c6f --- /dev/null +++ b/pyload/plugins/hoster/TwoSharedCom.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class TwoSharedCom(SimpleHoster): + __name__ = "TwoSharedCom" + __type__ = "hoster" + __version__ = "0.11" + + __pattern__ = r'http://(?:www\.)?2shared.com/(account/)?(download|get|file|document|photo|video|audio)/.*' + + __description__ = """2Shared.com hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FILE_NAME_PATTERN = r'<h1>(?P<N>.*)</h1>' + FILE_SIZE_PATTERN = r'<span class="dtitle">File size:</span>\s*(?P<S>[0-9,.]+) (?P<U>[kKMG])i?B' + OFFLINE_PATTERN = r'The file link that you requested is not valid\.|This file was deleted\.' + + LINK_PATTERN = r"window.location ='([^']+)';" + + + def setup(self): + self.resumeDownload = self.multiDL = True + + def handleFree(self): + m = re.search(self.LINK_PATTERN, self.html) + if m is None: + self.parseError('Download link') + link = m.group(1) + self.logDebug("Download URL %s" % link) + + self.download(link) + + +getInfo = create_getInfo(TwoSharedCom) diff --git a/pyload/plugins/hoster/UlozTo.py b/pyload/plugins/hoster/UlozTo.py new file mode 100644 index 000000000..2f1fdc595 --- /dev/null +++ b/pyload/plugins/hoster/UlozTo.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- + +import re +import time + +from pyload.common.json_layer import json_loads +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +def convertDecimalPrefix(m): + # decimal prefixes used in filesize and traffic + return ("%%.%df" % {'k': 3, 'M': 6, 'G': 9}[m.group(2)] % float(m.group(1))).replace('.', '') + + +class UlozTo(SimpleHoster): + __name__ = "UlozTo" + __type__ = "hoster" + __version__ = "0.98" + + __pattern__ = r'http://(?:www\.)?(uloz\.to|ulozto\.(cz|sk|net)|bagruj.cz|zachowajto.pl)/(?:live/)?(?P<id>\w+/[^/?]*)' + + __description__ = """Uloz.to hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FILE_INFO_PATTERN = r'<p>File <strong>(?P<N>[^<]+)</strong> is password protected</p>' + FILE_NAME_PATTERN = r'<title>(?P<N>[^<]+) \| Uloz.to' + FILE_SIZE_PATTERN = r'.*?(?P[0-9.]+\s[kMG]?B)' + OFFLINE_PATTERN = r'404 - Page not found|

        File (has been deleted|was banned)

        ' + + FILE_SIZE_REPLACEMENTS = [('([0-9.]+)\s([kMG])B', convertDecimalPrefix)] + FILE_URL_REPLACEMENTS = [(r"(?<=http://)([^/]+)", "www.ulozto.net")] + + ADULT_PATTERN = r'
        ' + PASSWD_PATTERN = r'
        ' + VIPLINK_PATTERN = r'' + FREE_URL_PATTERN = r'
        ' + + + def setup(self): + self.multiDL = self.premium + self.resumeDownload = True + + def process(self, pyfile): + pyfile.url = re.sub(r"(?<=http://)([^/]+)", "www.ulozto.net", pyfile.url) + self.html = self.load(pyfile.url, decode=True, cookies=True) + + if re.search(self.ADULT_PATTERN, self.html): + self.logInfo("Adult content confirmation needed. Proceeding..") + + m = re.search(self.TOKEN_PATTERN, self.html) + if m is None: + self.parseError('TOKEN') + token = m.group(1) + + self.html = self.load(pyfile.url, get={"do": "askAgeForm-submit"}, + post={"agree": "Confirm", "_token_": token}, cookies=True) + + passwords = self.getPassword().splitlines() + while self.PASSWD_PATTERN in self.html: + if passwords: + password = passwords.pop(0) + self.logInfo("Password protected link, trying " + password) + self.html = self.load(pyfile.url, get={"do": "passwordProtectedForm-submit"}, + post={"password": password, "password_send": 'Send'}, cookies=True) + else: + self.fail("No or incorrect password") + + if re.search(self.VIPLINK_PATTERN, self.html): + self.html = self.load(pyfile.url, get={"disclaimer": "1"}) + + self.file_info = self.getFileInfo() + + if self.premium and self.checkTrafficLeft(): + self.handlePremium() + else: + self.handleFree() + + self.doCheckDownload() + + def handleFree(self): + action, inputs = self.parseHtmlForm('id="frm-downloadDialog-freeDownloadForm"') + if not action or not inputs: + self.parseError("free download form") + + self.logDebug('inputs.keys() = ' + str(inputs.keys())) + # get and decrypt captcha + if all(key in inputs for key in ("captcha_value", "captcha_id", "captcha_key")): + # Old version - last seen 9.12.2013 + self.logDebug('Using "old" version') + + captcha_value = self.decryptCaptcha("http://img.uloz.to/captcha/%s.png" % inputs['captcha_id']) + self.logDebug('CAPTCHA ID: ' + inputs['captcha_id'] + ", CAPTCHA VALUE: " + captcha_value) + + inputs.update({'captcha_id': inputs['captcha_id'], 'captcha_key': inputs['captcha_key'], 'captcha_value': captcha_value}) + + elif all(key in inputs for key in ("captcha_value", "timestamp", "salt", "hash")): + # New version - better to get new parameters (like captcha reload) because of image url - since 6.12.2013 + self.logDebug('Using "new" version') + + xapca = self.load("http://www.ulozto.net/reloadXapca.php", get={"rnd": str(int(time.time()))}) + self.logDebug('xapca = ' + str(xapca)) + + data = json_loads(xapca) + captcha_value = self.decryptCaptcha(str(data['image'])) + self.logDebug("CAPTCHA HASH: " + data['hash'] + ", CAPTCHA SALT: " + str(data['salt']) + ", CAPTCHA VALUE: " + captcha_value) + + inputs.update({'timestamp': data['timestamp'], 'salt': data['salt'], 'hash': data['hash'], 'captcha_value': captcha_value}) + else: + self.parseError("CAPTCHA form changed") + + self.multiDL = True + self.download("http://www.ulozto.net" + action, post=inputs, cookies=True, disposition=True) + + def handlePremium(self): + self.download(self.pyfile.url + "?do=directDownload", disposition=True) + #parsed_url = self.findDownloadURL(premium=True) + #self.download(parsed_url, post={"download": "Download"}) + + def findDownloadURL(self, premium=False): + msg = "%s link" % ("Premium" if premium else "Free") + m = re.search(self.PREMIUM_URL_PATTERN if premium else self.FREE_URL_PATTERN, self.html) + if m is None: + self.parseError(msg) + parsed_url = "http://www.ulozto.net" + m.group(1) + self.logDebug("%s: %s" % (msg, parsed_url)) + return parsed_url + + def doCheckDownload(self): + check = self.checkDownload({ + "wrong_captcha": re.compile(r'
        [^>]*?alt="OK"' + + + def getHoster(self): + page = getURL("http://www.multishare.cz/monitoring/") + return re.findall(self.HOSTER_PATTERN, page) diff --git a/pyload/plugins/hooks/OverLoadMe.py b/pyload/plugins/hooks/OverLoadMe.py new file mode 100644 index 000000000..a57c7c2b4 --- /dev/null +++ b/pyload/plugins/hooks/OverLoadMe.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class OverLoadMe(MultiHoster): + __name__ = "OverLoadMe" + __type__ = "hook" + __version__ = "0.01" + + __config__ = [("activated", "bool", "Activated", False), + ("https", "bool", "Enable HTTPS", True), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to standard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 12)] + + __description__ = """Over-Load.me hook plugin""" + __author_name__ = "marley" + __author_mail__ = "marley@over-load.me" + + + def getHoster(self): + https = "https" if self.getConfig("https") else "http" + page = getURL(https + "://api.over-load.me/hoster.php", + get={"auth": "0001-cb1f24dadb3aa487bda5afd3b76298935329be7700cd7-5329be77-00cf-1ca0135f"} + ).replace("\"", "").strip() + self.logDebug("Hosterlist: %s" % page) + + return [x.strip() for x in page.split(",") if x.strip()] diff --git a/pyload/plugins/hooks/Premium4Me.py b/pyload/plugins/hooks/Premium4Me.py new file mode 100644 index 000000000..6841dfa90 --- /dev/null +++ b/pyload/plugins/hooks/Premium4Me.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class Premium4Me(MultiHoster): + __name__ = "Premium4Me" + __type__ = "hook" + __version__ = "0.03" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for downloads from supported hosters:", "all"), + ("hosterList", "str", "Hoster list (comma separated)", "")] + + __description__ = """Premium.to hook plugin""" + __author_name__ = ("RaNaN", "zoidberg", "stickell") + __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz", "l.stickell@yahoo.it") + + + def getHoster(self): + page = getURL("http://premium.to/api/hosters.php?authcode=%s" % self.account.authcode) + return [x.strip() for x in page.replace("\"", "").split(";")] + + def coreReady(self): + self.account = self.core.accountManager.getAccountPlugin("Premium4Me") + + user = self.account.selectAccount()[0] + + if not user: + self.logError(_("Please add your premium.to account first and restart pyLoad")) + return + + return MultiHoster.coreReady(self) diff --git a/pyload/plugins/hooks/PremiumizeMe.py b/pyload/plugins/hooks/PremiumizeMe.py new file mode 100644 index 000000000..70bc4a0f2 --- /dev/null +++ b/pyload/plugins/hooks/PremiumizeMe.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +from pyload.common.json_layer import json_loads +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class PremiumizeMe(MultiHoster): + __name__ = "PremiumizeMe" + __type__ = "hook" + __version__ = "0.12" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to stanard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """Premiumize.me hook plugin""" + __author_name__ = "Florian Franzen" + __author_mail__ = "FlorianFranzen@gmail.com" + + + def getHoster(self): + # If no accounts are available there will be no hosters available + if not self.account or not self.account.canUse(): + return [] + + # Get account data + (user, data) = self.account.selectAccount() + + # Get supported hosters list from premiumize.me using the + # json API v1 (see https://secure.premiumize.me/?show=api) + answer = getURL("https://api.premiumize.me/pm-api/v1.php?method=hosterlist¶ms[login]=%s¶ms[pass]=%s" % ( + user, data['password'])) + data = json_loads(answer) + + # If account is not valid thera are no hosters available + if data['status'] != 200: + return [] + + # Extract hosters from json file + return data['result']['hosterlist'] + + def coreReady(self): + # Get account plugin and check if there is a valid account available + self.account = self.core.accountManager.getAccountPlugin("PremiumizeMe") + if not self.account.canUse(): + self.account = None + self.logError(_("Please add a valid premiumize.me account first and restart pyLoad.")) + return + + # Run the overwriten core ready which actually enables the multihoster hook + return MultiHoster.coreReady(self) diff --git a/pyload/plugins/hooks/RPNetBiz.py b/pyload/plugins/hooks/RPNetBiz.py new file mode 100644 index 000000000..e119e6451 --- /dev/null +++ b/pyload/plugins/hooks/RPNetBiz.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +from pyload.common.json_layer import json_loads +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class RPNetBiz(MultiHoster): + __name__ = "RPNetBiz" + __type__ = "hook" + __version__ = "0.1" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to stanard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """RPNet.biz hook plugin""" + __author_name__ = "Dman" + __author_mail__ = "dmanugm@gmail.com" + + + def getHoster(self): + # No hosts supported if no account + if not self.account or not self.account.canUse(): + return [] + + # Get account data + (user, data) = self.account.selectAccount() + + response = getURL("https://premium.rpnet.biz/client_api.php", + get={"username": user, "password": data['password'], "action": "showHosterList"}) + hoster_list = json_loads(response) + + # If account is not valid thera are no hosters available + if 'error' in hoster_list: + return [] + + # Extract hosters from json file + return hoster_list['hosters'] + + def coreReady(self): + # Get account plugin and check if there is a valid account available + self.account = self.core.accountManager.getAccountPlugin("RPNetBiz") + if not self.account.canUse(): + self.account = None + self.logError(_("Please enter your %s account or deactivate this plugin") % "rpnet") + return + + # Run the overwriten core ready which actually enables the multihoster hook + return MultiHoster.coreReady(self) diff --git a/pyload/plugins/hooks/RealdebridCom.py b/pyload/plugins/hooks/RealdebridCom.py new file mode 100644 index 000000000..c1c519ace --- /dev/null +++ b/pyload/plugins/hooks/RealdebridCom.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class RealdebridCom(MultiHoster): + __name__ = "RealdebridCom" + __type__ = "hook" + __version__ = "0.43" + + __config__ = [("activated", "bool", "Activated", False), + ("https", "bool", "Enable HTTPS", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported):", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to stanard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """Real-Debrid.com hook plugin""" + __author_name__ = "Devirex Hazzard" + __author_mail__ = "naibaf_11@yahoo.de" + + + def getHoster(self): + https = "https" if self.getConfig("https") else "http" + page = getURL(https + "://real-debrid.com/api/hosters.php").replace("\"", "").strip() + + return [x.strip() for x in page.split(",") if x.strip()] diff --git a/pyload/plugins/hooks/RehostTo.py b/pyload/plugins/hooks/RehostTo.py new file mode 100644 index 000000000..097ebc646 --- /dev/null +++ b/pyload/plugins/hooks/RehostTo.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class RehostTo(MultiHoster): + __name__ = "RehostTo" + __type__ = "hook" + __version__ = "0.43" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to stanard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24)] + + __description__ = """Rehost.to hook plugin""" + __author_name__ = "RaNaN" + __author_mail__ = "RaNaN@pyload.org" + + + def getHoster(self): + page = getURL("http://rehost.to/api.php?cmd=get_supported_och_dl&long_ses=%s" % self.long_ses) + return [x.strip() for x in page.replace("\"", "").split(",")] + + def coreReady(self): + self.account = self.core.accountManager.getAccountPlugin("RehostTo") + + user = self.account.selectAccount()[0] + + if not user: + self.logError("Rehost.to: " + _("Please add your rehost.to account first and restart pyLoad")) + return + + data = self.account.getAccountInfo(user) + self.ses = data['ses'] + self.long_ses = data['long_ses'] + + return MultiHoster.coreReady(self) diff --git a/pyload/plugins/hooks/RestartFailed.py b/pyload/plugins/hooks/RestartFailed.py new file mode 100644 index 000000000..a50ab60a4 --- /dev/null +++ b/pyload/plugins/hooks/RestartFailed.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.Hook import Hook + + +class RestartFailed(Hook): + __name__ = "RestartFailed" + __type__ = "hook" + __version__ = "1.55" + + __config__ = [("activated", "bool", "Activated", False), + ("interval", "int", "Check interval in minutes", 90)] + + __description__ = """Periodically restart all failed downloads in queue""" + __author_name__ = "Walter Purcaro" + __author_mail__ = "vuolter@gmail.com" + + MIN_INTERVAL = 15 * 60 #: 15m minimum check interval (value is in seconds) + + event_list = ["pluginConfigChanged"] + + + def pluginConfigChanged(self, plugin, name, value): + if name == "interval": + interval = value * 60 + if self.MIN_INTERVAL <= interval != self.interval: + self.core.scheduler.removeJob(self.cb) + self.interval = interval + self.initPeriodical() + else: + self.logDebug("Invalid interval value, kept current") + + def periodical(self): + self.logInfo("Restart failed downloads") + self.api.restartFailed() + + def setup(self): + self.api = self.core.api + self.interval = self.MIN_INTERVAL + + def coreReady(self): + self.pluginConfigChanged(self.__name__, "interval", self.getConfig("interval")) diff --git a/pyload/plugins/hooks/SimplyPremiumCom.py b/pyload/plugins/hooks/SimplyPremiumCom.py new file mode 100644 index 000000000..8e9bc5e1e --- /dev/null +++ b/pyload/plugins/hooks/SimplyPremiumCom.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +from pyload.common.json_layer import json_loads +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class SimplyPremiumCom(MultiHoster): + __name__ = "SimplyPremiumCom" + __type__ = "hook" + __version__ = "0.02" + + __config__ = [("activated", "bool", "Activated", "False"), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to standard download if download fails", "False"), + ("interval", "int", "Reload interval in hours (0 to disable)", "24")] + + __description__ = """Simply-Premium.com hook plugin""" + __author_name__ = "EvolutionClip" + __author_mail__ = "evolutionclip@live.de" + + + def getHoster(self): + json_data = getURL('http://www.simply-premium.com/api/hosts.php?format=json&online=1') + json_data = json_loads(json_data) + + host_list = [element['regex'] for element in json_data['result']] + + return host_list diff --git a/pyload/plugins/hooks/SimplydebridCom.py b/pyload/plugins/hooks/SimplydebridCom.py new file mode 100644 index 000000000..f7c899a48 --- /dev/null +++ b/pyload/plugins/hooks/SimplydebridCom.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class SimplydebridCom(MultiHoster): + __name__ = "SimplydebridCom" + __type__ = "hook" + __version__ = "0.01" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", "")] + + __description__ = """Simply-Debrid.com hook plugin""" + __author_name__ = "Kagenoshin" + __author_mail__ = "kagenoshin@gmx.ch" + + + def getHoster(self): + page = getURL("http://simply-debrid.com/api.php?list=1") + return [x.strip() for x in page.rstrip(';').replace("\"", "").split(";")] diff --git a/pyload/plugins/hooks/UnSkipOnFail.py b/pyload/plugins/hooks/UnSkipOnFail.py new file mode 100644 index 000000000..fd3b35a0a --- /dev/null +++ b/pyload/plugins/hooks/UnSkipOnFail.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- + +from os.path import basename + +from pyload.PyFile import PyFile +from pyload.plugins.Hook import Hook +from pyload.utils import fs_encode + + +class UnSkipOnFail(Hook): + __name__ = "UnSkipOnFail" + __type__ = "hook" + __version__ = "0.01" + + __config__ = [("activated", "bool", "Activated", True)] + + __description__ = """When a download fails, restart skipped duplicates""" + __author_name__ = "hagg" + __author_mail__ = None + + + def downloadFailed(self, pyfile): + pyfile_name = basename(pyfile.name) + pid = pyfile.package().id + msg = 'look for skipped duplicates for %s (pid:%s)...' + self.logInfo(msg % (pyfile_name, pid)) + dups = self.findDuplicates(pyfile) + for link in dups: + # check if link is "skipped"(=4) + if link.status == 4: + lpid = link.packageID + self.logInfo('restart "%s" (pid:%s)...' % (pyfile_name, lpid)) + self.setLinkStatus(link, "queued") + + def findDuplicates(self, pyfile): + """ Search all packages for duplicate links to "pyfile". + Duplicates are links that would overwrite "pyfile". + To test on duplicity the package-folder and link-name + of twolinks are compared (basename(link.name)). + So this method returns a list of all links with equal + package-folders and filenames as "pyfile", but except + the data for "pyfile" iotselöf. + It does MOT check the link's status. + """ + dups = [] + pyfile_name = fs_encode(basename(pyfile.name)) + # get packages (w/o files, as most file data is useless here) + queue = self.core.api.getQueue() + for package in queue: + # check if package-folder equals pyfile's package folder + if fs_encode(package.folder) == fs_encode(pyfile.package().folder): + # now get packaged data w/ files/links + pdata = self.core.api.getPackageData(package.pid) + if pdata.links: + for link in pdata.links: + link_name = fs_encode(basename(link.name)) + # check if link name collides with pdata's name + if link_name == pyfile_name: + # at last check if it is not pyfile itself + if link.fid != pyfile.id: + dups.append(link) + return dups + + def setLinkStatus(self, link, new_status): + """ Change status of "link" to "new_status". + "link" has to be a valid FileData object, + "new_status" has to be a valid status name + (i.e. "queued" for this Plugin) + It creates a temporary PyFile object using + "link" data, changes its status, and tells + the core.files-manager to save its data. + """ + pyfile = PyFile(self.core.files, + link.fid, + link.url, + link.name, + link.size, + link.status, + link.error, + link.plugin, + link.packageID, + link.order) + pyfile.setStatus(new_status) + self.core.files.save() + pyfile.release() diff --git a/pyload/plugins/hooks/UnrestrictLi.py b/pyload/plugins/hooks/UnrestrictLi.py new file mode 100644 index 000000000..1562bdf24 --- /dev/null +++ b/pyload/plugins/hooks/UnrestrictLi.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +from pyload.common.json_layer import json_loads +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class UnrestrictLi(MultiHoster): + __name__ = "UnrestrictLi" + __type__ = "hook" + __version__ = "0.02" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", ""), + ("unloadFailing", "bool", "Revert to standard download if download fails", False), + ("interval", "int", "Reload interval in hours (0 to disable)", 24), + ("history", "bool", "Delete History", False)] + + __description__ = """Unrestrict.li hook plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + + def getHoster(self): + json_data = getURL('http://unrestrict.li/api/jdownloader/hosts.php?format=json') + json_data = json_loads(json_data) + + host_list = [element['host'] for element in json_data['result']] + + return host_list diff --git a/pyload/plugins/hooks/UpdateManager.py b/pyload/plugins/hooks/UpdateManager.py new file mode 100644 index 000000000..ece7ca610 --- /dev/null +++ b/pyload/plugins/hooks/UpdateManager.py @@ -0,0 +1,281 @@ +# -*- coding: utf-8 -*- + +import re +import sys + +from operator import itemgetter +from os import path, remove, stat + +from pyload.network.RequestFactory import getURL +from pyload.plugins.Hook import Expose, Hook, threaded +from pyload.utils import safe_join + + +class UpdateManager(Hook): + __name__ = "UpdateManager" + __type__ = "hook" + __version__ = "0.35" + + __config__ = [("activated", "bool", "Activated", True), + ("mode", "pyLoad + plugins;plugins only", "Check updates for", "pyLoad + plugins"), + ("interval", "int", "Check interval in hours", 8), + ("reloadplugins", "bool", "Monitor plugins for code changes (debug mode only)", True), + ("nodebugupdate", "bool", "Don't check for updates in debug mode", True)] + + __description__ = """ Check for updates """ + __author_name__ = "Walter Purcaro" + __author_mail__ = "vuolter@gmail.com" + + + event_list = ["pluginConfigChanged"] + + SERVER_URL = "http://updatemanager.pyload.org" + MIN_INTERVAL = 3 * 60 * 60 #: 3h minimum check interval (value is in seconds) + + + def pluginConfigChanged(self, plugin, name, value): + if name == "interval": + interval = value * 60 * 60 + if self.MIN_INTERVAL <= interval != self.interval: + self.core.scheduler.removeJob(self.cb) + self.interval = interval + self.initPeriodical() + else: + self.logDebug("Invalid interval value, kept current") + elif name == "reloadplugins": + if self.cb2: + self.core.scheduler.removeJob(self.cb2) + if value is True and self.core.debug: + self.periodical2() + + def coreReady(self): + self.pluginConfigChanged(self.__name__, "interval", self.getConfig("interval")) + x = lambda: self.pluginConfigChanged(self.__name__, "reloadplugins", self.getConfig("reloadplugins")) + self.core.scheduler.addJob(10, x, threaded=False) + + def unload(self): + self.pluginConfigChanged(self.__name__, "reloadplugins", False) + + def setup(self): + self.cb2 = None + self.interval = self.MIN_INTERVAL + self.updating = False + self.info = {'pyload': False, 'version': None, 'plugins': False} + self.mtimes = {} #: store modification time for each plugin + + def periodical2(self): + if not self.updating: + self.autoreloadPlugins() + self.cb2 = self.core.scheduler.addJob(4, self.periodical2, threaded=False) + + @Expose + def autoreloadPlugins(self): + """ reload and reindex all modified plugins """ + modules = filter( + lambda m: m and (m.__name__.startswith("pyload.plugins.") or + m.__name__.startswith("userplugins.")) and + m.__name__.count(".") >= 2, sys.modules.itervalues() + ) + + reloads = [] + + for m in modules: + root, type, name = m.__name__.rsplit(".", 2) + id = (type, name) + if type in self.core.pluginManager.plugins: + f = m.__file__.replace(".pyc", ".py") + if not path.isfile(f): + continue + + mtime = stat(f).st_mtime + + if id not in self.mtimes: + self.mtimes[id] = mtime + elif self.mtimes[id] < mtime: + reloads.append(id) + self.mtimes[id] = mtime + + return True if self.core.pluginManager.reloadPlugins(reloads) else False + + def periodical(self): + if not self.info['pyload'] and not (self.getConfig("nodebugupdate") and self.core.debug): + self.updateThread() + + def server_request(self): + try: + return getURL(self.SERVER_URL, get={'v': self.core.api.getServerVersion()}).splitlines() + except: + self.logWarning(_("Unable to contact server to get updates")) + + @threaded + def updateThread(self): + self.updating = True + status = self.update(onlyplugin=self.getConfig("mode") == "plugins only") + if status == 2: + self.core.api.restart() + else: + self.updating = False + + @Expose + def updatePlugins(self): + """ simple wrapper for calling plugin update quickly """ + return self.update(onlyplugin=True) + + @Expose + def update(self, onlyplugin=False): + """ check for updates """ + data = self.server_request() + if not data: + exitcode = 0 + elif data[0] == "None": + self.logInfo(_("No new pyLoad version available")) + updates = data[1:] + exitcode = self._updatePlugins(updates) + elif onlyplugin: + exitcode = 0 + else: + newversion = data[0] + self.logInfo(_("*** New pyLoad Version %s available ***") % newversion) + self.logInfo(_("*** Get it here: https://github.com/pyload/pyload/releases ***")) + exitcode = 3 + self.info['pyload'] = True + self.info['version'] = newversion + return exitcode #: 0 = No plugins updated; 1 = Plugins updated; 2 = Plugins updated, but restart required; 3 = No plugins updated, new pyLoad version available + + def _updatePlugins(self, updates): + """ check for plugin updates """ + + if self.info['plugins']: + return False #: plugins were already updated + + updated = [] + + vre = re.compile(r'__version__.*=.*("|\')([0-9.]+)') + url = updates[0] + schema = updates[1].split('|') + if "BLACKLIST" in updates: + blacklist = updates[updates.index('BLACKLIST') + 1:] + updates = updates[2:updates.index('BLACKLIST')] + else: + blacklist = None + updates = updates[2:] + + upgradable = sorted(map(lambda x: dict(zip(schema, x.split('|'))), updates), key=itemgetter("type", "name")) + for plugin in upgradable: + filename = plugin['name'] + prefix = plugin['type'] + version = plugin['version'] + + if filename.endswith(".pyc"): + name = filename[:filename.find("_")] + else: + name = filename.replace(".py", "") + + #@TODO: obsolete after 0.4.10 + if prefix.endswith("s"): + type = prefix[:-1] + else: + type = prefix + + plugins = getattr(self.core.pluginManager, "%sPlugins" % type) + + oldver = float(plugins[name]['v']) if name in plugins else None + newver = float(version) + + if not oldver: + msg = "New [%(type)s] %(name)s (v%(newver)s)" + elif newver > oldver: + msg = "New version of [%(type)s] %(name)s (v%(oldver)s -> v%(newver)s)" + else: + continue + + self.logInfo(_(msg) % { + 'type': type, + 'name': name, + 'oldver': oldver, + 'newver': newver, + }) + + try: + content = getURL(url % plugin) + m = vre.search(content) + if m and m.group(2) == version: + f = open(safe_join("userplugins", prefix, filename), "wb") + f.write(content) + f.close() + updated.append((prefix, name)) + else: + raise Exception, _("Version mismatch") + except Exception, e: + self.logError(_("Error updating plugin %s") % filename, str(e)) + + if blacklist: + blacklisted = sorted(map(lambda x: (x.split('|')[0], x.split('|')[1].rsplit('.', 1)[0]), blacklist)) + + # Always protect UpdateManager from self-removing + try: + blacklisted.remove(("hook", "UpdateManager")) + except: + pass + + removed = self.removePlugins(blacklisted) + for t, n in removed: + self.logInfo(_("Removed blacklisted plugin [%(type)s] %(name)s") % { + 'type': t, + 'name': n, + }) + + if updated: + reloaded = self.core.pluginManager.reloadPlugins(updated) + if reloaded: + self.logInfo(_("Plugins updated and reloaded")) + exitcode = 1 + else: + self.logInfo(_("*** Plugins have been updated, but need a pyLoad restart to be reloaded ***")) + self.info['plugins'] = True + exitcode = 2 + else: + self.logInfo(_("No plugin updates available")) + exitcode = 0 + + return exitcode #: 0 = No plugins updated; 1 = Plugins updated; 2 = Plugins updated, but restart required + + @Expose + def removePlugins(self, type_plugins): + """ delete plugins from disk """ + + if not type_plugins: + return + + self.logDebug("Request deletion of plugins: %s" % type_plugins) + + removed = [] + + for type, name in type_plugins: + err = False + file = name + ".py" + + for root in ("userplugins", path.join(pypath, "pyload", "plugins")): + + filename = safe_join(root, type, file) + try: + remove(filename) + except Exception, e: + self.logDebug("Error deleting \"%s\"" % path.basename(filename), str(e)) + err = True + + filename += "c" + if path.isfile(filename): + try: + if type == "hook": + self.manager.deactivateHook(name) + remove(filename) + except Exception, e: + self.logDebug("Error deleting \"%s\"" % path.basename(filename), str(e)) + err = True + + if not err: + id = (type, name) + removed.append(id) + + return removed #: return a list of the plugins successfully removed diff --git a/pyload/plugins/hooks/WindowsPhoneToastNotify.py b/pyload/plugins/hooks/WindowsPhoneToastNotify.py new file mode 100644 index 000000000..79812cefa --- /dev/null +++ b/pyload/plugins/hooks/WindowsPhoneToastNotify.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- + +import httplib +import time + +from pyload.plugins.Hook import Hook + + +class WindowsPhoneToastNotify(Hook): + __name__ = "WindowsPhoneToastNotify" + __type__ = "hook" + __version__ = "0.02" + + __config__ = [("activated", "bool", "Activated", False), + ("force", "bool", "Force even if client is connected", False), + ("pushId", "str", "pushId", ""), + ("pushUrl", "str", "pushUrl", ""), + ("pushTimeout", "int", "Timeout between notifications in seconds", 0)] + + __description__ = """Send push notifications to Windows Phone""" + __author_name__ = "Andy Voigt" + __author_mail__ = "phone-support@hotmail.de" + + + def setup(self): + self.info = {} + + def getXmlData(self): + myxml = (" " + " Pyload Mobile Captcha waiting! " + " ") + return myxml + + def doRequest(self): + URL = self.getConfig("pushUrl") + request = self.getXmlData() + webservice = httplib.HTTP(URL) + webservice.putrequest("POST", self.getConfig("pushId")) + webservice.putheader("Host", URL) + webservice.putheader("Content-type", "text/xml") + webservice.putheader("X-NotificationClass", "2") + webservice.putheader("X-WindowsPhone-Target", "toast") + webservice.putheader("Content-length", "%d" % len(request)) + webservice.endheaders() + webservice.send(request) + webservice.close() + self.setStorage("LAST_NOTIFY", time.time()) + + def newCaptchaTask(self, task): + if not self.getConfig("pushId") or not self.getConfig("pushUrl"): + return False + + if self.core.isClientConnected() and not self.getConfig("force"): + return False + + if (time.time() - float(self.getStorage("LAST_NOTIFY", 0))) < self.getConf("pushTimeout"): + return False + + self.doRequest() diff --git a/pyload/plugins/hooks/XFileSharingPro.py b/pyload/plugins/hooks/XFileSharingPro.py new file mode 100644 index 000000000..7478034c6 --- /dev/null +++ b/pyload/plugins/hooks/XFileSharingPro.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.Hook import Hook + + +class XFileSharingPro(Hook): + __name__ = "XFileSharingPro" + __type__ = "hook" + __version__ = "0.11" + + __config__ = [("activated", "bool", "Activated", True), + ("loadDefault", "bool", "Include default (built-in) hoster list", True), + ("includeList", "str", "Include hosters (comma separated)", ""), + ("excludeList", "str", "Exclude hosters (comma separated)", "")] + + __description__ = """XFileSharingPro hook plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + + def coreReady(self): + self.loadPattern() + + def loadPattern(self): + hosterList = self.getConfigSet('includeList') + excludeList = self.getConfigSet('excludeList') + + if self.getConfig('loadDefault'): + hosterList |= set(( + #WORKING HOSTERS: + "aieshare.com", "asixfiles.com", "banashare.com", "cyberlocker.ch", "eyesfile.co", "eyesfile.com", + "fileband.com", "filedwon.com", "filedownloads.org", "hipfile.com", "kingsupload.com", "mlfat4arab.com", + "netuploaded.com", "odsiebie.pl", "q4share.com", "ravishare.com", "uptobox.com", "verzend.be", + "xvidstage.com", "thefile.me", "sharesix.com", "hostingbulk.com", + #NOT TESTED: + "bebasupload.com", "boosterking.com", "divxme.com", "filevelocity.com", "glumbouploads.com", + "grupload.com", "heftyfile.com", "host4desi.com", "laoupload.com", "linkzhost.com", "movreel.com", + "rockdizfile.com", "limfile.com", "share76.com", "sharebeast.com", "sharehut.com", "sharerun.com", + "shareswift.com", "sharingonline.com", "6ybh-upload.com", "skipfile.com", "spaadyshare.com", + "space4file.com", "uploadbaz.com", "uploadc.com", "uploaddot.com", "uploadfloor.com", "uploadic.com", + "uploadville.com", "vidbull.com", "zalaa.com", "zomgupload.com", "kupload.org", "movbay.org", + "multishare.org", "omegave.org", "toucansharing.org", "uflinq.org", "banicrazy.info", "flowhot.info", + "upbrasil.info", "shareyourfilez.biz", "bzlink.us", "cloudcache.cc", "fileserver.cc", "farshare.to", + "filemaze.ws", "filehost.ws", "filestock.ru", "moidisk.ru", "4up.im", "100shared.com", "sharesix.com", + "thefile.me", "filenuke.com", "sharerepo.com", "mightyupload.com", + #WRONG FILE NAME: + "sendmyway.com", "upchi.co.il", + #NOT WORKING: + "amonshare.com", "imageporter.com", "file4safe.com", + #DOWN OR BROKEN: + "ddlanime.com", "fileforth.com", "loombo.com", "goldfile.eu", "putshare.com" + )) + + hosterList -= (excludeList) + hosterList -= set(('', u'')) + + if not hosterList: + self.unload() + return + + regexp = r"http://(?:[^/]*\.)?(%s)/\w{12}" % ("|".join(sorted(hosterList)).replace('.', '\.')) + #self.logDebug(regexp) + + dict = self.core.pluginManager.hosterPlugins['XFileSharingPro'] + dict['pattern'] = regexp + dict['re'] = re.compile(regexp) + self.logDebug("Pattern loaded - handling %d hosters" % len(hosterList)) + + def getConfigSet(self, option): + s = self.getConfig(option).lower().replace('|', ',').replace(';', ',') + return set([x.strip() for x in s.split(',')]) + + def unload(self): + dict = self.core.pluginManager.hosterPlugins['XFileSharingPro'] + dict['pattern'] = r'^unmatchable$' + dict['re'] = re.compile(r'^unmatchable$') diff --git a/pyload/plugins/hooks/XMPPInterface.py b/pyload/plugins/hooks/XMPPInterface.py new file mode 100644 index 000000000..881e7f5dc --- /dev/null +++ b/pyload/plugins/hooks/XMPPInterface.py @@ -0,0 +1,233 @@ +# -*- coding: utf-8 -*- + +from pyxmpp import streamtls +from pyxmpp.all import JID, Message +from pyxmpp.interface import implements +from pyxmpp.interfaces import * +from pyxmpp.jabber.client import JabberClient + +from pyload.plugins.hooks.IRCInterface import IRCInterface + + +class XMPPInterface(IRCInterface, JabberClient): + __name__ = "XMPPInterface" + __type__ = "hook" + __version__ = "0.11" + + __config__ = [("activated", "bool", "Activated", False), + ("jid", "str", "Jabber ID", "user@exmaple-jabber-server.org"), + ("pw", "str", "Password", ""), + ("tls", "bool", "Use TLS", False), + ("owners", "str", "List of JIDs accepting commands from", "me@icq-gateway.org;some@msn-gateway.org"), + ("info_file", "bool", "Inform about every file finished", False), + ("info_pack", "bool", "Inform about every package finished", True), + ("captcha", "bool", "Send captcha requests", True)] + + __description__ = """Connect to jabber and let owner perform different tasks""" + __author_name__ = "RaNaN" + __author_mail__ = "RaNaN@pyload.org" + + + implements(IMessageHandlersProvider) + + def __init__(self, core, manager): + IRCInterface.__init__(self, core, manager) + + self.jid = JID(self.getConfig("jid")) + password = self.getConfig("pw") + + # if bare JID is provided add a resource -- it is required + if not self.jid.resource: + self.jid = JID(self.jid.node, self.jid.domain, "pyLoad") + + if self.getConfig("tls"): + tls_settings = streamtls.TLSSettings(require=True, verify_peer=False) + auth = ("sasl:PLAIN", "sasl:DIGEST-MD5") + else: + tls_settings = None + auth = ("sasl:DIGEST-MD5", "digest") + + # setup client with provided connection information + # and identity data + JabberClient.__init__(self, self.jid, password, + disco_name="pyLoad XMPP Client", disco_type="bot", + tls_settings=tls_settings, auth_methods=auth) + + self.interface_providers = [ + VersionHandler(self), + self, + ] + + def coreReady(self): + self.new_package = {} + + self.start() + + def packageFinished(self, pypack): + try: + if self.getConfig("info_pack"): + self.announce(_("Package finished: %s") % pypack.name) + except: + pass + + def downloadFinished(self, pyfile): + try: + if self.getConfig("info_file"): + self.announce( + _("Download finished: %(name)s @ %(plugin)s") % {"name": pyfile.name, "plugin": pyfile.pluginname}) + except: + pass + + def run(self): + # connect to IRC etc. + self.connect() + try: + self.loop() + except Exception, ex: + self.logError("pyLoad XMPP: %s" % str(ex)) + + def stream_state_changed(self, state, arg): + """This one is called when the state of stream connecting the component + to a server changes. This will usually be used to let the user + know what is going on.""" + self.logDebug("pyLoad XMPP: *** State changed: %s %r ***" % (state, arg)) + + def disconnected(self): + self.logDebug("pyLoad XMPP: Client was disconnected") + + def stream_closed(self, stream): + self.logDebug("pyLoad XMPP: Stream was closed | %s" % stream) + + def stream_error(self, err): + self.logDebug("pyLoad XMPP: Stream Error: %s" % err) + + def get_message_handlers(self): + """Return list of (message_type, message_handler) tuples. + + The handlers returned will be called when matching message is received + in a client session.""" + return [("normal", self.message)] + + def message(self, stanza): + """Message handler for the component.""" + subject = stanza.get_subject() + body = stanza.get_body() + t = stanza.get_type() + self.logDebug(u'pyLoad XMPP: Message from %s received.' % (unicode(stanza.get_from(),))) + self.logDebug(u'pyLoad XMPP: Body: %s Subject: %s Type: %s' % (body, subject, t)) + + if t == "headline": + # 'headline' messages should never be replied to + return True + if subject: + subject = u"Re: " + subject + + to_jid = stanza.get_from() + from_jid = stanza.get_to() + + #j = JID() + to_name = to_jid.as_utf8() + from_name = from_jid.as_utf8() + + names = self.getConfig("owners").split(";") + + if to_name in names or to_jid.node + "@" + to_jid.domain in names: + messages = [] + + trigger = "pass" + args = None + + try: + temp = body.split() + trigger = temp[0] + if len(temp) > 1: + args = temp[1:] + except: + pass + + handler = getattr(self, "event_%s" % trigger, self.event_pass) + try: + res = handler(args) + for line in res: + m = Message( + to_jid=to_jid, + from_jid=from_jid, + stanza_type=stanza.get_type(), + subject=subject, + body=line) + + messages.append(m) + except Exception, e: + self.logError("pyLoad XMPP: " + repr(e)) + + return messages + + else: + return True + + def response(self, msg, origin=""): + return self.announce(msg) + + def announce(self, message): + """ send message to all owners""" + for user in self.getConfig("owners").split(";"): + self.logDebug("pyLoad XMPP: Send message to %s" % user) + + to_jid = JID(user) + + m = Message(from_jid=self.jid, + to_jid=to_jid, + stanza_type="chat", + body=message) + + stream = self.get_stream() + if not stream: + self.connect() + stream = self.get_stream() + + stream.send(m) + + def beforeReconnecting(self, ip): + self.disconnect() + + def afterReconnecting(self, ip): + self.connect() + + +class VersionHandler(object): + """Provides handler for a version query. + + This class will answer version query and announce 'jabber:iq:version' namespace + in the client's disco#info results.""" + + implements(IIqHandlersProvider, IFeaturesProvider) + + def __init__(self, client): + """Just remember who created this.""" + self.client = client + + def get_features(self): + """Return namespace which should the client include in its reply to a + disco#info query.""" + return ["jabber:iq:version"] + + def get_iq_get_handlers(self): + """Return list of tuples (element_name, namespace, handler) describing + handlers of stanzas""" + return [("query", "jabber:iq:version", self.get_version)] + + def get_iq_set_handlers(self): + """Return empty list, as this class provides no stanza handler.""" + return [] + + def get_version(self, iq): + """Handler for jabber:iq:version queries. + + jabber:iq:version queries are not supported directly by PyXMPP, so the + XML node is accessed directly through the libxml2 API. This should be + used very carefully!""" + iq = iq.make_result_response() + q = iq.new_query("jabber:iq:version") + q.newTextChild(q.ns(), "name", "Echo component") + q.newTextChild(q.ns(), "version", "1.0") + return iq diff --git a/pyload/plugins/hooks/ZeveraCom.py b/pyload/plugins/hooks/ZeveraCom.py new file mode 100644 index 000000000..155143f64 --- /dev/null +++ b/pyload/plugins/hooks/ZeveraCom.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +from pyload.network.RequestFactory import getURL +from pyload.plugins.internal.MultiHoster import MultiHoster + + +class ZeveraCom(MultiHoster): + __name__ = "ZeveraCom" + __type__ = "hook" + __version__ = "0.02" + + __config__ = [("activated", "bool", "Activated", False), + ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), + ("hosterList", "str", "Hoster list (comma separated)", "")] + + __description__ = """Real-Debrid.com hook plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + + def getHoster(self): + page = getURL("http://www.zevera.com/jDownloader.ashx?cmd=gethosters") + return [x.strip() for x in page.replace("\"", "").split(",")] diff --git a/pyload/plugins/hooks/__init__.py b/pyload/plugins/hooks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pyload/plugins/hoster/AlldebridCom.py b/pyload/plugins/hoster/AlldebridCom.py new file mode 100644 index 000000000..1b115f19e --- /dev/null +++ b/pyload/plugins/hoster/AlldebridCom.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- + +import re + +from random import randrange +from urllib import unquote + +from pyload.common.json_layer import json_loads +from pyload.plugins.Hoster import Hoster +from pyload.utils import parseFileSize + + +class AlldebridCom(Hoster): + __name__ = "AlldebridCom" + __type__ = "hoster" + __version__ = "0.34" + + __pattern__ = r'https?://(?:[^/]*\.)?alldebrid\..*' + + __description__ = """Alldebrid.com hoster plugin""" + __author_name__ = "Andy Voigt" + __author_mail__ = "spamsales@online.de" + + + def getFilename(self, url): + try: + name = unquote(url.rsplit("/", 1)[1]) + except IndexError: + name = "Unknown_Filename..." + if name.endswith("..."): # incomplete filename, append random stuff + name += "%s.tmp" % randrange(100, 999) + return name + + def setup(self): + self.chunkLimit = 16 + self.resumeDownload = True + + def process(self, pyfile): + if re.match(self.__pattern__, pyfile.url): + new_url = pyfile.url + elif not self.account: + self.logError(_("Please enter your %s account or deactivate this plugin") % "AllDebrid") + self.fail("No AllDebrid account provided") + else: + self.logDebug("Old URL: %s" % pyfile.url) + password = self.getPassword().splitlines() + password = "" if not password else password[0] + + url = "http://www.alldebrid.com/service.php?link=%s&json=true&pw=%s" % (pyfile.url, password) + page = self.load(url) + data = json_loads(page) + + self.logDebug("Json data: %s" % str(data)) + + if data['error']: + if data['error'] == "This link isn't available on the hoster website.": + self.offline() + else: + self.logWarning(data['error']) + self.tempOffline() + else: + if pyfile.name and not pyfile.name.endswith('.tmp'): + pyfile.name = data['filename'] + pyfile.size = parseFileSize(data['filesize']) + new_url = data['link'] + + if self.getConfig("https"): + new_url = new_url.replace("http://", "https://") + else: + new_url = new_url.replace("https://", "http://") + + if new_url != pyfile.url: + self.logDebug("New URL: %s" % new_url) + + if pyfile.name.startswith("http") or pyfile.name.startswith("Unknown"): + #only use when name wasnt already set + pyfile.name = self.getFilename(new_url) + + self.download(new_url, disposition=True) + + check = self.checkDownload({"error": "An error occured while processing your request", + "empty": re.compile(r"^$")}) + + if check == "error": + self.retry(wait_time=60, reason="An error occured while generating link.") + elif check == "empty": + self.retry(wait_time=60, reason="Downloaded File was empty.") diff --git a/pyload/plugins/hoster/BasePlugin.py b/pyload/plugins/hoster/BasePlugin.py new file mode 100644 index 000000000..55cdf5b88 --- /dev/null +++ b/pyload/plugins/hoster/BasePlugin.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- + +from re import match, search +from urllib import unquote +from urlparse import urlparse + +from pyload.network.HTTPRequest import BadHeader +from pyload.plugins.Hoster import Hoster +from pyload.utils import html_unescape, remove_chars + + +class BasePlugin(Hoster): + __name__ = "BasePlugin" + __type__ = "hoster" + __version__ = "0.20" + + __pattern__ = r'^unmatchable$' + + __description__ = """Base Plugin when any other didnt fit""" + __author_name__ = "RaNaN" + __author_mail__ = "RaNaN@pyload.org" + + + def setup(self): + self.chunkLimit = -1 + self.resumeDownload = True + + def process(self, pyfile): + """main function""" + + #debug part, for api exerciser + if pyfile.url.startswith("DEBUG_API"): + self.multiDL = False + return + + # self.__name__ = "NetloadIn" + # pyfile.name = "test" + # self.html = self.load("http://localhost:9000/short") + # self.download("http://localhost:9000/short") + # self.api = self.load("http://localhost:9000/short") + # self.decryptCaptcha("http://localhost:9000/captcha") + # + # if pyfile.url == "79": + # self.core.api.addPackage("test", [str(i) for i in xrange(80)], 1) + # + # return + if pyfile.url.startswith("http"): + + try: + self.downloadFile(pyfile) + except BadHeader, e: + if e.code in (401, 403): + self.logDebug("Auth required") + + account = self.core.accountManager.getAccountPlugin('Http') + servers = [x['login'] for x in account.getAllAccounts()] + server = urlparse(pyfile.url).netloc + + if server in servers: + self.logDebug("Logging on to %s" % server) + self.req.addAuth(account.accounts[server]['password']) + else: + for pwd in pyfile.package().password.splitlines(): + if ":" in pwd: + self.req.addAuth(pwd.strip()) + break + else: + self.fail(_("Authorization required (username:password)")) + + self.downloadFile(pyfile) + else: + raise + + else: + self.fail("No Plugin matched and not a downloadable url.") + + def downloadFile(self, pyfile): + url = pyfile.url + + for _ in xrange(5): + header = self.load(url, just_header=True) + + # self.load does not raise a BadHeader on 404 responses, do it here + if 'code' in header and header['code'] == 404: + raise BadHeader(404) + + if 'location' in header: + self.logDebug("Location: " + header['location']) + base = match(r'https?://[^/]+', url).group(0) + if header['location'].startswith("http"): + url = header['location'] + elif header['location'].startswith("/"): + url = base + unquote(header['location']) + else: + url = '%s/%s' % (base, unquote(header['location'])) + else: + break + + name = html_unescape(unquote(urlparse(url).path.split("/")[-1])) + + if 'content-disposition' in header: + self.logDebug("Content-Disposition: " + header['content-disposition']) + m = search("filename(?P=|\*=(?P.+)'')(?P.*)", header['content-disposition']) + if m: + disp = m.groupdict() + self.logDebug(disp) + if not disp['enc']: + disp['enc'] = 'utf-8' + name = remove_chars(disp['name'], "\"';").strip() + name = unicode(unquote(name), disp['enc']) + + if not name: + name = url + pyfile.name = name + self.logDebug("Filename: %s" % pyfile.name) + self.download(url, disposition=True) diff --git a/pyload/plugins/hoster/BayfilesCom.py b/pyload/plugins/hoster/BayfilesCom.py new file mode 100644 index 000000000..ea4bd3ca5 --- /dev/null +++ b/pyload/plugins/hoster/BayfilesCom.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- + +import re + +from time import time + +from pyload.common.json_layer import json_loads +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class BayfilesCom(SimpleHoster): + __name__ = "BayfilesCom" + __type__ = "hoster" + __version__ = "0.07" + + __pattern__ = r'https?://(?:www\.)?bayfiles\.(com|net)/file/(?P[a-zA-Z0-9]+/[a-zA-Z0-9]+/[^/]+)' + + __description__ = """Bayfiles.com hoster plugin""" + __author_name__ = ("zoidberg", "Walter Purcaro") + __author_mail__ = ("zoidberg@mujmail.cz", "vuolter@gmail.com") + + FILE_INFO_PATTERN = r'

        [^<]*(?P[0-9., ]+)(?P[kKMG])i?B

        ' + OFFLINE_PATTERN = r'(

        The requested file could not be found.

        |404 Not Found)' + + WAIT_PATTERN = r'>Your IP [0-9.]* has recently downloaded a file\. Upgrade to premium or wait (\d+) minutes\.<' + VARS_PATTERN = r'var vfid = (\d+);\s*var delay = (\d+);' + FREE_LINK_PATTERN = r"javascript:window.location.href = '([^']+)';" + PREMIUM_LINK_PATTERN = r'(?:BayFiles"), + "notfound": re.compile(r"404 Not Found") + }) + if check == "waitforfreeslots": + self.retry(30, 5 * 60, "Wait for free slot") + elif check == "notfound": + self.retry(30, 5 * 60, "404 Not found") + + +getInfo = create_getInfo(BayfilesCom) diff --git a/pyload/plugins/hoster/BezvadataCz.py b/pyload/plugins/hoster/BezvadataCz.py new file mode 100644 index 000000000..8b989da67 --- /dev/null +++ b/pyload/plugins/hoster/BezvadataCz.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class BezvadataCz(SimpleHoster): + __name__ = "BezvadataCz" + __type__ = "hoster" + __version__ = "0.24" + + __pattern__ = r'http://(?:www\.)?bezvadata.cz/stahnout/.*' + + __description__ = """BezvaData.cz hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FILE_NAME_PATTERN = r'

        Soubor: (?P[^<]+)

        ' + FILE_SIZE_PATTERN = r'
      • Velikost: (?P[^<]+)
      • ' + OFFLINE_PATTERN = r'BezvaData \| Soubor nenalezen' + + + def setup(self): + self.multiDL = self.resumeDownload = True + + def handleFree(self): + #download button + m = re.search(r'
        ', self.html) + if m is None: + self.parseError("page2 URL") + url = "http://bezvadata.cz%s" % m.group(1) + self.logDebug("DL URL %s" % url) + + #countdown + m = re.search(r'id="countdown">(\d\d):(\d\d)<', self.html) + wait_time = (int(m.group(1)) * 60 + int(m.group(2)) + 1) if m else 120 + self.wait(wait_time, False) + + self.download(url) + + def checkErrors(self): + if 'images/button-download-disable.png' in self.html: + self.longWait(5 * 60, 24) # parallel dl limit + elif '
        Filename:(?P.*?)
        ' + FILE_SIZE_PATTERN = r'Size:(?P.*?)
        ' + + +getInfo = create_getInfo(BillionuploadsCom) diff --git a/pyload/plugins/hoster/BitshareCom.py b/pyload/plugins/hoster/BitshareCom.py new file mode 100644 index 000000000..897206f87 --- /dev/null +++ b/pyload/plugins/hoster/BitshareCom.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import re + +from pyload.plugins.internal.CaptchaService import ReCaptcha +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class BitshareCom(SimpleHoster): + __name__ = "BitshareCom" + __type__ = "hoster" + __version__ = "0.50" + + __pattern__ = r'http://(?:www\.)?bitshare\.com/(files/(?P[a-zA-Z0-9]+)(/(?P.*?)\.html)?|\?f=(?P[a-zA-Z0-9]+))' + + __description__ = """Bitshare.com hoster plugin""" + __author_name__ = ("Paul King", "fragonib") + __author_mail__ = ("", "fragonib[AT]yahoo[DOT]es") + + FILE_INFO_PATTERN = r'Downloading (?P.+) - (?P[\d.]+) (?P\w+)' + OFFLINE_PATTERN = r'(>We are sorry, but the requested file was not found in our database|>Error - File not available<|The file was deleted either by the uploader, inactivity or due to copyright claim)' + + FILE_AJAXID_PATTERN = r'var ajaxdl = "(.*?)";' + CAPTCHA_KEY_PATTERN = r'http://api\.recaptcha\.net/challenge\?k=(.*?) ' + TRAFFIC_USED_UP = r'Your Traffic is used up for today. Upgrade to premium to continue!' + + + def setup(self): + self.req.cj.setCookie(".bitshare.com", "language_selection", "EN") + self.multiDL = self.premium + self.chunkLimit = 1 + + def process(self, pyfile): + if self.premium: + self.account.relogin(self.user) + + self.pyfile = pyfile + + # File id + m = re.match(self.__pattern__, pyfile.url) + self.file_id = max(m.group('id1'), m.group('id2')) + self.logDebug("File id is [%s]" % self.file_id) + + # Load main page + self.html = self.load(pyfile.url, ref=False, decode=True) + + # Check offline + if re.search(self.OFFLINE_PATTERN, self.html): + self.offline() + + # Check Traffic used up + if re.search(self.TRAFFIC_USED_UP, self.html): + self.logInfo("Your Traffic is used up for today") + self.wait(30 * 60, True) + self.retry() + + # File name + m = re.match(self.__pattern__, pyfile.url) + name1 = m.group('name') if m else None + m = re.search(self.FILE_INFO_PATTERN, self.html) + name2 = m.group('N') if m else None + pyfile.name = max(name1, name2) + + # Ajax file id + self.ajaxid = re.search(self.FILE_AJAXID_PATTERN, self.html).group(1) + self.logDebug("File ajax id is [%s]" % self.ajaxid) + + # This may either download our file or forward us to an error page + url = self.getDownloadUrl() + self.logDebug("Downloading file with url [%s]" % url) + self.download(url) + + check = self.checkDownload({"404": ">404 Not Found<", "Error": ">Error occured<"}) + if check == "404": + self.retry(3, 60, 'Error 404') + elif check == "error": + self.retry(5, 5 * 60, "Bitshare host : Error occured") + + def getDownloadUrl(self): + # Return location if direct download is active + if self.premium: + header = self.load(self.pyfile.url, cookies=True, just_header=True) + if 'location' in header: + return header['location'] + + # Get download info + self.logDebug("Getting download info") + response = self.load("http://bitshare.com/files-ajax/" + self.file_id + "/request.html", + post={"request": "generateID", "ajaxid": self.ajaxid}) + self.handleErrors(response, ':') + parts = response.split(":") + filetype = parts[0] + wait = int(parts[1]) + captcha = int(parts[2]) + self.logDebug("Download info [type: '%s', waiting: %d, captcha: %d]" % (filetype, wait, captcha)) + + # Waiting + if wait > 0: + self.logDebug("Waiting %d seconds." % wait) + if wait < 120: + self.wait(wait, False) + else: + self.wait(wait - 55, True) + self.retry() + + # Resolve captcha + if captcha == 1: + self.logDebug("File is captcha protected") + id = re.search(self.CAPTCHA_KEY_PATTERN, self.html).group(1) + # Try up to 3 times + for i in xrange(3): + self.logDebug("Resolving ReCaptcha with key [%s], round %d" % (id, i + 1)) + recaptcha = ReCaptcha(self) + challenge, code = recaptcha.challenge(id) + response = self.load("http://bitshare.com/files-ajax/" + self.file_id + "/request.html", + post={"request": "validateCaptcha", "ajaxid": self.ajaxid, + "recaptcha_challenge_field": challenge, "recaptcha_response_field": code}) + if self.handleCaptchaErrors(response): + break + + # Get download URL + self.logDebug("Getting download url") + response = self.load("http://bitshare.com/files-ajax/" + self.file_id + "/request.html", + post={"request": "getDownloadURL", "ajaxid": self.ajaxid}) + self.handleErrors(response, '#') + url = response.split("#")[-1] + + return url + + def handleErrors(self, response, separator): + self.logDebug("Checking response [%s]" % response) + if "ERROR:Session timed out" in response: + self.retry() + elif "ERROR" in response: + msg = response.split(separator)[-1] + self.fail(msg) + + def handleCaptchaErrors(self, response): + self.logDebug("Result of captcha resolving [%s]" % response) + if "SUCCESS" in response: + self.correctCaptcha() + return True + elif "ERROR:SESSION ERROR" in response: + self.retry() + self.logDebug("Wrong captcha") + self.invalidCaptcha() + + +getInfo = create_getInfo(BitshareCom) diff --git a/pyload/plugins/hoster/BoltsharingCom.py b/pyload/plugins/hoster/BoltsharingCom.py new file mode 100644 index 000000000..196e801e4 --- /dev/null +++ b/pyload/plugins/hoster/BoltsharingCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class BoltsharingCom(DeadHoster): + __name__ = "BoltsharingCom" + __type__ = "hoster" + __version__ = "0.02" + + __pattern__ = r'http://(?:www\.)?boltsharing.com/\w{12}' + + __description__ = """Boltsharing.com hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + +getInfo = create_getInfo(BoltsharingCom) diff --git a/pyload/plugins/hoster/CatShareNet.py b/pyload/plugins/hoster/CatShareNet.py new file mode 100644 index 000000000..415ec2379 --- /dev/null +++ b/pyload/plugins/hoster/CatShareNet.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.CaptchaService import ReCaptcha +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class CatShareNet(SimpleHoster): + __name__ = "CatShareNet" + __type__ = "hoster" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?catshare.net/\w{16}.*' + + __description__ = """CatShare.net hoster plugin""" + __author_name__ = "z00nx" + __author_mail__ = "z00nx0@gmail.com" + + FILE_INFO_PATTERN = r'

        ]+>(?P.*)

        \s+

        ]+>(?P.*)

        ' + OFFLINE_PATTERN = r'Podany plik zosta' + + SECONDS_PATTERN = r'var\s+count\s+=\s+(\d+);' + + RECAPTCHA_KEY = "6Lfln9kSAAAAANZ9JtHSOgxUPB9qfDFeLUI_QMEy" + + + def handleFree(self): + m = re.search(self.SECONDS_PATTERN, self.html) + seconds = int(m.group(1)) + self.logDebug("Seconds found", seconds) + self.wait(seconds + 1) + recaptcha = ReCaptcha(self) + challenge, code = recaptcha.challenge(self.RECAPTCHA_KEY) + post_data = {"recaptcha_challenge_field": challenge, "recaptcha_response_field": code} + self.download(self.pyfile.url, post=post_data) + check = self.checkDownload({"html": re.compile("\A\s*(?P.*?).*?\s*\((?P.*?)\)' + LINK_PATTERN = r'href="(http://cramit.in/file_download/.*?)"' + + + def setup(self): + self.resumeDownload = self.multiDL = self.premium + + +getInfo = create_getInfo(CramitIn) diff --git a/pyload/plugins/hoster/CrockoCom.py b/pyload/plugins/hoster/CrockoCom.py new file mode 100644 index 000000000..c1e941553 --- /dev/null +++ b/pyload/plugins/hoster/CrockoCom.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.CaptchaService import ReCaptcha +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class CrockoCom(SimpleHoster): + __name__ = "CrockoCom" + __type__ = "hoster" + __version__ = "0.16" + + __pattern__ = r'http://(?:www\.)?(crocko|easy-share).com/\w+' + + __description__ = """Crocko hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FILE_NAME_PATTERN = r'Download:\s*(?P.*)' + FILE_SIZE_PATTERN = r'(?P[^<]+)' + OFFLINE_PATTERN = r"

        Sorry,
        the page you're looking for
        isn't here.

        |File not found" + + CAPTCHA_URL_PATTERN = re.compile(r"u='(/file_contents/captcha/\w+)';\s*w='(\d+)';") + CAPTCHA_KEY_PATTERN = re.compile(r'Recaptcha.create\("([^"]+)"') + + FORM_PATTERN = r'(.*?)' + FORM_INPUT_PATTERN = r']* name="?([^" ]+)"? value="?([^" ]+)"?[^>]*>' + + FILE_NAME_REPLACEMENTS = [(r'<[^>]*>', '')] + + + def handleFree(self): + if "You need Premium membership to download this file." in self.html: + self.fail("You need Premium membership to download this file.") + + for _ in xrange(5): + m = re.search(self.CAPTCHA_URL_PATTERN, self.html) + if m: + url, wait_time = 'http://crocko.com' + m.group(1), m.group(2) + self.wait(wait_time) + self.html = self.load(url) + else: + break + + m = re.search(self.CAPTCHA_KEY_PATTERN, self.html) + if m is None: + self.parseError('Captcha KEY') + captcha_key = m.group(1) + + m = re.search(self.FORM_PATTERN, self.html, re.DOTALL) + if m is None: + self.parseError('ACTION') + action, form = m.groups() + inputs = dict(re.findall(self.FORM_INPUT_PATTERN, form)) + + recaptcha = ReCaptcha(self) + + for _ in xrange(5): + inputs['recaptcha_challenge_field'], inputs['recaptcha_response_field'] = recaptcha.challenge(captcha_key) + self.download(action, post=inputs) + + check = self.checkDownload({ + "captcha_err": self.CAPTCHA_KEY_PATTERN + }) + + if check == "captcha_err": + self.invalidCaptcha() + else: + break + else: + self.fail('No valid captcha solution received') + + +getInfo = create_getInfo(CrockoCom) diff --git a/pyload/plugins/hoster/CyberlockerCh.py b/pyload/plugins/hoster/CyberlockerCh.py new file mode 100644 index 000000000..7c97deedb --- /dev/null +++ b/pyload/plugins/hoster/CyberlockerCh.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class CyberlockerCh(DeadHoster): + __name__ = "CyberlockerCh" + __type__ = "hoster" + __version__ = "0.02" + + __pattern__ = r'http://(?:www\.)?cyberlocker\.ch/\w+' + + __description__ = """Cyberlocker.ch hoster plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + +getInfo = create_getInfo(CyberlockerCh) diff --git a/pyload/plugins/hoster/CzshareCom.py b/pyload/plugins/hoster/CzshareCom.py new file mode 100644 index 000000000..0e6fab15a --- /dev/null +++ b/pyload/plugins/hoster/CzshareCom.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- +# +# Test links: +# http://czshare.com/5278880/random.bin + +import re + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo +from pyload.utils import parseFileSize + + +class CzshareCom(SimpleHoster): + __name__ = "CzshareCom" + __type__ = "hoster" + __version__ = "0.94" + + __pattern__ = r'http://(?:www\.)?(czshare|sdilej)\.(com|cz)/(\d+/|download.php\?).*' + + __description__ = """CZshare.com hoster plugin, now Sdilej.cz""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FILE_NAME_PATTERN = r'
        \s*

        \s*Cel. n.zev: ]*>(?P[^<]+)' + FILE_SIZE_PATTERN = r'

        (?:\s*

        [^\n]*

        )*\s*Velikost:\s*(?P[0-9., ]+)(?P[kKMG])i?B\s*
        ' + OFFLINE_PATTERN = r'
        \s*

        ' + + FILE_SIZE_REPLACEMENTS = [(' ', '')] + FILE_URL_REPLACEMENTS = [(r'http://[^/]*/download.php\?.*?id=(\w+).*', r'http://sdilej.cz/\1/x/')] + + SH_CHECK_TRAFFIC = True + + FREE_URL_PATTERN = r'[^>]*alt="([^"]+)" />' + FREE_FORM_PATTERN = r'
        \s*(.*?)
        ' + PREMIUM_FORM_PATTERN = r'
        (.*?)
        ' + FORM_INPUT_PATTERN = r']* name="([^"]+)" value="([^"]+)"[^>]*/>' + MULTIDL_PATTERN = r"

        Z[^<]*PROFI.

        " + USER_CREDIT_PATTERN = r'
        \s*kredit: ([0-9., ]+)([kKMG]i?B)\s*
        ' + + + def checkTrafficLeft(self): + # check if user logged in + m = re.search(self.USER_CREDIT_PATTERN, self.html) + if m is None: + self.account.relogin(self.user) + self.html = self.load(self.pyfile.url, cookies=True, decode=True) + m = re.search(self.USER_CREDIT_PATTERN, self.html) + if m is None: + return False + + # check user credit + try: + credit = parseFileSize(m.group(1).replace(' ', ''), m.group(2)) + self.logInfo("Premium download for %i KiB of Credit" % (self.pyfile.size / 1024)) + self.logInfo("User %s has %i KiB left" % (self.user, credit / 1024)) + if credit < self.pyfile.size: + self.logInfo("Not enough credit to download file %s" % self.pyfile.name) + return False + except Exception, e: + # let's continue and see what happens... + self.logError('Parse error (CREDIT): %s' % e) + + return True + + def handlePremium(self): + # parse download link + try: + form = re.search(self.PREMIUM_FORM_PATTERN, self.html, re.DOTALL).group(1) + inputs = dict(re.findall(self.FORM_INPUT_PATTERN, form)) + except Exception, e: + self.logError("Parse error (FORM): %s" % e) + self.resetAccount() + + # download the file, destination is determined by pyLoad + self.download("http://sdilej.cz/profi_down.php", post=inputs, disposition=True) + self.checkDownloadedFile() + + def handleFree(self): + # get free url + m = re.search(self.FREE_URL_PATTERN, self.html) + if m is None: + self.parseError('Free URL') + parsed_url = "http://sdilej.cz" + m.group(1) + self.logDebug("PARSED_URL:" + parsed_url) + + # get download ticket and parse html + self.html = self.load(parsed_url, cookies=True, decode=True) + if re.search(self.MULTIDL_PATTERN, self.html): + self.longWait(5 * 60, 12) + + try: + form = re.search(self.FREE_FORM_PATTERN, self.html, re.DOTALL).group(1) + inputs = dict(re.findall(self.FORM_INPUT_PATTERN, form)) + self.pyfile.size = int(inputs['size']) + except Exception, e: + self.logError(e) + self.parseError('Form') + + # get and decrypt captcha + captcha_url = 'http://sdilej.cz/captcha.php' + for _ in xrange(5): + inputs['captchastring2'] = self.decryptCaptcha(captcha_url) + self.html = self.load(parsed_url, cookies=True, post=inputs, decode=True) + if u"
      • Zadaný ověřovací kód nesouhlasí!
      • " in self.html: + self.invalidCaptcha() + elif re.search(self.MULTIDL_PATTERN, self.html): + self.longWait(5 * 60, 12) + else: + self.correctCaptcha() + break + else: + self.fail("No valid captcha code entered") + + m = re.search("countdown_number = (\d+);", self.html) + self.setWait(int(m.group(1)) if m else 50) + + # download the file, destination is determined by pyLoad + self.logDebug("WAIT URL", self.req.lastEffectiveURL) + m = re.search("free_wait.php\?server=(.*?)&(.*)", self.req.lastEffectiveURL) + if m is None: + self.parseError('Download URL') + + url = "http://%s/download.php?%s" % (m.group(1), m.group(2)) + + self.wait() + self.download(url) + self.checkDownloadedFile() + + def checkDownloadedFile(self): + # check download + check = self.checkDownload({ + "tempoffline": re.compile(r"^Soubor je do.*asn.* nedostupn.*$"), + "credit": re.compile(r"^Nem.*te dostate.*n.* kredit.$"), + "multi_dl": re.compile(self.MULTIDL_PATTERN), + "captcha_err": "
      • Zadaný ověřovací kód nesouhlasí!
      • " + }) + + if check == "tempoffline": + self.fail("File not available - try later") + if check == "credit": + self.resetAccount() + elif check == "multi_dl": + self.longWait(5 * 60, 12) + elif check == "captcha_err": + self.invalidCaptcha() + self.retry() + + +getInfo = create_getInfo(CzshareCom) diff --git a/pyload/plugins/hoster/DailymotionCom.py b/pyload/plugins/hoster/DailymotionCom.py new file mode 100644 index 000000000..0ae4c697b --- /dev/null +++ b/pyload/plugins/hoster/DailymotionCom.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.PyFile import statusMap +from pyload.common.json_layer import json_loads +from pyload.network.RequestFactory import getURL +from pyload.plugins.Hoster import Hoster + + +def getInfo(urls): + result = [] #: [ .. (name, size, status, url) .. ] + regex = re.compile(DailymotionCom.__pattern__) + apiurl = "https://api.dailymotion.com/video/" + request = {"fields": "access_error,status,title"} + for url in urls: + id = regex.search(url).group("ID") + page = getURL(apiurl + id, get=request) + info = json_loads(page) + + if "title" in info: + name = info['title'] + ".mp4" + else: + name = url + + if "error" in info or info['access_error']: + status = "offline" + else: + status = info['status'] + if status in ("ready", "published"): + status = "online" + elif status in ("waiting", "processing"): + status = "temp. offline" + else: + status = "offline" + + result.append((name, 0, statusMap[status], url)) + return result + + +class DailymotionCom(Hoster): + __name__ = "DailymotionCom" + __type__ = "hoster" + __version__ = "0.2" + + __pattern__ = r'https?://(?:www\.)?dailymotion\.com/.*?video/(?P[\w^_]+)' + __config__ = [("quality", "Lowest;LD 144p;LD 240p;SD 384p;HQ 480p;HD 720p;HD 1080p;Highest", "Quality", "Highest")] + + __description__ = """Dailymotion.com hoster plugin""" + __author_name__ = "Walter Purcaro" + __author_mail__ = "vuolter@gmail.com" + + + def setup(self): + self.resumeDownload = self.multiDL = True + + def getStreams(self): + streams = [] + for result in re.finditer(r"\"(?Phttp:\\/\\/www.dailymotion.com\\/cdn\\/H264-(?P.*?)\\.*?)\"", + self.html): + url = result.group("URL") + qf = result.group("QF") + link = url.replace("\\", "") + quality = tuple(int(x) for x in qf.split("x")) + streams.append((quality, link)) + return sorted(streams, key=lambda x: x[0][::-1]) + + def getQuality(self): + q = self.getConfig("quality") + if q == "Lowest": + quality = 0 + elif q == "Highest": + quality = -1 + else: + quality = int(q.rsplit(" ")[1][:-1]) + return quality + + def getLink(self, streams, quality): + if quality > 0: + for x, s in reversed([item for item in enumerate(streams)]): + qf = s[0][1] + if qf <= quality: + idx = x + break + else: + idx = 0 + else: + idx = quality + + s = streams[idx] + self.logInfo("Download video quality %sx%s" % s[0]) + return s[1] + + def checkInfo(self, pyfile): + pyfile.name, pyfile.size, pyfile.status, pyfile.url = getInfo([pyfile.url])[0] + if pyfile.status == 1: + self.offline() + elif pyfile.status == 6: + self.tempOffline() + + def process(self, pyfile): + self.checkInfo(pyfile) + + id = re.match(self.__pattern__, pyfile.url).group("ID") + self.html = self.load("http://www.dailymotion.com/embed/video/" + id, decode=True) + + streams = self.getStreams() + quality = self.getQuality() + link = self.getLink(streams, quality) + + self.download(link) diff --git a/pyload/plugins/hoster/DataHu.py b/pyload/plugins/hoster/DataHu.py new file mode 100644 index 000000000..68162c203 --- /dev/null +++ b/pyload/plugins/hoster/DataHu.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Test links: +# http://data.hu/get/6381232/random.bin + +import re + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class DataHu(SimpleHoster): + __name__ = "DataHu" + __type__ = "hoster" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?data.hu/get/\w+' + + __description__ = """Data.hu hoster plugin""" + __author_name__ = ("crash", "stickell") + __author_mail__ = "l.stickell@yahoo.it" + + FILE_INFO_PATTERN = ur'(?P<N>.*) \((?P<S>[^)]+)\) let\xf6lt\xe9se' + OFFLINE_PATTERN = ur'Az adott f\xe1jl nem l\xe9tezik' + LINK_PATTERN = r'

        Velikost(?P[^<]+)(?P.*?)\s*(?P.*?)Datei wurde nicht gefunden<|>Bitte wähle deine Datei aus... <' + PARALELL_PATTERN = r'>Du lädst bereits eine Datei herunter<' + + WAIT_PATTERN = r'countdown\({seconds: (\d+)' + DATA_PATTERN = r'url: "(.*?)", data: "(.*?)",' + RECAPTCHA_KEY_PATTERN = r'Recaptcha.create\("(.*?)"' + + + def handleFree(self): + url = 'http://datei.to/ajax/download.php' + data = {'P': 'I', 'ID': self.file_info['ID']} + + recaptcha = ReCaptcha(self) + + for _ in xrange(10): + self.logDebug("URL", url, "POST", data) + self.html = self.load(url, post=data) + self.checkErrors() + + if url.endswith('download.php') and 'P' in data: + if data['P'] == 'I': + self.doWait() + + elif data['P'] == 'IV': + break + + m = re.search(self.DATA_PATTERN, self.html) + if m is None: + self.parseError('data') + url = 'http://datei.to/' + m.group(1) + data = dict(x.split('=') for x in m.group(2).split('&')) + + if url.endswith('recaptcha.php'): + m = re.search(self.RECAPTCHA_KEY_PATTERN, self.html) + recaptcha_key = m.group(1) if m else "6LdBbL8SAAAAAI0vKUo58XRwDd5Tu_Ze1DA7qTao" + + data['recaptcha_challenge_field'], data['recaptcha_response_field'] = recaptcha.challenge(recaptcha_key) + + else: + self.fail('Too bad...') + + download_url = self.html + self.logDebug('Download URL', download_url) + self.download(download_url) + + def checkErrors(self): + m = re.search(self.PARALELL_PATTERN, self.html) + if m: + m = re.search(self.WAIT_PATTERN, self.html) + wait_time = int(m.group(1)) if m else 30 + self.wait(wait_time + 1, False) + self.retry() + + def doWait(self): + m = re.search(self.WAIT_PATTERN, self.html) + wait_time = int(m.group(1)) if m else 30 + + self.load('http://datei.to/ajax/download.php', post={'P': 'Ads'}) + self.wait(wait_time + 1, False) + + +getInfo = create_getInfo(DateiTo) diff --git a/pyload/plugins/hoster/DdlstorageCom.py b/pyload/plugins/hoster/DdlstorageCom.py new file mode 100644 index 000000000..8b477ade6 --- /dev/null +++ b/pyload/plugins/hoster/DdlstorageCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class DdlstorageCom(DeadHoster): + __name__ = "DdlstorageCom" + __type__ = "hoster" + __version__ = "1.02" + + __pattern__ = r'https?://(?:www\.)?ddlstorage\.com/\w+' + + __description__ = """DDLStorage.com hoster plugin""" + __author_name__ = ("zoidberg", "stickell") + __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it") + + +getInfo = create_getInfo(DdlstorageCom) diff --git a/pyload/plugins/hoster/DebridItaliaCom.py b/pyload/plugins/hoster/DebridItaliaCom.py new file mode 100644 index 000000000..74879e6e5 --- /dev/null +++ b/pyload/plugins/hoster/DebridItaliaCom.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.Hoster import Hoster + + +class DebridItaliaCom(Hoster): + __name__ = "DebridItaliaCom" + __type__ = "hoster" + __version__ = "0.05" + + __pattern__ = r'https?://(?:[^/]*\.)?debriditalia\.com' + + __description__ = """Debriditalia.com hoster plugin""" + __author_name__ = "stickell" + __author_mail__ = "l.stickell@yahoo.it" + + + def setup(self): + self.chunkLimit = -1 + self.resumeDownload = True + + def process(self, pyfile): + if re.match(self.__pattern__, pyfile.url): + new_url = pyfile.url + elif not self.account: + self.logError(_("Please enter your %s account or deactivate this plugin") % "DebridItalia") + self.fail("No DebridItalia account provided") + else: + self.logDebug("Old URL: %s" % pyfile.url) + url = "http://debriditalia.com/linkgen2.php?xjxfun=convertiLink&xjxargs[]=S" % pyfile.url + page = self.load(url) + self.logDebug("XML data: %s" % page) + + if 'File not available' in page: + self.fail('File not available') + else: + new_url = re.search(r'(?P[^<]+)', page).group('direct') + + if new_url != pyfile.url: + self.logDebug("New URL: %s" % new_url) + + self.download(new_url, disposition=True) + + check = self.checkDownload({"empty": re.compile(r"^$")}) + + if check == "empty": + self.retry(5, 2 * 60, "Empty file downloaded") diff --git a/pyload/plugins/hoster/DepositfilesCom.py b/pyload/plugins/hoster/DepositfilesCom.py new file mode 100644 index 000000000..9c0348cbd --- /dev/null +++ b/pyload/plugins/hoster/DepositfilesCom.py @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- + +import re + +from urllib import unquote + +from pyload.plugins.internal.CaptchaService import ReCaptcha +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class DepositfilesCom(SimpleHoster): + __name__ = "DepositfilesCom" + __type__ = "hoster" + __version__ = "0.48" + + __pattern__ = r'https?://(?:www\.)?(depositfiles\.com|dfiles\.(eu|ru))(/\w{1,3})?/files/(?P\w+)' + + __description__ = """Depositfiles.com hoster plugin""" + __author_name__ = ("spoob", "zoidberg", "Walter Purcaro") + __author_mail__ = ("spoob@pyload.org", "zoidberg@mujmail.cz", "vuolter@gmail.com") + + FILE_NAME_PATTERN = r'' + + + def process(self, pyfile): + self.html = self.load(pyfile.url, decode=True) + self.getFileInfo() + + # parse js variables + self.jsvars = dict((x, y.strip("'")) for x, y in re.findall(r"var (\w+) = ([0-9.]+|'[^']*')", self.html)) + self.logDebug(self.jsvars) + pyfile.name = self.jsvars['ID3'] + + # determine download type - free or premium + if self.premium: + if 'UU_prihlasen' in self.jsvars: + if self.jsvars['UU_prihlasen'] == '0': + self.logWarning('User not logged in') + self.relogin(self.user) + self.retry() + elif float(self.jsvars['UU_kredit']) < float(self.jsvars['kredit_odecet']): + self.logWarning('Not enough credit left') + self.premium = False + + if self.premium: + self.handlePremium() + else: + self.handleFree() + + check = self.checkDownload({"err": re.compile(r"\AChyba!")}, max_size=100) + if check == "err": + self.fail("File not m or plugin defect") + + def handleFree(self): + # get download url + download_url = '%s/download.php' % self.jsvars['server'] + data = dict((x, self.jsvars[x]) for x in self.jsvars if x in ("ID1", "ID2", "ID3", "ID4")) + self.logDebug("FREE URL1:" + download_url, data) + + self.req.http.c.setopt(FOLLOWLOCATION, 0) + self.load(download_url, post=data) + self.header = self.req.http.header + self.req.http.c.setopt(FOLLOWLOCATION, 1) + + m = re.search("Location\s*:\s*(.*)", self.header, re.I) + if m is None: + self.fail('File not found') + download_url = m.group(1) + self.logDebug("FREE URL2:" + download_url) + + # check errors + m = re.search(r'/chyba/(\d+)', download_url) + if m: + if m.group(1) == '1': + self.retry(60, 2 * 60, "This IP is already downloading") + elif m.group(1) == '2': + self.retry(60, 60, "No free slots available") + else: + self.fail('Error %d' % m.group(1)) + + # download file + self.download(download_url) + + def handlePremium(self): + download_url = '%s/download_premium.php' % self.jsvars['server'] + data = dict((x, self.jsvars[x]) for x in self.jsvars if x in ("ID1", "ID2", "ID4", "ID5")) + self.logDebug("PREMIUM URL:" + download_url, data) + self.download(download_url, get=data) + + +getInfo = create_getInfo(QuickshareCz) diff --git a/pyload/plugins/hoster/RPNetBiz.py b/pyload/plugins/hoster/RPNetBiz.py new file mode 100644 index 000000000..e305c35ce --- /dev/null +++ b/pyload/plugins/hoster/RPNetBiz.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.Hoster import Hoster +from pyload.common.json_layer import json_loads + + +class RPNetBiz(Hoster): + __name__ = "RPNetBiz" + __type__ = "hoster" + __version__ = "0.1" + + __description__ = """RPNet.biz hoster plugin""" + + __pattern__ = r'https?://.*rpnet\.biz' + __author_name__ = "Dman" + __author_mail__ = "dmanugm@gmail.com" + + + def setup(self): + self.chunkLimit = -1 + self.resumeDownload = True + + def process(self, pyfile): + if re.match(self.__pattern__, pyfile.url): + link_status = {'generated': pyfile.url} + elif not self.account: + # Check account + self.logError(_("Please enter your %s account or deactivate this plugin") % "rpnet") + self.fail("No rpnet account provided") + else: + (user, data) = self.account.selectAccount() + + self.logDebug("Original URL: %s" % pyfile.url) + # Get the download link + response = self.load("https://premium.rpnet.biz/client_api.php", + get={"username": user, "password": data['password'], + "action": "generate", "links": pyfile.url}) + + self.logDebug("JSON data: %s" % response) + link_status = json_loads(response)['links'][0] # get the first link... since we only queried one + + # Check if we only have an id as a HDD link + if 'id' in link_status: + self.logDebug("Need to wait at least 30 seconds before requery") + self.setWait(30) # wait for 30 seconds + self.wait() + # Lets query the server again asking for the status on the link, + # we need to keep doing this until we reach 100 + max_tries = 30 + my_try = 0 + while (my_try <= max_tries): + self.logDebug("Try: %d ; Max Tries: %d" % (my_try, max_tries)) + response = self.load("https://premium.rpnet.biz/client_api.php", + get={"username": user, "password": data['password'], + "action": "downloadInformation", "id": link_status['id']}) + self.logDebug("JSON data hdd query: %s" % response) + download_status = json_loads(response)['download'] + + if download_status['status'] == '100': + link_status['generated'] = download_status['rpnet_link'] + self.logDebug("Successfully downloaded to rpnet HDD: %s" % link_status['generated']) + break + else: + self.logDebug("At %s%% for the file download" % download_status['status']) + + self.setWait(30) + self.wait() + my_try += 1 + + if my_try > max_tries: # We went over the limit! + self.fail("Waited for about 15 minutes for download to finish but failed") + + if 'generated' in link_status: + self.download(link_status['generated'], disposition=True) + elif 'error' in link_status: + self.fail(link_status['error']) + else: + self.fail("Something went wrong, not supposed to enter here") diff --git a/pyload/plugins/hoster/RapidgatorNet.py b/pyload/plugins/hoster/RapidgatorNet.py new file mode 100644 index 000000000..46fe285b7 --- /dev/null +++ b/pyload/plugins/hoster/RapidgatorNet.py @@ -0,0 +1,191 @@ +# -*- coding: utf-8 -*- + +import re + +from pycurl import HTTPHEADER + +from pyload.common.json_layer import json_loads +from pyload.network.HTTPRequest import BadHeader +from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight +from pyload.plugins.internal.CaptchaService import AdsCaptcha, ReCaptcha, SolveMedia +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class RapidgatorNet(SimpleHoster): + __name__ = "RapidgatorNet" + __type__ = "hoster" + __version__ = "0.22" + + __pattern__ = r'http://(?:www\.)?(rapidgator\.net|rg\.to)/file/\w+' + + __description__ = """Rapidgator.net hoster plugin""" + __author_name__ = ("zoidberg", "chrox", "stickell", "Walter Purcaro") + __author_mail__ = ("zoidberg@mujmail.cz", "", "l.stickell@yahoo.it", "vuolter@gmail.com") + + API_URL = "http://rapidgator.net/api/file" + + FILE_NAME_PATTERN = r'Download file (?P<N>.*)' + FILE_SIZE_PATTERN = r'File size:\s*(?P[\d\.]+) (?P\w+)' + OFFLINE_PATTERN = r'>(File not found|Error 404)' + + JSVARS_PATTERN = r"\s+var\s*(startTimerUrl|getDownloadUrl|captchaUrl|fid|secs)\s*=\s*'?(.*?)'?;" + PREMIUM_ONLY_ERROR_PATTERN = r'You can download files up to|This file can be downloaded by premium only<' + DOWNLOAD_LIMIT_ERROR_PATTERN = r'You have reached your (daily|hourly) downloads limit' + WAIT_PATTERN = r'(?:Delay between downloads must be not less than|Try again in)\s*(\d+)\s*(hour|min)' + LINK_PATTERN = r"return '(http://\w+.rapidgator.net/.*)';" + + RECAPTCHA_KEY_PATTERN = r'"http://api\.recaptcha\.net/challenge\?k=(.*?)"' + ADSCAPTCHA_SRC_PATTERN = r'(http://api\.adscaptcha\.com/Get\.aspx[^"\']*)' + SOLVEMEDIA_PATTERN = r'http://api\.solvemedia\.com/papi/challenge\.script\?k=(.*?)"' + + + def setup(self): + self.resumeDownload = self.multiDL = self.premium + self.sid = None + self.chunkLimit = 1 + self.req.setOption("timeout", 120) + + def process(self, pyfile): + if self.account: + self.sid = self.account.getAccountData(self.user).get('SID', None) + + if self.sid: + self.handlePremium() + else: + self.handleFree() + + def api_response(self, cmd): + try: + json = self.load('%s/%s' % (self.API_URL, cmd), + get={'sid': self.sid, + 'url': self.pyfile.url}, decode=True) + self.logDebug('API:%s' % cmd, json, "SID: %s" % self.sid) + json = json_loads(json) + status = json['response_status'] + msg = json['response_details'] + except BadHeader, e: + self.logError('API:%s' % cmd, e, "SID: %s" % self.sid) + status = e.code + msg = e + + if status == 200: + return json['response'] + elif status == 423: + self.account.empty(self.user) + self.retry() + else: + self.account.relogin(self.user) + self.retry(wait_time=60) + + def handlePremium(self): + #self.logDebug("ACCOUNT_DATA", self.account.getAccountData(self.user)) + self.api_data = self.api_response('info') + self.api_data['md5'] = self.api_data['hash'] + self.pyfile.name = self.api_data['filename'] + self.pyfile.size = self.api_data['size'] + url = self.api_response('download')['url'] + self.download(url) + + def handleFree(self): + self.html = self.load(self.pyfile.url, decode=True) + + self.checkFree() + + jsvars = dict(re.findall(self.JSVARS_PATTERN, self.html)) + self.logDebug(jsvars) + + self.req.http.lastURL = self.pyfile.url + self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With: XMLHttpRequest"]) + + url = "http://rapidgator.net%s?fid=%s" % ( + jsvars.get('startTimerUrl', '/download/AjaxStartTimer'), jsvars['fid']) + jsvars.update(self.getJsonResponse(url)) + + self.wait(int(jsvars.get('secs', 45)) + 1, False) + + url = "http://rapidgator.net%s?sid=%s" % ( + jsvars.get('getDownloadUrl', '/download/AjaxGetDownload'), jsvars['sid']) + jsvars.update(self.getJsonResponse(url)) + + self.req.http.lastURL = self.pyfile.url + self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With:"]) + + url = "http://rapidgator.net%s" % jsvars.get('captchaUrl', '/download/captcha') + self.html = self.load(url) + + for _ in xrange(5): + m = re.search(self.LINK_PATTERN, self.html) + if m: + link = m.group(1) + self.logDebug(link) + self.download(link, disposition=True) + break + else: + captcha, captcha_key = self.getCaptcha() + captcha_challenge, captcha_response = captcha.challenge(captcha_key) + + self.html = self.load(url, post={ + "DownloadCaptchaForm[captcha]": "", + "adcopy_challenge": captcha_challenge, + "adcopy_response": captcha_response + }) + + if "The verification code is incorrect" in self.html: + self.invalidCaptcha() + else: + self.correctCaptcha() + else: + self.parseError("Download link") + + def getCaptcha(self): + m = re.search(self.ADSCAPTCHA_SRC_PATTERN, self.html) + if m: + captcha_key = m.group(1) + captcha = AdsCaptcha(self) + else: + m = re.search(self.RECAPTCHA_KEY_PATTERN, self.html) + if m: + captcha_key = m.group(1) + captcha = ReCaptcha(self) + else: + m = re.search(self.SOLVEMEDIA_PATTERN, self.html) + if m: + captcha_key = m.group(1) + captcha = SolveMedia(self) + else: + self.parseError("Captcha") + + return captcha, captcha_key + + def checkFree(self): + m = re.search(self.PREMIUM_ONLY_ERROR_PATTERN, self.html) + if m: + self.fail("Premium account needed for download") + else: + m = re.search(self.WAIT_PATTERN, self.html) + + if m: + wait_time = int(m.group(1)) * {"hour": 60, "min": 1}[m.group(2)] + else: + m = re.search(self.DOWNLOAD_LIMIT_ERROR_PATTERN, self.html) + if m is None: + return + elif m.group(1) == "daily": + self.logWarning("You have reached your daily downloads limit for today") + wait_time = secondsToMidnight(gmt=2) + else: + wait_time = 1 * 60 * 60 + + self.logDebug("Waiting %d minutes" % wait_time / 60) + self.wait(wait_time, True) + self.retry() + + def getJsonResponse(self, url): + response = self.load(url, decode=True) + if not response.startswith('{'): + self.retry() + self.logDebug(url, response) + return json_loads(response) + + +getInfo = create_getInfo(RapidgatorNet) diff --git a/pyload/plugins/hoster/RapidshareCom.py b/pyload/plugins/hoster/RapidshareCom.py new file mode 100644 index 000000000..fefa06fd7 --- /dev/null +++ b/pyload/plugins/hoster/RapidshareCom.py @@ -0,0 +1,223 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.network.RequestFactory import getURL +from pyload.plugins.Hoster import Hoster + + +def getInfo(urls): + ids = "" + names = "" + + p = re.compile(RapidshareCom.__pattern__) + + for url in urls: + r = p.search(url) + if r.group("name"): + ids += "," + r.group("id") + names += "," + r.group("name") + elif r.group("name_new"): + ids += "," + r.group("id_new") + names += "," + r.group("name_new") + + url = "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=checkfiles&files=%s&filenames=%s" % (ids[1:], names[1:]) + + api = getURL(url) + result = [] + i = 0 + for res in api.split(): + tmp = res.split(",") + if tmp[4] in ("0", "4", "5"): + status = 1 + elif tmp[4] == "1": + status = 2 + else: + status = 3 + + result.append((tmp[1], tmp[2], status, urls[i])) + i += 1 + + yield result + + +class RapidshareCom(Hoster): + __name__ = "RapidshareCom" + __type__ = "hoster" + __version__ = "1.39" + + __pattern__ = r'https?://(?:www\.)?rapidshare.com/(?:files/(?P\d*?)/(?P[^?]+)|#!download\|(?:\w+)\|(?P\d+)\|(?P[^|]+))' + __config__ = [("server", + "Cogent;Deutsche Telekom;Level(3);Level(3) #2;GlobalCrossing;Level(3) #3;Teleglobe;GlobalCrossing #2;TeliaSonera #2;Teleglobe #2;TeliaSonera #3;TeliaSonera", + "Preferred Server", "None")] + + __description__ = """Rapidshare.com hoster plugin""" + __author_name__ = ("spoob", "RaNaN", "mkaay") + __author_mail__ = ("spoob@pyload.org", "ranan@pyload.org", "mkaay@mkaay.de") + + + def setup(self): + self.no_download = True + self.api_data = None + self.offset = 0 + self.dl_dict = {} + + self.id = None + self.name = None + + self.chunkLimit = -1 if self.premium else 1 + self.multiDL = self.resumeDownload = self.premium + + def process(self, pyfile): + self.url = pyfile.url + self.prepare() + + def prepare(self): + m = re.match(self.__pattern__, self.url) + + if m.group("name"): + self.id = m.group("id") + self.name = m.group("name") + else: + self.id = m.group("id_new") + self.name = m.group("name_new") + + self.download_api_data() + if self.api_data['status'] == "1": + self.pyfile.name = self.get_file_name() + + if self.premium: + self.handlePremium() + else: + self.handleFree() + + elif self.api_data['status'] == "2": + self.logInfo(_("Rapidshare: Traffic Share (direct download)")) + self.pyfile.name = self.get_file_name() + + self.download(self.pyfile.url, get={"directstart": 1}) + + elif self.api_data['status'] in ("0", "4", "5"): + self.offline() + elif self.api_data['status'] == "3": + self.tempOffline() + else: + self.fail("Unknown response code.") + + def handleFree(self): + while self.no_download: + self.dl_dict = self.freeWait() + + #tmp = "#!download|%(server)s|%(id)s|%(name)s|%(size)s" + download = "http://%(host)s/cgi-bin/rsapi.cgi?sub=download&editparentlocation=0&bin=1&fileid=%(id)s&filename=%(name)s&dlauth=%(auth)s" % self.dl_dict + + self.logDebug("RS API Request: %s" % download) + self.download(download, ref=False) + + check = self.checkDownload({"ip": "You need RapidPro to download more files from your IP address", + "auth": "Download auth invalid"}) + if check == "ip": + self.setWait(60) + self.logInfo(_("Already downloading from this ip address, waiting 60 seconds")) + self.wait() + self.handleFree() + elif check == "auth": + self.logInfo(_("Invalid Auth Code, download will be restarted")) + self.offset += 5 + self.handleFree() + + def handlePremium(self): + info = self.account.getAccountInfo(self.user, True) + self.logDebug("%s: Use Premium Account" % self.__name__) + url = self.api_data['mirror'] + self.download(url, get={"directstart": 1}) + + def download_api_data(self, force=False): + """ + http://images.rapidshare.com/apidoc.txt + """ + if self.api_data and not force: + return + api_url_base = "http://api.rapidshare.com/cgi-bin/rsapi.cgi" + api_param_file = {"sub": "checkfiles", "incmd5": "1", "files": self.id, "filenames": self.name} + src = self.load(api_url_base, cookies=False, get=api_param_file).strip() + self.logDebug("RS INFO API: %s" % src) + if src.startswith("ERROR"): + return + fields = src.split(",") + + # status codes: + # 0=File not found + # 1=File OK (Anonymous downloading) + # 3=Server down + # 4=File marked as illegal + # 5=Anonymous file locked, because it has more than 10 downloads already + # 50+n=File OK (TrafficShare direct download type "n" without any logging.) + # 100+n=File OK (TrafficShare direct download type "n" with logging. + # Read our privacy policy to see what is logged.) + + self.api_data = {"fileid": fields[0], "filename": fields[1], "size": int(fields[2]), "serverid": fields[3], + "status": fields[4], "shorthost": fields[5], "checksum": fields[6].strip().lower()} + + if int(self.api_data['status']) > 100: + self.api_data['status'] = str(int(self.api_data['status']) - 100) + elif int(self.api_data['status']) > 50: + self.api_data['status'] = str(int(self.api_data['status']) - 50) + + self.api_data['mirror'] = "http://rs%(serverid)s%(shorthost)s.rapidshare.com/files/%(fileid)s/%(filename)s" % self.api_data + + def freeWait(self): + """downloads html with the important information + """ + self.no_download = True + + id = self.id + name = self.name + + prepare = "https://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=download&fileid=%(id)s&filename=%(name)s&try=1&cbf=RSAPIDispatcher&cbid=1" % { + "name": name, "id": id} + + self.logDebug("RS API Request: %s" % prepare) + result = self.load(prepare, ref=False) + self.logDebug("RS API Result: %s" % result) + + between_wait = re.search("You need to wait (\d+) seconds", result) + + if "You need RapidPro to download more files from your IP address" in result: + self.setWait(60) + self.logInfo(_("Already downloading from this ip address, waiting 60 seconds")) + self.wait() + elif ("Too many users downloading from this server right now" in result or + "All free download slots are full" in result): + self.setWait(120) + self.logInfo(_("RapidShareCom: No free slots")) + self.wait() + elif "This file is too big to download it for free" in result: + self.fail(_("You need a premium account for this file")) + elif "Filename invalid." in result: + self.fail(_("Filename reported invalid")) + elif between_wait: + self.setWait(int(between_wait.group(1))) + self.wantReconnect = True + self.wait() + else: + self.no_download = False + + tmp, info = result.split(":") + data = info.split(",") + + dl_dict = {"id": id, + "name": name, + "host": data[0], + "auth": data[1], + "server": self.api_data['serverid'], + "size": self.api_data['size']} + self.setWait(int(data[2]) + 2 + self.offset) + self.wait() + + return dl_dict + + def get_file_name(self): + if self.api_data['filename']: + return self.api_data['filename'] + return self.url.split("/")[-1] diff --git a/pyload/plugins/hoster/RarefileNet.py b/pyload/plugins/hoster/RarefileNet.py new file mode 100644 index 000000000..7c6632aac --- /dev/null +++ b/pyload/plugins/hoster/RarefileNet.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo +from pyload.utils import html_unescape + + +class RarefileNet(XFileSharingPro): + __name__ = "RarefileNet" + __type__ = "hoster" + __version__ = "0.03" + + __pattern__ = r'http://(?:www\.)?rarefile.net/\w{12}' + + __description__ = """Rarefile.net hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + HOSTER_NAME = "rarefile.net" + + FILE_NAME_PATTERN = r'(?P.*?)Size : (?P.+?) ' + LINK_PATTERN = r'(?P=link)' + + + def setup(self): + self.resumeDownload = self.multiDL = self.premium + + def handleCaptcha(self, inputs): + captcha_div = re.search(r'Enter code.*?(.*?)', self.html, re.S).group(1) + self.logDebug(captcha_div) + numerals = re.findall('(\d)', html_unescape(captcha_div)) + inputs['code'] = "".join([a[1] for a in sorted(numerals, key=lambda num: int(num[0]))]) + self.logDebug("CAPTCHA", inputs['code'], numerals) + return 3 + + +getInfo = create_getInfo(RarefileNet) diff --git a/pyload/plugins/hoster/RealdebridCom.py b/pyload/plugins/hoster/RealdebridCom.py new file mode 100644 index 000000000..a458cc5d0 --- /dev/null +++ b/pyload/plugins/hoster/RealdebridCom.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +import re + +from random import randrange +from urllib import quote, unquote +from time import time + +from pyload.common.json_layer import json_loads +from pyload.plugins.Hoster import Hoster +from pyload.utils import parseFileSize + + +class RealdebridCom(Hoster): + __name__ = "RealdebridCom" + __type__ = "hoster" + __version__ = "0.53" + + __pattern__ = r'https?://(?:[^/]*\.)?real-debrid\..*' + + __description__ = """Real-Debrid.com hoster plugin""" + __author_name__ = "Devirex Hazzard" + __author_mail__ = "naibaf_11@yahoo.de" + + + def getFilename(self, url): + try: + name = unquote(url.rsplit("/", 1)[1]) + except IndexError: + name = "Unknown_Filename..." + if not name or name.endswith(".."): # incomplete filename, append random stuff + name += "%s.tmp" % randrange(100, 999) + return name + + def setup(self): + self.chunkLimit = 3 + self.resumeDownload = True + + def process(self, pyfile): + if re.match(self.__pattern__, pyfile.url): + new_url = pyfile.url + elif not self.account: + self.logError(_("Please enter your %s account or deactivate this plugin") % "Real-debrid") + self.fail("No Real-debrid account provided") + else: + self.logDebug("Old URL: %s" % pyfile.url) + password = self.getPassword().splitlines() + if not password: + password = "" + else: + password = password[0] + + url = "https://real-debrid.com/ajax/unrestrict.php?lang=en&link=%s&password=%s&time=%s" % ( + quote(pyfile.url, ""), password, int(time() * 1000)) + page = self.load(url) + data = json_loads(page) + + self.logDebug("Returned Data: %s" % data) + + if data['error'] != 0: + if data['message'] == "Your file is unavailable on the hoster.": + self.offline() + else: + self.logWarning(data['message']) + self.tempOffline() + else: + if pyfile.name is not None and pyfile.name.endswith('.tmp') and data['file_name']: + pyfile.name = data['file_name'] + pyfile.size = parseFileSize(data['file_size']) + new_url = data['generated_links'][0][-1] + + if self.getConfig("https"): + new_url = new_url.replace("http://", "https://") + else: + new_url = new_url.replace("https://", "http://") + + if new_url != pyfile.url: + self.logDebug("New URL: %s" % new_url) + + if pyfile.name.startswith("http") or pyfile.name.startswith("Unknown") or pyfile.name.endswith('..'): + #only use when name wasnt already set + pyfile.name = self.getFilename(new_url) + + self.download(new_url, disposition=True) + + check = self.checkDownload( + {"error": "An error occured while processing your request"}) + + if check == "error": + #usual this download can safely be retried + self.retry(wait_time=60, reason="An error occured while generating link.") diff --git a/pyload/plugins/hoster/RedtubeCom.py b/pyload/plugins/hoster/RedtubeCom.py new file mode 100644 index 000000000..42c24628e --- /dev/null +++ b/pyload/plugins/hoster/RedtubeCom.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.Hoster import Hoster +from pyload.unescape import unescape + + +class RedtubeCom(Hoster): + __name__ = "RedtubeCom" + __type__ = "hoster" + __version__ = "0.2" + + __pattern__ = r'http://(?:www\.)?redtube\.com/\d+' + + __description__ = """Redtube.com hoster plugin""" + __author_name__ = "jeix" + __author_mail__ = "jeix@hasnomail.de" + + + def process(self, pyfile): + self.download_html() + if not self.file_exists(): + self.offline() + + pyfile.name = self.get_file_name() + self.download(self.get_file_url()) + + def download_html(self): + url = self.pyfile.url + self.html = self.load(url) + + def get_file_url(self): + """ returns the absolute downloadable filepath + """ + if not self.html: + self.download_html() + + file_url = unescape(re.search(r'hashlink=(http.*?)"', self.html).group(1)) + + return file_url + + def get_file_name(self): + if not self.html: + self.download_html() + + return re.search('(.*?)- RedTube - Free Porn Videos', self.html).group(1).strip() + ".flv" + + def file_exists(self): + """ returns True or False + """ + if not self.html: + self.download_html() + + if re.search(r'This video has been removed.', self.html) is not None: + return False + else: + return True diff --git a/pyload/plugins/hoster/RehostTo.py b/pyload/plugins/hoster/RehostTo.py new file mode 100644 index 000000000..d3d3fcd8b --- /dev/null +++ b/pyload/plugins/hoster/RehostTo.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +from urllib import quote, unquote + +from pyload.plugins.Hoster import Hoster + + +class RehostTo(Hoster): + __name__ = "RehostTo" + __type__ = "hoster" + __version__ = "0.13" + + __pattern__ = r'https?://.*rehost.to\..*' + + __description__ = """Rehost.com hoster plugin""" + __author_name__ = "RaNaN" + __author_mail__ = "RaNaN@pyload.org" + + + def getFilename(self, url): + return unquote(url.rsplit("/", 1)[1]) + + def setup(self): + self.chunkLimit = 1 + self.resumeDownload = True + + def process(self, pyfile): + if not self.account: + self.logError(_("Please enter your %s account or deactivate this plugin") % "rehost.to") + self.fail("No rehost.to account provided") + + data = self.account.getAccountInfo(self.user) + long_ses = data['long_ses'] + + self.logDebug("Rehost.to: Old URL: %s" % pyfile.url) + new_url = "http://rehost.to/process_download.php?user=cookie&pass=%s&dl=%s" % (long_ses, quote(pyfile.url, "")) + + #raise timeout to 2min + self.req.setOption("timeout", 120) + + self.download(new_url, disposition=True) diff --git a/pyload/plugins/hoster/RemixshareCom.py b/pyload/plugins/hoster/RemixshareCom.py new file mode 100644 index 000000000..dfd7db5a0 --- /dev/null +++ b/pyload/plugins/hoster/RemixshareCom.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +# +# Test links: +# http://remixshare.com/download/p946u +# +# Note: +# The remixshare.com website is very very slow, so +# if your download not starts because of pycurl timeouts: +# Adjust timeouts in /usr/share/pyload/pyload/network/HTTPRequest.py + +import re + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class RemixshareCom(SimpleHoster): + __name__ = "RemixshareCom" + __type__ = "hoster" + __version__ = "0.01" + + __pattern__ = r'https?://remixshare\.com/(download|dl)/\w+' + + __description__ = """Remixshare.com hoster plugin""" + __author_name__ = ("zapp-brannigan", "Walter Purcaro") + __author_mail__ = ("fuerst.reinje@web.de", "vuolter@gmail.com") + + FILE_INFO_PATTERN = r'title=\'.+?\'>(?P.+?) \((?P\d+) (?P\w+)\)<' + OFFLINE_PATTERN = r'

        Ooops!<' + + LINK_PATTERN = r'(http://remixshare\.com/downloadfinal/.+?)"' + TOKEN_PATTERN = r'var acc = (\d+)' + WAIT_PATTERN = r'var XYZ = r"(\d+)"' + + + def setup(self): + self.multiDL = True + self.chunkLimit = 1 + + def handleFree(self): + b = re.search(self.LINK_PATTERN, self.html) + if not b: + self.parseError("Cannot parse download url") + c = re.search(self.TOKEN_PATTERN, self.html) + if not c: + self.parseError("Cannot parse file token") + dl_url = b.group(1) + c.group(1) + + #Check if we have to wait + seconds = re.search(self.WAIT_PATTERN, self.html) + if seconds: + self.logDebug("Wait " + seconds.group(1)) + self.wait(seconds.group(1)) + + # Finally start downloading... + self.logDebug("Download URL = r" + dl_url) + self.download(dl_url, disposition=True) + + +getInfo = create_getInfo(RemixshareCom) diff --git a/pyload/plugins/hoster/RgHostNet.py b/pyload/plugins/hoster/RgHostNet.py new file mode 100644 index 000000000..0240f3a05 --- /dev/null +++ b/pyload/plugins/hoster/RgHostNet.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class RgHostNet(SimpleHoster): + __name__ = "RgHostNet" + __type__ = "hoster" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?rghost\.net/\d+(?:r=\d+)?' + + __description__ = """RgHost.net hoster plugin""" + __author_name__ = "z00nx" + __author_mail__ = "z00nx0@gmail.com" + + FILE_INFO_PATTERN = r'

        \s+(]+>)?(?P[^<]+)()?\s+]+>\s+\((?P[^)]+)\)\s+\s+

        ' + OFFLINE_PATTERN = r'File is deleted|this page is not found' + LINK_PATTERN = r''']+>Download''' + + + def handleFree(self): + m = re.search(self.LINK_PATTERN, self.html) + if m is None: + self.parseError("Unable to detect the direct link") + download_link = m.group(1) + self.download(download_link, disposition=True) + + +getInfo = create_getInfo(RgHostNet) diff --git a/pyload/plugins/hoster/RyushareCom.py b/pyload/plugins/hoster/RyushareCom.py new file mode 100644 index 000000000..326c55e0c --- /dev/null +++ b/pyload/plugins/hoster/RyushareCom.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# +# Test links: +# http://ryushare.com/cl0jy8ric2js/random.bin + +import re + +from pyload.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo +from pyload.plugins.internal.CaptchaService import SolveMedia + + +class RyushareCom(XFileSharingPro): + __name__ = "RyushareCom" + __type__ = "hoster" + __version__ = "0.16" + + __pattern__ = r'http://(?:www\.)?ryushare\.com/\w+' + + __description__ = """Ryushare.com hoster plugin""" + __author_name__ = ("zoidberg", "stickell", "quareevo") + __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it", "quareevo@arcor.de") + + HOSTER_NAME = "ryushare.com" + + FILE_SIZE_PATTERN = r'You have requested [^<]+ \((?P[\d\.]+) (?P\w+)' + + WAIT_PATTERN = r'You have to wait ((?P\d+) hour[s]?, )?((?P\d+) minute[s], )?(?P\d+) second[s]' + LINK_PATTERN = r'Click here to download<' + SOLVEMEDIA_PATTERN = r'http:\/\/api\.solvemedia\.com\/papi\/challenge\.script\?k=(.*?)"' + + + def getDownloadLink(self): + retry = False + self.html = self.load(self.pyfile.url) + action, inputs = self.parseHtmlForm(input_names={"op": re.compile("^download")}) + if "method_premium" in inputs: + del inputs['method_premium'] + + self.html = self.load(self.pyfile.url, post=inputs) + action, inputs = self.parseHtmlForm('F1') + + self.setWait(65) + # Wait 1 hour + if "You have reached the download-limit" in self.html: + self.setWait(1 * 60 * 60, True) + retry = True + + m = re.search(self.WAIT_PATTERN, self.html) + if m: + wait = m.groupdict(0) + waittime = int(wait['hour']) * 60 * 60 + int(wait['min']) * 60 + int(wait['sec']) + self.setWait(waittime, True) + retry = True + + self.wait() + if retry: + self.retry() + + for _ in xrange(5): + m = re.search(self.SOLVEMEDIA_PATTERN, self.html) + if m is None: + self.parseError("Error parsing captcha") + + captchaKey = m.group(1) + captcha = SolveMedia(self) + challenge, response = captcha.challenge(captchaKey) + + inputs['adcopy_challenge'] = challenge + inputs['adcopy_response'] = response + + self.html = self.load(self.pyfile.url, post=inputs) + if "WRONG CAPTCHA" in self.html: + self.invalidCaptcha() + self.logInfo("Invalid Captcha") + else: + self.correctCaptcha() + break + else: + self.fail("You have entered 5 invalid captcha codes") + + if "Click here to download" in self.html: + return re.search(r'Click here to download', self.html).group(1) + + +getInfo = create_getInfo(RyushareCom) diff --git a/pyload/plugins/hoster/SecureUploadEu.py b/pyload/plugins/hoster/SecureUploadEu.py new file mode 100644 index 000000000..befe5f0e9 --- /dev/null +++ b/pyload/plugins/hoster/SecureUploadEu.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo + + +class SecureUploadEu(XFileSharingPro): + __name__ = "SecureUploadEu" + __type__ = "hoster" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?secureupload\.eu/(\w){12}(/\w+)' + + __description__ = """SecureUpload.eu hoster plugin""" + __author_name__ = "z00nx" + __author_mail__ = "z00nx0@gmail.com" + + HOSTER_NAME = "secureupload.eu" + + FILE_INFO_PATTERN = r'

        Downloading (?P[^<]+) \((?P[^<]+)\)

        ' + OFFLINE_PATTERN = r'The file was removed|File Not Found' + + +getInfo = create_getInfo(SecureUploadEu) diff --git a/pyload/plugins/hoster/SendmywayCom.py b/pyload/plugins/hoster/SendmywayCom.py new file mode 100644 index 000000000..87cbfcc0d --- /dev/null +++ b/pyload/plugins/hoster/SendmywayCom.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo + + +class SendmywayCom(XFileSharingPro): + __name__ = "SendmywayCom" + __type__ = "hoster" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?sendmyway.com/\w{12}' + + __description__ = """SendMyWay hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + HOSTER_NAME = "sendmyway.com" + + FILE_NAME_PATTERN = r'

        <.*?>\s*(?P.+)' + FILE_SIZE_PATTERN = r'\((?P\d+) bytes\)' + + +getInfo = create_getInfo(SendmywayCom) diff --git a/pyload/plugins/hoster/SendspaceCom.py b/pyload/plugins/hoster/SendspaceCom.py new file mode 100644 index 000000000..7a0908c8d --- /dev/null +++ b/pyload/plugins/hoster/SendspaceCom.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class SendspaceCom(SimpleHoster): + __name__ = "SendspaceCom" + __type__ = "hoster" + __version__ = "0.13" + + __pattern__ = r'http://(?:www\.)?sendspace.com/file/.*' + + __description__ = """Sendspace.com hoster plugin""" + __author_name__ = "zoidberg" + __author_mail__ = "zoidberg@mujmail.cz" + + FILE_NAME_PATTERN = r'

        \s*<(?:b|strong)>(?P[^<]+)\s*File Size:\s*(?P[0-9.]+)(?P[kKMG])i?B\s*' + OFFLINE_PATTERN = r'
        Sorry, the file you requested is not available.
        ' + + LINK_PATTERN = r'

        Velikost:\s*(?P[0-9.]+) (?P[kKMG])i?B
        + + + + + + + + {% for name, data in users.iteritems() %} + + + + + + + {% endfor %} + + +
        + {{ _("Name") }} + + {{ _("Change Password") }} + + {{ _("Admin") }} + + {{ _("Permissions") }} +
        {{ name }}{{ _("change") }} + +
        + + + +{% endblock %} +{% block hidden %} +

        +
        +

        {{ _("Change Password") }}

        + +

        {{ _("Enter your current and desired Password.") }}

        + + + + + + + + + + + + + + + +
        + +
        + +
        +{% endblock %} diff --git a/pyload/webui/themes/dark/tml/base.html b/pyload/webui/themes/dark/tml/base.html new file mode 100644 index 000000000..e7179acfa --- /dev/null +++ b/pyload/webui/themes/dark/tml/base.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + +{% block title %}pyLoad {{_("Webinterface")}}{% endblock %} + +{% block head %} +{% endblock %} + + + + +
        + + +
        + {% block headpanel %} + + {% if user.is_authenticated %} + + +{% if update %} + +{{_("pyLoad Update available!")}} + +{% endif %} + + +{% if plugins %} + +{{_("Plugins updated, please restart!")}} + +{% endif %} + + +Captcha: +{{_("Captcha waiting")}} + + + User:{{user.name}} + +{% else %} + {{_("Please Login!")}} +{% endif %} + + {% endblock %} +
        + + +{% if user.is_authenticated %} +
        + +
        {% endif %} + +
        +
        + +{% if perms.STATUS %} + +{% endif %} + +{% if perms.LIST %} + +{% endif %} + +{% block pageactions %} +{% endblock %} +
        + +
        + +
        + +

        {% block subtitle %}pyLoad - {{_("Webinterface")}}{% endblock %}

        + +{% block statusbar %} +{% endblock %} + + +
        + +
        +
        + + +{% for message in messages %} +

        {{message}}

        +{% endfor %} + +
        + + {{_("loading")}} +
        + +{% block content %} +{% endblock content %} + +
        + + +
        +
        + + + + diff --git a/pyload/webui/themes/dark/tml/captcha.html b/pyload/webui/themes/dark/tml/captcha.html new file mode 100644 index 000000000..ae1afe444 --- /dev/null +++ b/pyload/webui/themes/dark/tml/captcha.html @@ -0,0 +1,42 @@ + +
        + +
        + +

        {{_("Captcha reading")}}

        +

        {{_("Please read the text on the captcha.")}}

        + +
        + + + + + + + + + + + +
        + +
        + +
        + +
        + + + + +
        + +
        + +
        + +
        \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/downloads.html b/pyload/webui/themes/dark/tml/downloads.html new file mode 100644 index 000000000..0c7fb9209 --- /dev/null +++ b/pyload/webui/themes/dark/tml/downloads.html @@ -0,0 +1,29 @@ +{% extends '/dark/tml/base.html' %} + +{% block title %}Downloads - {{super()}} {% endblock %} + +{% block subtitle %} +{{_("Downloads")}} +{% endblock %} + +{% block content %} + +
          + {% for folder in files.folder %} +
        • + {{ folder.name }} +
            + {% for file in folder.files %} +
          • {{file}}
          • + {% endfor %} +
          +
        • + {% endfor %} + + {% for file in files.files %} +
        • {{ file }}
        • + {% endfor %} + +
        + +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/folder.html b/pyload/webui/themes/dark/tml/folder.html new file mode 100644 index 000000000..05176d51e --- /dev/null +++ b/pyload/webui/themes/dark/tml/folder.html @@ -0,0 +1,15 @@ +
      • + + + + {{ name }} + + +    + +    + + + +
        {{ _("Folder is empty") }}
        +
      • \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/home.html b/pyload/webui/themes/dark/tml/home.html new file mode 100644 index 000000000..b350b705e --- /dev/null +++ b/pyload/webui/themes/dark/tml/home.html @@ -0,0 +1,263 @@ +{% extends '/dark/tml/base.html' %} +{% block head %} + + + +{% endblock %} + +{% block subtitle %} +{{_("Active Downloads")}} +{% endblock %} + +{% block menu %} +
      • + {{_("Home")}} +
      • +
      • + {{_("Queue")}} +
      • +
      • + {{_("Collector")}} +
      • +
      • + {{_("Downloads")}} +
      • +
      • + {{_("Logs")}} +
      • +
      • + {{_("Config")}} +
      • +{% endblock %} + +{% block content %} + + + + + + + + + + + + + {% for link in content %} + + + + + + + + + + + {% endfor %} + + +
        {{_("Name")}}{{_("Status")}}{{_("Information")}}{{_("Size")}}{{_("Progress")}}
        +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/info.html b/pyload/webui/themes/dark/tml/info.html new file mode 100644 index 000000000..7ff2b639b --- /dev/null +++ b/pyload/webui/themes/dark/tml/info.html @@ -0,0 +1,76 @@ +{% extends '/dark/tml/base.html' %} + +{% block head %} +{% endblock %} + +{% block title %}{{ _("Information") }} - {{ super() }} {% endblock %} +{% block subtitle %}{{ _("Information") }}{% endblock %} + +{% block content %} +

        {{ _("News") }}

        + +
          + + + +

          {{ _("Support") }}

          + + + +

          {{ _("System") }}

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          {{ _("Python:") }}{{ python }}
          {{ _("OS:") }}{{ os }}
          {{ _("pyLoad version:") }}{{ version }}
          {{ _("Installation Folder:") }}{{ folder }}
          {{ _("Config Folder:") }}{{ config }}
          {{ _("Download Folder:") }}{{ download }}
          {{ _("Free Space:") }}{{ freespace }}
          {{ _("Language:") }}{{ language }}
          {{ _("Webinterface Port:") }}{{ webif }}
          {{ _("Remote Interface Port:") }}{{ remote }}
          + +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/login.html b/pyload/webui/themes/dark/tml/login.html new file mode 100644 index 000000000..9f5e2cb2f --- /dev/null +++ b/pyload/webui/themes/dark/tml/login.html @@ -0,0 +1,37 @@ +{% extends '/dark/tml/base.html' %} + +{% block title %}{{_("Login")}} - {{super()}} {% endblock %} + +{% block content %} + +
          +
          +
          + +
          + Login +{% if errors %} +

          {{_("Your username and password didn't match. Please try again.")}}

          +{% endif %} + + + + + + + + + + + + + +
          {{_("Username")}}
          {{_("Password")}}
           
          +
          +
          +
          + +
          +
          + +{% endblock %} diff --git a/pyload/webui/themes/dark/tml/logout.html b/pyload/webui/themes/dark/tml/logout.html new file mode 100644 index 000000000..5320e07f5 --- /dev/null +++ b/pyload/webui/themes/dark/tml/logout.html @@ -0,0 +1,9 @@ +{% extends '/dark/tml/base.html' %} + +{% block head %} + +{% endblock %} + +{% block content %} +

          {{_("You were successfully logged out.")}}

          +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/logs.html b/pyload/webui/themes/dark/tml/logs.html new file mode 100644 index 000000000..e178c6c5c --- /dev/null +++ b/pyload/webui/themes/dark/tml/logs.html @@ -0,0 +1,41 @@ +{% extends '/dark/tml/base.html' %} + +{% block title %}{{_("Logs")}} - {{super()}} {% endblock %} +{% block subtitle %}{{_("Logs")}}{% endblock %} +{% block head %} + +{% endblock %} + +{% block content %} +
          + + +
          +
          + +   + + +
          +
          +
          {{warning}}
          +
          +
          + + {% for line in log %} + + {% endfor %} +
          {{line.line}}{{line.date}}{{line.level}}{{line.message}}
          +
          +
          +
          + + +
          +
          +
           
          +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/pathchooser.html b/pyload/webui/themes/dark/tml/pathchooser.html new file mode 100644 index 000000000..2b94f1019 --- /dev/null +++ b/pyload/webui/themes/dark/tml/pathchooser.html @@ -0,0 +1,76 @@ + + + + + + +
          +
          +
          + + +
          + + {% if type == 'folder' %} + {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} + {% else %} + {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} + {% endif %} +
          + + + + + + + + {% if parentdir %} + + + + {% endif %} +{% for file in files %} + + {% if type == 'folder' %} + + {% else %} + + {% endif %} + + + + + +{% endfor %} +
          {{_("name")}}{{_("size")}}{{_("type")}}{{_("last modified")}}
          + {{_("parent directory")}} +
          {% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{{ file.size|float|filesizeformat }}{% if file.type == 'dir' %}directory{% else %}{{ file.ext|default("file") }}{% endif %}{{ file.modified|date("d.m.Y - H:i:s") }}
          +
          + + \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/queue.html b/pyload/webui/themes/dark/tml/queue.html new file mode 100644 index 000000000..f68079106 --- /dev/null +++ b/pyload/webui/themes/dark/tml/queue.html @@ -0,0 +1,104 @@ +{% extends '/dark/tml/base.html' %} +{% block head %} + + + + +{% endblock %} + +{% if target %} + {% set name = _("Queue") %} +{% else %} + {% set name = _("Collector") %} +{% endif %} + +{% block title %}{{name}} - {{super()}} {% endblock %} +{% block subtitle %}{{name}}{% endblock %} + +{% block pageactions %} + +{% endblock %} + +{% block content %} +{% autoescape true %} + +
            +{% for package in content %} +
          • +
            + + +
            + + {{package.name}} +    + + +    + +    + +    + + +
            + {% set progress = (package.linksdone * 100) / package.linkstotal %} + +
            +
            + + +
            +
            + + +
            +
          • +{% endfor %} +
          +{% endautoescape %} +{% endblock %} + +{% block hidden %} +
          +
          +

          {{_("Edit Package")}}

          +

          {{_("Edit the package detais below.")}}

          + + + + + + + + + + + + +
          + +
          + +
          +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/settings.html b/pyload/webui/themes/dark/tml/settings.html new file mode 100644 index 000000000..c9c0bed8a --- /dev/null +++ b/pyload/webui/themes/dark/tml/settings.html @@ -0,0 +1,204 @@ +{% extends '/dark/tml/base.html' %} + +{% block title %}{{ _("Config") }} - {{ super() }} {% endblock %} +{% block subtitle %}{{ _("Config") }}{% endblock %} + +{% block head %} + + + + +{% endblock %} + +{% block content %} + + + +
          + +
          + + + + + + +
          + +
          +

             {{ _("Choose a section from the menu") }}

          +
          +
          + + +
          +
          + + + + + + +
          + + +
          +

             {{ _("Choose a section from the menu") }}

          +
          +
          + +
          + +
          + + + +
          + + + + + + + + + + + + + + + + + + + + {% for account in conf.accs %} + {% set plugin = account.type %} + + + + + + + + + + + + + + {% endfor %} +
          {{ _("Plugin") }}{{ _("Name") }}{{ _("Password") }}{{ _("Status") }}{{ _("Premium") }}{{ _("Valid until") }}{{ _("Traffic left") }}{{ _("Time") }}{{ _("Max Parallel") }}{{ _("Delete?") }}
          + {{ plugin }} + + + + {% if account.valid %} + + {{ _("valid") }} + {% else %} + + {{ _("not valid") }} + {% endif %} + + + {% if account.premium %} + + {{ _("yes") }} + {% else %} + + {{ _("no") }} + {% endif %} + + + + {{ account.validuntil }} + + + + {{ account.trafficleft }} + + + + + + + +
          + + + +
          +
          +
          +{% endblock %} +{% block hidden %} +
          +
          +

          {{_("Add Account")}}

          +

          {{_("Enter your account data to use premium features.")}}

          + + + + + + + + + + + +
          + +
          + +
          +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/settings_item.html b/pyload/webui/themes/dark/tml/settings_item.html new file mode 100644 index 000000000..e417e564c --- /dev/null +++ b/pyload/webui/themes/dark/tml/settings_item.html @@ -0,0 +1,48 @@ + + {% if section.outline %} + + {% endif %} + {% for okey, option in section.iteritems() %} + {% if okey not in ("desc","outline") %} + + + + + {% endif %} + {% endfor %} +
          {{ section.outline }}
          + {% if option.type == "bool" %} + + {% elif ";" in option.type %} + + {% elif option.type == "folder" %} + + + {% elif option.type == "file" %} + + + {% elif option.type == "password" %} + + {% else %} + + {% endif %} +
          \ No newline at end of file diff --git a/pyload/webui/themes/dark/tml/window.html b/pyload/webui/themes/dark/tml/window.html new file mode 100644 index 000000000..0b4f5362b --- /dev/null +++ b/pyload/webui/themes/dark/tml/window.html @@ -0,0 +1,52 @@ + + +
          +
          +

          {{_("Add Package")}}

          +

          {{_("Paste your links or upload a container.")}}

          + + + + + + + + + + + + + + + + + + + + + + + +
          {{_("Queue")}}
          {{_("Collector")}}
          +
          + + + +
          + +
          + +
          \ No newline at end of file diff --git a/pyload/webui/themes/default/css/MooDialog.css b/pyload/webui/themes/default/css/MooDialog.css new file mode 100644 index 000000000..d26bf2ff2 --- /dev/null +++ b/pyload/webui/themes/default/css/MooDialog.css @@ -0,0 +1,91 @@ +/* Created by Arian Stolwijk */ + +.MooDialog { +/* position: fixed;*/ + margin: 0 auto 0 -350px; + width:600px; + padding:14px; + left:50%; + top: 100px; + + position: absolute; + left: 50%; + z-index: 50000; + + background: #eef5f8; + color: black; + border-radius: 7px; + -moz-border-radius: 7px; + -webkit-border-radius: 7px; + border-radius: 7px; + -moz-box-shadow: 1px 1px 5px rgba(0,0,0,0.8); + -webkit-box-shadow: 1px 1px 5px rgba(0,0,0,0.8); + box-shadow: 1px 1px 5px rgba(0,0,0,0.8); +} + +.MooDialogTitle { + padding-top: 30px; +} + +.MooDialog .title { + position: absolute; + top: 0; + left: 0; + right: 0; + padding: 3px 20px; + background: #b7c4dc; + border-bottom: 1px solid #a1aec5; + font-weight: bold; + text-shadow: 1px 1px 0 #fff; + color: black; + border-radius: 7px; + -moz-border-radius: 7px; + -webkit-border-radius: 7px; +} + +.MooDialog .close { + background: url(../img/MooDialog/dialog-close.png) no-repeat; + width: 16px; + height: 16px; + display: block; + cursor: pointer; + top: -5px; + left: -5px; + position: absolute; +} + +.MooDialog .buttons { + text-align: right; + margin: 0; + padding: 0; + border: 0; + background: none; +} + +.MooDialog .iframe { + width: 100%; + height: 100%; +} + +.MooDialog .textInput { + width: 200px; + float: left; +} + +.MooDialog .MooDialogAlert, +.MooDialog .MooDialogConfirm, +.MooDialog .MooDialogPrompt, +.MooDialog .MooDialogError { + background: url(../img/MooDialog/dialog-warning.png) no-repeat; + padding-left: 40px; + min-height: 40px; +} + +.MooDialog .MooDialogConfirm, +.MooDialog .MooDialogPromt { + background: url(../img/MooDialog/dialog-question.png) no-repeat; +} + +.MooDialog .MooDialogError { + background: url(../img/MooDialog/dialog-error.png) no-repeat; +} diff --git a/pyload/webui/themes/default/css/default.css b/pyload/webui/themes/default/css/default.css new file mode 100644 index 000000000..5d4b9ebf2 --- /dev/null +++ b/pyload/webui/themes/default/css/default.css @@ -0,0 +1,902 @@ +.hidden { + display:none; +} +.leftalign { + text-align:left; +} +.centeralign { + text-align:center; +} +.rightalign { + text-align:right; +} + + +.dokuwiki div.plugin_translation ul li a.wikilink1:link, .dokuwiki div.plugin_translation ul li a.wikilink1:hover, .dokuwiki div.plugin_translation ul li a.wikilink1:active, .dokuwiki div.plugin_translation ul li a.wikilink1:visited { + background-color:#000080; + color:#fff !important; + text-decoration:none; + padding:0 0.2em; + margin:0.1em 0.2em; + border:none !important; +} +.dokuwiki div.plugin_translation ul li a.wikilink2:link, .dokuwiki div.plugin_translation ul li a.wikilink2:hover, .dokuwiki div.plugin_translation ul li a.wikilink2:active, .dokuwiki div.plugin_translation ul li a.wikilink2:visited { + background-color:#808080; + color:#fff !important; + text-decoration:none; + padding:0 0.2em; + margin:0.1em 0.2em; + border:none !important; +} + +.dokuwiki div.plugin_translation ul li a:hover img { + opacity:1.0; + height:15px; +} + +body { + margin:0; + padding:0; + background-color:white; + color:black; + font-size:12px; + font-family:Verdana, Helvetica, "Lucida Grande", Lucida, Arial, sans-serif; + font-family:sans-serif; + font-size:99, 96%; + font-size-adjust:none; + font-style:normal; + font-variant:normal; + font-weight:normal; + line-height:normal; +} +hr { + border-width:0; + border-bottom:1px #aaa dotted; +} +img { + border:none; +} +form { + margin:0px; + padding:0px; + border:none; + display:inline; + background:transparent; +} +ul li { + margin:5px; +} +textarea { + font-family:monospace; +} +table { + margin:0.5em 0; + border-collapse:collapse; +} +td { + padding:0.25em; + border:1pt solid #ADB9CC; +} +a { + color:#3465a4; + text-decoration:none; +} +a:hover { + text-decoration:underline; +} + +option { + border:0 none #fff; +} +strong.highlight { + background-color:#fc9; + padding:1pt; +} +#pagebottom { + clear:both; +} +hr { + height:1px; + color:#c0c0c0; + background-color:#c0c0c0; + border:none; + margin:.2em 0 .2em 0; +} + +.invisible { + margin:0px; + border:0px; + padding:0px; + height:0px; + visibility:hidden; +} +.left { + float:left !important; +} +.right { + float:right !important; +} +.center { + text-align:center; +} +div#body-wrapper { + padding:40px 40px 10px 40px; + font-size:127%; +} +div#content { + margin-top:-20px; + padding:0; + font-size:14px; + color:black; + line-height:1.5em; +} +h1, h2, h3, h4, h5, h6 { + background:transparent none repeat scroll 0 0; + border-bottom:1px solid #aaa; + color:black; + font-weight:normal; + margin:0; + padding:0; + padding-bottom:0.17em; + padding-top:0.5em; +} +h1 { + font-size:188%; + line-height:1.2em; + margin-bottom:0.1em; + padding-bottom:0; +} +h2 { + font-size:150%; +} +h3, h4, h5, h6 { + border-bottom:none; + font-weight:bold; +} +h3 { + font-size:132%; +} +h4 { + font-size:116%; +} +h5 { + font-size:100%; +} +h6 { + font-size:80%; +} +ul#page-actions, ul#page-actions-more { + float:right; + margin:10px 10px 0 10px; + padding:6px; + color:black; + background-color:#ececec; + list-style-type:none; + white-space: nowrap; + border-radius:5px; + -moz-border-radius:5px; +} +ul#user-actions { + padding:5px; + margin:0; + display:inline; + color:black; + background-color:#ececec; + list-style-type:none; + -moz-border-radius:3px; + border-radius:3px; +} +ul#page-actions li, ul#user-actions li, ul#page-actions-more li { + display:inline; +} +ul#page-actions a, ul#user-actions a, ul#page-actions-more a { + text-decoration:none; + color:black; + display:inline; + margin:0 3px; + padding:2px 0px 2px 18px; +} +ul#page-actions a:hover, ul#page-actions a:focus, ul#user-actions a:hover, ul#user-actions a:focus { + /*text-decoration:underline;*/ +} +/***************************/ +ul#page-actions2 { + float:left; + margin:10px 10px 0 10px; + padding:6px; + color:black; + background-color:#ececec; + list-style-type:none; + border-radius:5px; + -moz-border-radius:5px; +} +ul#user-actions2 { + padding:5px; + margin:0; + display:inline; + color:black; + background-color:#ececec; + list-style-type:none; + border-radius:3px; + -moz-border-radius:3px; +} +ul#page-actions2 li, ul#user-actions2 li { + display:inline; +} +ul#page-actions2 a, ul#user-actions2 a { + text-decoration:none; + color:black; + display:inline; + margin:0 3px; + padding:2px 0px 2px 18px; +} +ul#page-actions2 a:hover, ul#page-actions2 a:focus, ul#user-actions2 a:hover, ul#user-actions2 a:focus, +ul#page-actions-more a:hover, ul#page-actions-more a:focus{ + color: #4e7bb4; +} +/****************************/ +.hidden { + display:none; +} + +a.logout { + background:transparent url(../img/user-actions-logout.png) 0px 1px no-repeat; +} + +a.info { + background:transparent url(../img/user-info.png) 0px 1px no-repeat; +} + +a.admin { + background:transparent url(../img/user-actions-admin.png) 0px 1px no-repeat; +} +a.profile { + background:transparent url(../img/user-actions-profile.png) 0px 1px no-repeat; +} +a.create, a.edit { + background:transparent url(../img/page-tools-edit.png) 0px 1px no-repeat; +} +a.source, a.show { + background:transparent url(../img/page-tools-source.png) 0px 1px no-repeat; +} +a.revisions { + background:transparent url(../img/page-tools-revisions.png) 0px 1px no-repeat; +} +a.subscribe, a.unsubscribe { + background:transparent url(../img/page-tools-subscribe.png) 0px 1px no-repeat; +} +a.backlink { + background:transparent url(../img/page-tools-backlinks.png) 0px 1px no-repeat; +} +a.play { + background:transparent url(../img/control_play.png) 0px 1px no-repeat; +} +.time { + background:transparent url(../img/status_None.png) 0px 1px no-repeat; + padding: 2px 0px 2px 18px; + margin: 0px 3px; +} +.reconnect { + background:transparent url(../img/reconnect.png) 0px 1px no-repeat; + padding: 2px 0px 2px 18px; + margin: 0px 3px; +} +a.play:hover { + background:transparent url(../img/control_play_blue.png) 0px 1px no-repeat; +} +a.cancel { + background:transparent url(../img/control_cancel.png) 0px 1px no-repeat; +} +a.cancel:hover { + background:transparent url(../img/control_cancel_blue.png) 0px 1px no-repeat; +} +a.pause { + background:transparent url(../img/control_pause.png) 0px 1px no-repeat; +} +a.pause:hover { + background:transparent url(../img/control_pause_blue.png) 0px 1px no-repeat; + font-weight: bold; +} +a.stop { + background:transparent url(../img/control_stop.png) 0px 1px no-repeat; +} +a.stop:hover { + background:transparent url(../img/control_stop_blue.png) 0px 1px no-repeat; +} +a.add { + background:transparent url(../img/control_add.png) 0px 1px no-repeat; +} +a.add:hover { + background:transparent url(../img/control_add_blue.png) 0px 1px no-repeat; +} +a.cog { + background:transparent url(../img/cog.png) 0px 1px no-repeat; +} +#head-panel { + background:#525252 url(../img/head_bg1.png) bottom left repeat-x; +} +#head-panel h1 { + display:none; + margin:0; + text-decoration:none; + padding-top:0.8em; + padding-left:3.3em; + font-size:2.6em; + color:#eeeeec; +} +#head-panel #head-logo { + float:left; + margin:5px 0 -15px 5px; + padding:0; + overflow:visible; +} +#head-menu { + background:transparent url(../img/tabs-border-bottom.png) 0 100% repeat-x; + width:100%; + float:left; + margin:0; + padding:0; + padding-top:0.8em; +} +#head-menu ul { + list-style:none; + margin:0 1em 0 2em; +} +#head-menu ul li { + float:left; + margin:0; + margin-left:0.3em; + font-size:14px; + margin-bottom:4px; +} +#head-menu ul li.selected, #head-menu ul li:hover { + margin-bottom:0px; +} +#head-menu ul li a img { + height:22px; + width:22px; + vertical-align:middle; +} +#head-menu ul li a, #head-menu ul li a:link { + float:left; + text-decoration:none; + color:#555; + background:#eaeaea url(../img/tab-background.png) 0 100% repeat-x; + padding:3px 7px 3px 7px; + border:2px solid #ccc; + border-bottom:0px solid transparent; + padding-bottom:3px; + -moz-border-radius:5px; + border-radius:5px; +} +#head-menu ul li a:hover, #head-menu ul li a:focus { + color:#111; + padding-bottom:7px; + border-bottom:0px none transparent; + outline:none; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; + -moz-border-radius-bottomright:0px; + -moz-border-radius-bottomleft:0px; +} +#head-menu ul li a:focus { + margin-bottom:-4px; +} +#head-menu ul li.selected a { + color:#3566A5; + background:#fff; + padding-bottom:7px; + border-bottom:0px none transparent; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; + -moz-border-radius-bottomright:0px; + -moz-border-radius-bottomleft:0px; +} +#head-menu ul li.selected a:hover, #head-menu ul li.selected a:focus { + color:#111; +} +div#head-search-and-login { + float:right; + margin:0 1em 0 0; + background-color:#222; + padding:7px 7px 5px 5px; + color:white; + white-space: nowrap; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-bottomright:6px; + -moz-border-radius-bottomleft:6px; +} +div#head-search-and-login form { + display:inline; + padding:0 3px; +} +div#head-search-and-login form input { + border:2px solid #888; + background:#eee; + font-size:14px; + padding:2px; + border-radius:3px; + -moz-border-radius:3px; +} +div#head-search-and-login form input:focus { + background:#fff; +} +#head-search { + font-size:14px; +} +#head-username, #head-password { + width:80px; + font-size:14px; +} +#pageinfo { + clear:both; + color:#888; + padding:0.6em 0; + margin:0; +} +#foot { + font-style:normal; + color:#888; + text-align:center; +} +#foot a { + color:#aaf; +} +#foot img { + vertical-align:middle; +} +div.toc { + border:1px dotted #888; + background:#f0f0f0; + margin:1em 0 1em 1em; + float:right; + font-size:95%; +} +div.toc .tocheader { + font-weight:bold; + margin:0.5em 1em; +} +div.toc ol { + margin:1em 0.5em 1em 1em; + padding:0; +} +div.toc ol li { + margin:0; + padding:0; + margin-left:1em; +} +div.toc ol ol { + margin:0.5em 0.5em 0.5em 1em; + padding:0; +} +div.recentchanges table { + clear:both; +} +div#editor-help { + font-size:90%; + border:1px dotted #888; + padding:0ex 1ex 1ex 1ex; + background:#f7f6f2; +} +div#preview { + margin-top:1em; +} +label.block { + display:block; + text-align:right; + font-weight:bold; +} +label.simple { + display:block; + text-align:left; + font-weight:normal; +} +label.block input.edit { + width:50%; +} +/*fieldset { + width:300px; + text-align:center; + padding:0.5em; + margin:auto; +} +*/ +div.editor { + margin:0 0 0 0; +} +table { + margin:0.5em 0; + border-collapse:collapse; +} +td { + padding:0.25em; + border:1pt solid #ADB9CC; +} +td p { + margin:0; + padding:0; +} +.u { + text-decoration:underline; +} +.footnotes ul { + padding:0 2em; + margin:0 0 1em; +} +.footnotes li { + list-style:none; +} +.userpref table, .userpref td { + border:none; +} +#message { + clear:both; + padding:5px 10px; + background-color:#eee; + border-bottom:2px solid #ccc; +} +#message p { + margin:5px 0; + padding:0; + font-weight:bold; +} +#message div.buttons { + font-weight:normal; +} +.diff { + width:99%; +} +.diff-title { + background-color:#C0C0C0; +} +.searchresult dd span { + font-weight:bold; +} +.boxtext { + font-family:tahoma, arial, sans-serif; + font-size:11px; + color:#000; + float:none; + padding:3px 0 0 10px; +} +.statusbutton { + width:32px; + height:32px; + float:left; + margin-left:-32px; + margin-right:5px; + opacity:0; + cursor:pointer +} +.dlsize { + float:left; + padding-right: 8px; +} +.dlspeed { + float:left; + padding-right: 8px; +} +.package { + margin-bottom: 10px; +} +.packagename { + font-weight: bold; +} + +.child { + margin-left: 20px; +} +.child_status { + margin-right: 10px; +} +.child_secrow { + font-size: 10px; +} + +.header, .header th { + text-align: left; + font-weight: normal; + background-color:#ececec; + -moz-border-radius:5px; + border-radius:5px; +} +.progress_bar { + background: #0C0; + height: 5px; + +} + +.queue { + border: none +} + +.queue tr td { + border: none +} + +.header, .header th{ + text-align: left; + font-weight: normal; +} + + +.clearer +{ + clear: both; + height: 1px; +} + +.left +{ + float: left; +} + +.right +{ + float: right; +} + + +.setfield +{ + display: table-cell; +} + +ul.tabs li a +{ + padding: 5px 16px 4px 15px; + border: none; + font-weight: bold; + + border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + +} + + +#tabs span +{ + display: none; +} + +#tabs span.selected +{ + display: inline; +} + +#tabsback +{ + background-color: #525252; + margin: 2px 0 0; + padding: 6px 4px 1px 4px; + + border-top-right-radius: 30px; + border-top-left-radius: 3px; + -moz-border-radius-topright: 30px; + -moz-border-radius-topleft: 3px; +} +ul.tabs +{ + list-style-type: none; + margin:0; + padding: 0 40px 0 0; +} + +ul.tabs li +{ + display: inline; + margin-left: 8px; +} + + +ul.tabs li a +{ + color: #42454a; + background-color: #eaeaea; + border: 1px none #c9c3ba; + margin: 0; + text-decoration: none; + + outline: 0; + + padding: 5px 16px 4px 15px; + font-weight: bold; + + border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + +} + +ul.tabs li a.selected, ul.tabs li a:hover +{ + color: #000; + background-color: white; + + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomright: 0; + -moz-border-radius-bottomleft: 0; +} + +ul.tabs li a:hover +{ + background-color: #f1f4ee; +} + +ul.tabs li a.selected +{ + font-weight: bold; + background-color: #525252; + padding-bottom: 5px; + color: white; +} + + +#tabs-body { + position: relative; + overflow: hidden; +} + + +span.tabContent +{ + border: 2px solid #525252; + margin: 0; + padding: 0; + padding-bottom: 10px; +} + +#tabs-body > span { + display: none; +} + +#tabs-body > span.active { + display: block; +} + +.hide +{ + display: none; +} + +.settable +{ + margin: 20px; + border: none; +} +.settable td +{ + border: none; + margin: 0; + padding: 5px; +} + +.settable th{ + padding-bottom: 8px; +} + +.settable.wide td , .settable.wide th { + padding-left: 15px; + padding-right: 15px; +} + + +/*settings navbar*/ +ul.nav { + margin: -30px 0 0; + padding: 0; + list-style: none; + position: absolute; +} + + +ul.nav li { + position: relative; + float: left; + padding: 5px; +} + +ul.nav > li a { + background: white; + -moz-border-radius: 4px 4px 4px 4px; + border: 1px solid #C9C3BA; + border-bottom: medium none; + color: black; +} + +ul.nav ul { + position: absolute; + top: 26px; + left: 10px; + margin: 0; + padding: 0; + list-style: none; + border: 1px solid #AAA; + background: #f1f1f1; + -webkit-box-shadow: 1px 1px 5px #AAA; + -moz-box-shadow: 1px 1px 5px #AAA; + box-shadow: 1px 1px 5px #AAA; + cursor: pointer; +} + +ul.nav .open { + display: block; +} + +ul.nav .close { + display: none; +} + +ul.nav ul li { + float: none; + padding: 0; +} + +ul.nav ul li a { + width: 130px; + background: #f1f1f1; + padding: 3px; + display: block; + font-weight: normal; +} + +ul.nav ul li a:hover { + background: #CDCDCD; +} + +ul.nav ul ul { + left: 137px; + top: 0; +} + +.purr-wrapper{ + margin:10px; +} + +/*Purr alert styles*/ + +.purr-alert{ + margin-bottom:10px; + padding:10px; + background:#000; + font-size:13px; + font-weight:bold; + color:#FFF; + -moz-border-radius:5px; + -webkit-border-radius:5px; + /*-moz-box-shadow: 0 0 10px rgba(255,255,0,.25);*/ + width:300px; +} +.purr-alert.error{ + color:#F55; + padding-left:30px; + background:url(../img/error.png) no-repeat #000 7px 10px; + width:280px; +} +.purr-alert.success{ + color:#5F5; + padding-left:30px; + background:url(../img/success.png) no-repeat #000 7px 10px; + width:280px; +} +.purr-alert.notice{ + color:#99F; + padding-left:30px; + background:url(../img/notice.png) no-repeat #000 7px 10px; + width:280px; +} + +table.system { + border: none; + margin-left: 10px; +} + +table.system td { + border: none +} + +table.system tr > td:first-child { + font-weight: bold; + padding-right: 10px; +} diff --git a/pyload/webui/themes/default/css/log.css b/pyload/webui/themes/default/css/log.css new file mode 100644 index 000000000..26449b244 --- /dev/null +++ b/pyload/webui/themes/default/css/log.css @@ -0,0 +1,71 @@ + +html, body, #content +{ + height: 100%; +} +#body-wrapper +{ + height: 70%; +} +.logdiv +{ + height: 90%; + width: 100%; + overflow: auto; + border: 2px solid #CCC; + outline: 1px solid #666; + background-color: #FFE; + margin-right: auto; + margin-left: auto; +} +.logform +{ + display: table; + margin: 0 auto 0 auto; + padding-top: 5px; +} +.logtable +{ + + margin: 0px; +} +.logtable td +{ + border: none; + white-space: nowrap; + + font-family: monospace; + font-size: 16px; + margin: 0px; + padding: 0px 10px 0px 10px; + line-height: 110%; +} +td.logline +{ + background-color: #EEE; + text-align:right; + padding: 0px 5px 0px 5px; +} +td.loglevel +{ + text-align:right; +} +.logperpage +{ + float: right; + padding-bottom: 8px; +} +.logpaginator +{ + float: left; + padding-top: 5px; +} +.logpaginator a +{ + padding: 0px 8px 0px 8px; +} +.logwarn +{ + text-align: center; + color: red; +} diff --git a/pyload/webui/themes/default/css/pathchooser.css b/pyload/webui/themes/default/css/pathchooser.css new file mode 100644 index 000000000..894cc335e --- /dev/null +++ b/pyload/webui/themes/default/css/pathchooser.css @@ -0,0 +1,68 @@ +table { + width: 90%; + border: 1px dotted #888888; + font-family: sans-serif; + font-size: 10pt; +} + +th { + background-color: #525252; + color: #E0E0E0; +} + +table, tr, td { + background-color: #F0F0F0; +} + +a, a:visited { + text-decoration: none; + font-weight: bold; +} + +#paths { + width: 90%; + text-align: left; +} + +.file_directory { + color: #c0c0c0; +} +.path_directory { + color: #3c3c3c; +} +.file_file { + color: #3c3c3c; +} +.path_file { + color: #c0c0c0; +} + +.parentdir { + color: #000000; + font-size: 10pt; +} +.name { + text-align: left; +} +.size { + text-align: right; +} +.type { + text-align: left; +} +.mtime { + text-align: center; +} + +.path_abs_rel { + color: #3c3c3c; + text-decoration: none; + font-weight: bold; + font-family: sans-serif; + font-size: 10pt; +} + +.path_abs_rel a { + color: #3c3c3c; + font-style: italic; +} diff --git a/pyload/webui/themes/default/css/window.css b/pyload/webui/themes/default/css/window.css new file mode 100644 index 000000000..12829868b --- /dev/null +++ b/pyload/webui/themes/default/css/window.css @@ -0,0 +1,73 @@ +/* ----------- stylized ----------- */ +.window_box h1{ + font-size:14px; + font-weight:bold; + margin-bottom:8px; +} +.window_box p{ + font-size:11px; + color:#666666; + margin-bottom:20px; + border-bottom:solid 1px #b7ddf2; + padding-bottom:10px; +} +.window_box label{ + display:block; + font-weight:bold; + text-align:right; + width:240px; + float:left; +} +.window_box .small{ + color:#666666; + display:block; + font-size:11px; + font-weight:normal; + text-align:right; + width:240px; +} +.window_box select, .window_box input{ + float:left; + font-size:12px; + padding:4px 2px; + border:solid 1px #aacfe4; + width:300px; + margin:2px 0 20px 10px; +} +.window_box .cont{ + float:left; + font-size:12px; + padding: 0px 10px 15px 0px; + width:300px; + margin:0px 0px 0px 10px; +} +.window_box .cont input{ + float: none; + margin: 0px 15px 0px 1px; +} +.window_box textarea{ + float:left; + font-size:12px; + padding:4px 2px; + border:solid 1px #aacfe4; + width:300px; + margin:2px 0 20px 10px; +} +.window_box button, .styled_button{ + clear:both; + margin-left:150px; + width:125px; + height:31px; + background:#666666 url(../img/button.png) no-repeat; + text-align:center; + line-height:31px; + color:#FFFFFF; + font-size:11px; + font-weight:bold; + border: 0px; +} + +.styled_button { + margin-left: 15px; + cursor: pointer; +} diff --git a/pyload/webui/themes/default/img/MooDialog/dialog-close.png b/pyload/webui/themes/default/img/MooDialog/dialog-close.png new file mode 100644 index 000000000..81ebb88b2 Binary files /dev/null and b/pyload/webui/themes/default/img/MooDialog/dialog-close.png differ diff --git a/pyload/webui/themes/default/img/MooDialog/dialog-error.png b/pyload/webui/themes/default/img/MooDialog/dialog-error.png new file mode 100644 index 000000000..d70328403 Binary files /dev/null and b/pyload/webui/themes/default/img/MooDialog/dialog-error.png differ diff --git a/pyload/webui/themes/default/img/MooDialog/dialog-question.png b/pyload/webui/themes/default/img/MooDialog/dialog-question.png new file mode 100644 index 000000000..b0af3db5b Binary files /dev/null and b/pyload/webui/themes/default/img/MooDialog/dialog-question.png differ diff --git a/pyload/webui/themes/default/img/MooDialog/dialog-warning.png b/pyload/webui/themes/default/img/MooDialog/dialog-warning.png new file mode 100644 index 000000000..aad64d4be Binary files /dev/null and b/pyload/webui/themes/default/img/MooDialog/dialog-warning.png differ diff --git a/pyload/webui/themes/default/img/add_folder.png b/pyload/webui/themes/default/img/add_folder.png new file mode 100644 index 000000000..8acbc411b Binary files /dev/null and b/pyload/webui/themes/default/img/add_folder.png differ diff --git a/pyload/webui/themes/default/img/ajax-loader.gif b/pyload/webui/themes/default/img/ajax-loader.gif new file mode 100644 index 000000000..2fd8e0737 Binary files /dev/null and b/pyload/webui/themes/default/img/ajax-loader.gif differ diff --git a/pyload/webui/themes/default/img/arrow_refresh.png b/pyload/webui/themes/default/img/arrow_refresh.png new file mode 100644 index 000000000..0de26566d Binary files /dev/null and b/pyload/webui/themes/default/img/arrow_refresh.png differ diff --git a/pyload/webui/themes/default/img/arrow_right.png b/pyload/webui/themes/default/img/arrow_right.png new file mode 100644 index 000000000..b1a181923 Binary files /dev/null and b/pyload/webui/themes/default/img/arrow_right.png differ diff --git a/pyload/webui/themes/default/img/big_button.gif b/pyload/webui/themes/default/img/big_button.gif new file mode 100644 index 000000000..7680490ea Binary files /dev/null and b/pyload/webui/themes/default/img/big_button.gif differ diff --git a/pyload/webui/themes/default/img/big_button_over.gif b/pyload/webui/themes/default/img/big_button_over.gif new file mode 100644 index 000000000..2e3ee10d2 Binary files /dev/null and b/pyload/webui/themes/default/img/big_button_over.gif differ diff --git a/pyload/webui/themes/default/img/body.png b/pyload/webui/themes/default/img/body.png new file mode 100644 index 000000000..7ff1043e0 Binary files /dev/null and b/pyload/webui/themes/default/img/body.png differ diff --git a/pyload/webui/themes/default/img/button.png b/pyload/webui/themes/default/img/button.png new file mode 100644 index 000000000..890160614 Binary files /dev/null and b/pyload/webui/themes/default/img/button.png differ diff --git a/pyload/webui/themes/default/img/closebtn.gif b/pyload/webui/themes/default/img/closebtn.gif new file mode 100644 index 000000000..3e27e6030 Binary files /dev/null and b/pyload/webui/themes/default/img/closebtn.gif differ diff --git a/pyload/webui/themes/default/img/cog.png b/pyload/webui/themes/default/img/cog.png new file mode 100644 index 000000000..67de2c6cc Binary files /dev/null and b/pyload/webui/themes/default/img/cog.png differ diff --git a/pyload/webui/themes/default/img/control_add.png b/pyload/webui/themes/default/img/control_add.png new file mode 100644 index 000000000..d39886893 Binary files /dev/null and b/pyload/webui/themes/default/img/control_add.png differ diff --git a/pyload/webui/themes/default/img/control_add_blue.png b/pyload/webui/themes/default/img/control_add_blue.png new file mode 100644 index 000000000..d11b7f41d Binary files /dev/null and b/pyload/webui/themes/default/img/control_add_blue.png differ diff --git a/pyload/webui/themes/default/img/control_cancel.png b/pyload/webui/themes/default/img/control_cancel.png new file mode 100644 index 000000000..7b9bc3fba Binary files /dev/null and b/pyload/webui/themes/default/img/control_cancel.png differ diff --git a/pyload/webui/themes/default/img/control_cancel_blue.png b/pyload/webui/themes/default/img/control_cancel_blue.png new file mode 100644 index 000000000..0c5c96ce3 Binary files /dev/null and b/pyload/webui/themes/default/img/control_cancel_blue.png differ diff --git a/pyload/webui/themes/default/img/control_pause.png b/pyload/webui/themes/default/img/control_pause.png new file mode 100644 index 000000000..2d9ce9c4e Binary files /dev/null and b/pyload/webui/themes/default/img/control_pause.png differ diff --git a/pyload/webui/themes/default/img/control_pause_blue.png b/pyload/webui/themes/default/img/control_pause_blue.png new file mode 100644 index 000000000..ec61099b0 Binary files /dev/null and b/pyload/webui/themes/default/img/control_pause_blue.png differ diff --git a/pyload/webui/themes/default/img/control_play.png b/pyload/webui/themes/default/img/control_play.png new file mode 100644 index 000000000..0846555d0 Binary files /dev/null and b/pyload/webui/themes/default/img/control_play.png differ diff --git a/pyload/webui/themes/default/img/control_play_blue.png b/pyload/webui/themes/default/img/control_play_blue.png new file mode 100644 index 000000000..f8c8ec683 Binary files /dev/null and b/pyload/webui/themes/default/img/control_play_blue.png differ diff --git a/pyload/webui/themes/default/img/control_stop.png b/pyload/webui/themes/default/img/control_stop.png new file mode 100644 index 000000000..893bb60e5 Binary files /dev/null and b/pyload/webui/themes/default/img/control_stop.png differ diff --git a/pyload/webui/themes/default/img/control_stop_blue.png b/pyload/webui/themes/default/img/control_stop_blue.png new file mode 100644 index 000000000..e6f75d232 Binary files /dev/null and b/pyload/webui/themes/default/img/control_stop_blue.png differ diff --git a/pyload/webui/themes/default/img/delete.png b/pyload/webui/themes/default/img/delete.png new file mode 100644 index 000000000..08f249365 Binary files /dev/null and b/pyload/webui/themes/default/img/delete.png differ diff --git a/pyload/webui/themes/default/img/drag_corner.gif b/pyload/webui/themes/default/img/drag_corner.gif new file mode 100644 index 000000000..befb1adf1 Binary files /dev/null and b/pyload/webui/themes/default/img/drag_corner.gif differ diff --git a/pyload/webui/themes/default/img/error.png b/pyload/webui/themes/default/img/error.png new file mode 100644 index 000000000..c37bd062e Binary files /dev/null and b/pyload/webui/themes/default/img/error.png differ diff --git a/pyload/webui/themes/default/img/folder.png b/pyload/webui/themes/default/img/folder.png new file mode 100644 index 000000000..784e8fa48 Binary files /dev/null and b/pyload/webui/themes/default/img/folder.png differ diff --git a/pyload/webui/themes/default/img/full.png b/pyload/webui/themes/default/img/full.png new file mode 100644 index 000000000..fea52af76 Binary files /dev/null and b/pyload/webui/themes/default/img/full.png differ diff --git a/pyload/webui/themes/default/img/head-login.png b/pyload/webui/themes/default/img/head-login.png new file mode 100644 index 000000000..b59b7cbbf Binary files /dev/null and b/pyload/webui/themes/default/img/head-login.png differ diff --git a/pyload/webui/themes/default/img/head-menu-collector.png b/pyload/webui/themes/default/img/head-menu-collector.png new file mode 100644 index 000000000..861be40bc Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-collector.png differ diff --git a/pyload/webui/themes/default/img/head-menu-config.png b/pyload/webui/themes/default/img/head-menu-config.png new file mode 100644 index 000000000..bbf43d4f3 Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-config.png differ diff --git a/pyload/webui/themes/default/img/head-menu-development.png b/pyload/webui/themes/default/img/head-menu-development.png new file mode 100644 index 000000000..fad150fe1 Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-development.png differ diff --git a/pyload/webui/themes/default/img/head-menu-download.png b/pyload/webui/themes/default/img/head-menu-download.png new file mode 100644 index 000000000..98c5da9db Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-download.png differ diff --git a/pyload/webui/themes/default/img/head-menu-home.png b/pyload/webui/themes/default/img/head-menu-home.png new file mode 100644 index 000000000..9d62109aa Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-home.png differ diff --git a/pyload/webui/themes/default/img/head-menu-index.png b/pyload/webui/themes/default/img/head-menu-index.png new file mode 100644 index 000000000..44d631064 Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-index.png differ diff --git a/pyload/webui/themes/default/img/head-menu-news.png b/pyload/webui/themes/default/img/head-menu-news.png new file mode 100644 index 000000000..43950ebc9 Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-news.png differ diff --git a/pyload/webui/themes/default/img/head-menu-queue.png b/pyload/webui/themes/default/img/head-menu-queue.png new file mode 100644 index 000000000..be98793ce Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-queue.png differ diff --git a/pyload/webui/themes/default/img/head-menu-recent.png b/pyload/webui/themes/default/img/head-menu-recent.png new file mode 100644 index 000000000..fc9b0497f Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-recent.png differ diff --git a/pyload/webui/themes/default/img/head-menu-wiki.png b/pyload/webui/themes/default/img/head-menu-wiki.png new file mode 100644 index 000000000..07cf0102d Binary files /dev/null and b/pyload/webui/themes/default/img/head-menu-wiki.png differ diff --git a/pyload/webui/themes/default/img/head-search-noshadow.png b/pyload/webui/themes/default/img/head-search-noshadow.png new file mode 100644 index 000000000..aafdae015 Binary files /dev/null and b/pyload/webui/themes/default/img/head-search-noshadow.png differ diff --git a/pyload/webui/themes/default/img/head_bg1.png b/pyload/webui/themes/default/img/head_bg1.png new file mode 100644 index 000000000..f2848c3cc Binary files /dev/null and b/pyload/webui/themes/default/img/head_bg1.png differ diff --git a/pyload/webui/themes/default/img/images.png b/pyload/webui/themes/default/img/images.png new file mode 100644 index 000000000..184860d1e Binary files /dev/null and b/pyload/webui/themes/default/img/images.png differ diff --git a/pyload/webui/themes/default/img/notice.png b/pyload/webui/themes/default/img/notice.png new file mode 100644 index 000000000..12cd1aef9 Binary files /dev/null and b/pyload/webui/themes/default/img/notice.png differ diff --git a/pyload/webui/themes/default/img/package_go.png b/pyload/webui/themes/default/img/package_go.png new file mode 100644 index 000000000..aace63ad6 Binary files /dev/null and b/pyload/webui/themes/default/img/package_go.png differ diff --git a/pyload/webui/themes/default/img/page-tools-backlinks.png b/pyload/webui/themes/default/img/page-tools-backlinks.png new file mode 100644 index 000000000..3eb6a9ce3 Binary files /dev/null and b/pyload/webui/themes/default/img/page-tools-backlinks.png differ diff --git a/pyload/webui/themes/default/img/page-tools-edit.png b/pyload/webui/themes/default/img/page-tools-edit.png new file mode 100644 index 000000000..188e1c12b Binary files /dev/null and b/pyload/webui/themes/default/img/page-tools-edit.png differ diff --git a/pyload/webui/themes/default/img/page-tools-revisions.png b/pyload/webui/themes/default/img/page-tools-revisions.png new file mode 100644 index 000000000..5c3b8587f Binary files /dev/null and b/pyload/webui/themes/default/img/page-tools-revisions.png differ diff --git a/pyload/webui/themes/default/img/parseUri.png b/pyload/webui/themes/default/img/parseUri.png new file mode 100644 index 000000000..937bded9d Binary files /dev/null and b/pyload/webui/themes/default/img/parseUri.png differ diff --git a/pyload/webui/themes/default/img/pencil.png b/pyload/webui/themes/default/img/pencil.png new file mode 100644 index 000000000..0bfecd50e Binary files /dev/null and b/pyload/webui/themes/default/img/pencil.png differ diff --git a/pyload/webui/themes/default/img/pyload-logo.png b/pyload/webui/themes/default/img/pyload-logo.png new file mode 100644 index 000000000..2443cd8b1 Binary files /dev/null and b/pyload/webui/themes/default/img/pyload-logo.png differ diff --git a/pyload/webui/themes/default/img/reconnect.png b/pyload/webui/themes/default/img/reconnect.png new file mode 100644 index 000000000..49b269145 Binary files /dev/null and b/pyload/webui/themes/default/img/reconnect.png differ diff --git a/pyload/webui/themes/default/img/status_None.png b/pyload/webui/themes/default/img/status_None.png new file mode 100644 index 000000000..293b13f77 Binary files /dev/null and b/pyload/webui/themes/default/img/status_None.png differ diff --git a/pyload/webui/themes/default/img/status_downloading.png b/pyload/webui/themes/default/img/status_downloading.png new file mode 100644 index 000000000..fb4ebc850 Binary files /dev/null and b/pyload/webui/themes/default/img/status_downloading.png differ diff --git a/pyload/webui/themes/default/img/status_failed.png b/pyload/webui/themes/default/img/status_failed.png new file mode 100644 index 000000000..c37bd062e Binary files /dev/null and b/pyload/webui/themes/default/img/status_failed.png differ diff --git a/pyload/webui/themes/default/img/status_finished.png b/pyload/webui/themes/default/img/status_finished.png new file mode 100644 index 000000000..89c8129a4 Binary files /dev/null and b/pyload/webui/themes/default/img/status_finished.png differ diff --git a/pyload/webui/themes/default/img/status_offline.png b/pyload/webui/themes/default/img/status_offline.png new file mode 100644 index 000000000..0cfd58596 Binary files /dev/null and b/pyload/webui/themes/default/img/status_offline.png differ diff --git a/pyload/webui/themes/default/img/status_proc.png b/pyload/webui/themes/default/img/status_proc.png new file mode 100644 index 000000000..67de2c6cc Binary files /dev/null and b/pyload/webui/themes/default/img/status_proc.png differ diff --git a/pyload/webui/themes/default/img/status_queue.png b/pyload/webui/themes/default/img/status_queue.png new file mode 100644 index 000000000..293b13f77 Binary files /dev/null and b/pyload/webui/themes/default/img/status_queue.png differ diff --git a/pyload/webui/themes/default/img/status_waiting.png b/pyload/webui/themes/default/img/status_waiting.png new file mode 100644 index 000000000..2842cc338 Binary files /dev/null and b/pyload/webui/themes/default/img/status_waiting.png differ diff --git a/pyload/webui/themes/default/img/success.png b/pyload/webui/themes/default/img/success.png new file mode 100644 index 000000000..89c8129a4 Binary files /dev/null and b/pyload/webui/themes/default/img/success.png differ diff --git a/pyload/webui/themes/default/img/tab-background.png b/pyload/webui/themes/default/img/tab-background.png new file mode 100644 index 000000000..29a5d1991 Binary files /dev/null and b/pyload/webui/themes/default/img/tab-background.png differ diff --git a/pyload/webui/themes/default/img/tabs-border-bottom.png b/pyload/webui/themes/default/img/tabs-border-bottom.png new file mode 100644 index 000000000..02440f428 Binary files /dev/null and b/pyload/webui/themes/default/img/tabs-border-bottom.png differ diff --git a/pyload/webui/themes/default/img/user-actions-logout.png b/pyload/webui/themes/default/img/user-actions-logout.png new file mode 100644 index 000000000..0010931e2 Binary files /dev/null and b/pyload/webui/themes/default/img/user-actions-logout.png differ diff --git a/pyload/webui/themes/default/img/user-actions-profile.png b/pyload/webui/themes/default/img/user-actions-profile.png new file mode 100644 index 000000000..46573fff6 Binary files /dev/null and b/pyload/webui/themes/default/img/user-actions-profile.png differ diff --git a/pyload/webui/themes/default/img/user-info.png b/pyload/webui/themes/default/img/user-info.png new file mode 100644 index 000000000..6e643100f Binary files /dev/null and b/pyload/webui/themes/default/img/user-info.png differ diff --git a/pyload/webui/themes/default/js/render/admin.coffee b/pyload/webui/themes/default/js/render/admin.coffee new file mode 100644 index 000000000..5afbcbb66 --- /dev/null +++ b/pyload/webui/themes/default/js/render/admin.coffee @@ -0,0 +1,58 @@ +root = this + +window.addEvent "domready", -> + + root.passwordDialog = new MooDialog {destroyOnHide: false} + root.passwordDialog.setContent $ 'password_box' + + $("login_password_reset").addEvent "click", (e) -> root.passwordDialog.close() + $("login_password_button").addEvent "click", (e) -> + + newpw = $("login_new_password").get("value") + newpw2 = $("login_new_password2").get("value") + + if newpw is newpw2 + form = $("password_form") + form.set "send", { + onSuccess: (data) -> + root.notify.alert "Success", { + 'className': 'success' + } + onFailure: (data) -> + root.notify.alert "Error", { + 'className': 'error' + } + } + + form.send() + + root.passwordDialog.close() + else + alert '{{_("Passwords did not match.")}}' + + e.stop() + + for item in $$(".change_password") + id = item.get("id") + user = id.split("|")[1] + $("user_login").set("value", user) + item.addEvent "click", (e) -> root.passwordDialog.open() + + $('quit-pyload').addEvent "click", (e) -> + new MooDialog.Confirm "{{_('You are really sure you want to quit pyLoad?')}}", -> + new Request.JSON({ + url: '/api/kill' + method: 'get' + }).send() + , -> + e.stop() + + $('restart-pyload').addEvent "click", (e) -> + new MooDialog.Confirm "{{_('Are you sure you want to restart pyLoad?')}}", -> + new Request.JSON({ + url: '/api/restart' + method: 'get' + onSuccess: (data) -> alert "{{_('pyLoad restarted')}}" + }).send() + , -> + e.stop() diff --git a/pyload/webui/themes/default/js/render/admin.min.js b/pyload/webui/themes/default/js/render/admin.min.js new file mode 100644 index 000000000..94a5e494d --- /dev/null +++ b/pyload/webui/themes/default/js/render/admin.min.js @@ -0,0 +1,3 @@ +{% autoescape true %} +var root;root=this;window.addEvent("domready",function(){var f,c,b,e,a,d;root.passwordDialog=new MooDialog({destroyOnHide:false});root.passwordDialog.setContent($("password_box"));$("login_password_reset").addEvent("click",function(g){return root.passwordDialog.close()});$("login_password_button").addEvent("click",function(j){var h,i,g;i=$("login_new_password").get("value");g=$("login_new_password2").get("value");if(i===g){h=$("password_form");h.set("send",{onSuccess:function(k){return root.notify.alert("Success",{className:"success"})},onFailure:function(k){return root.notify.alert("Error",{className:"error"})}});h.send();root.passwordDialog.close()}else{alert('{{_("Passwords did not match.")}}')}return j.stop()});d=$$(".change_password");for(e=0,a=d.length;e + filesizename = new Array("B", "KiB", "MiB", "GiB", "TiB", "PiB") + loga = Math.log(size) / Math.log(1024) + i = Math.floor(loga) + a = Math.pow(1024, i) + if size is 0 then "0 B" else (Math.round(size * 100 / a) / 100 + " " + filesizename[i]) + + +parseUri = () -> + oldString = $("add_links").value + regxp = new RegExp('(ht|f)tp(s?):\/\/[a-zA-Z0-9\-\.\/\?=_&%#]+[<| |\"|\'|\r|\n|\t]{1}', 'g') + resu = oldString.match regxp + return if resu == null + res = "" + + for part in resu + if part.indexOf(" ") != -1 + res = res + part.replace(" ", " \n") + else if part.indexOf("\t") != -1 + res = res + part.replace("\t", " \n") + else if part.indexOf("\r") != -1 + res = res + part.replace("\r", " \n") + else if part.indexOf("\"") != -1 + res = res + part.replace("\"", " \n") + else if part.indexOf("<") != -1 + res = res + part.replace("<", " \n") + else if part.indexOf("'") != -1 + res = res + part.replace("'", " \n") + else + res = res + part.replace("\n", " \n") + + $("add_links").value = res + + +Array::remove = (from, to) -> + rest = this.slice((to || from) + 1 || this.length) + this.length = from < 0 ? this.length + from : from + return [] if this.length == 0 + return this.push.apply(this, rest) + + +document.addEvent "domready", -> + + # global notification + root.notify = new Purr { + 'mode': 'top' + 'position': 'center' + } + + root.captchaBox = new MooDialog {destroyOnHide: false} + root.captchaBox.setContent $ 'cap_box' + + root.addBox = new MooDialog {destroyOnHide: false} + root.addBox.setContent $ 'add_box' + + $('add_form').onsubmit = -> + $('add_form').target = 'upload_target' + if $('add_name').value is "" and $('add_file').value is "" + alert '{{_("Please Enter a packagename.")}}' + return false + else + root.addBox.close() + return true + + $('add_reset').addEvent 'click', -> root.addBox.close() + + $('action_add').addEvent 'click', -> $("add_form").reset(); root.addBox.open() + $('action_play').addEvent 'click', -> new Request({method: 'get', url: '/api/unpauseServer'}).send() + $('action_cancel').addEvent 'click', -> new Request({method: 'get', url: '/api/stopAllDownloads'}).send() + $('action_stop').addEvent 'click', -> new Request({method: 'get', url: '/api/pauseServer'}).send() + + + # captcha events + + $('cap_info').addEvent 'click', -> + load_captcha "get", "" + root.captchaBox.open() + $('cap_reset').addEvent 'click', -> root.captchaBox.close() + $('cap_form').addEvent 'submit', (e) -> + submit_captcha() + e.stop() + + $('cap_positional').addEvent 'click', on_captcha_click + + new Request.JSON({ + url: "/json/status" + onSuccess: LoadJsonToContent + secure: false + async: true + initialDelay: 0 + delay: 4000 + limit: 3000 + }).startTimer() + + +LoadJsonToContent = (data) -> + $("speed").set 'text', humanFileSize(data.speed)+"/s" + $("aktiv").set 'text', data.active + $("aktiv_from").set 'text', data.queue + $("aktiv_total").set 'text', data.total + + if data.captcha + if $("cap_info").getStyle("display") != "inline" + $("cap_info").setStyle 'display', 'inline' + root.notify.alert '{{_("New Captcha Request")}}', { + 'className': 'notify' + } + else + $("cap_info").setStyle 'display', 'none' + + + if data.download + $("time").set 'text', ' {{_("on")}}' + $("time").setStyle 'background-color', "#8ffc25" + else + $("time").set 'text', ' {{_("off")}}' + $("time").setStyle 'background-color', "#fc6e26" + + if data.reconnect + $("reconnect").set 'text', ' {{_("on")}}' + $("reconnect").setStyle 'background-color', "#8ffc25" + else + $("reconnect").set 'text', ' {{_("off")}}' + $("reconnect").setStyle 'background-color', "#fc6e26" + + return null + + +set_captcha = (data) -> + $('cap_id').set 'value', data.id + if (data.result_type is 'textual') + $('cap_textual_img').set 'src', data.src + $('cap_title').set 'text', '{{_("Please read the text on the captcha.")}}' + $('cap_submit').setStyle 'display', 'inline' + $('cap_textual').setStyle 'display', 'block' + $('cap_positional').setStyle 'display', 'none' + + else if (data.result_type == 'positional') + $('cap_positional_img').set('src', data.src) + $('cap_title').set('text', '{{_("Please click on the right captcha position.")}}') + $('cap_submit').setStyle('display', 'none') + $('cap_textual').setStyle('display', 'none') + + +load_captcha = (method, post) -> + new Request.JSON({ + url: "/json/set_captcha" + onSuccess: (data) -> set_captcha(data) if data.captcha else clear_captcha() + secure: false + async: true + method: method + }).send(post) + + +clear_captcha = -> + $('cap_textual').setStyle 'display', 'none' + $('cap_textual_img').set 'src', '' + $('cap_positional').setStyle 'display', 'none' + $('cap_positional_img').set 'src', '' + $('cap_title').set 'text', '{{_("No Captchas to read.")}}' + + +submit_captcha = -> + load_captcha("post", "cap_id=" + $('cap_id').get('value') + "&cap_result=" + $('cap_result').get('value') ) + $('cap_result').set('value', '') + + +on_captcha_click = (e) -> + position = e.target.getPosition() + x = e.page.x - position.x + y = e.page.y - position.y + $('cap_result').value = x + "," + y + submit_captcha() diff --git a/pyload/webui/themes/default/js/render/base.min.js b/pyload/webui/themes/default/js/render/base.min.js new file mode 100644 index 000000000..1ba1d73f9 --- /dev/null +++ b/pyload/webui/themes/default/js/render/base.min.js @@ -0,0 +1,3 @@ +{% autoescape true %} +var LoadJsonToContent,clear_captcha,humanFileSize,load_captcha,on_captcha_click,parseUri,root,set_captcha,submit_captcha;root=this;humanFileSize=function(f){var c,d,e,b;d=new Array("B","KiB","MiB","GiB","TiB","PiB");b=Math.log(f)/Math.log(1024);e=Math.floor(b);c=Math.pow(1024,e);if(f===0){return"0 B"}else{return Math.round(f*100/c)/100+" "+d[e]}};parseUri=function(){var b,c,g,e,d,f,a;b=$("add_links").value;g=new RegExp("(ht|f)tp(s?)://[a-zA-Z0-9-./?=_&%#]+[<| |\"|'|\r|\n|\t]{1}","g");d=b.match(g);if(d===null){return}e="";for(f=0,a=d.length;f 0) + { + uls[0].getChildren("li.folder").each(function(fld) { + var path = fld.getElements("input.path")[0].get("value"); + var name = fld.getElements("input.name")[0].get("value"); + this.directories.push(new Item(this, path, name, fld)); + }.bind(this)); + uls[0].getChildren("li.file").each(function(fld) { + var path = fld.getElements("input.path")[0].get("value"); + var name = fld.getElements("input.name")[0].get("value"); + this.files.push(new Item(this, path, name, fld)); + }.bind(this)); + } + }, + + reorderElements: function() { + //TODO sort the main ul again (to keep data ordered after renaming something) + }, + + del: function(event) { + $("confirm_form").removeEvents("submit"); + $("confirm_form").addEvent("submit", this.deleteDirectory.bind(this)); + + $$("#confirm_form p").set('html', '{{_(("Are you sure you want to delete the selected item?"))}}'); + + show_confirm_box(); + event.stop(); + }, + + deleteDirectory: function(event) { + hide_confirm_box(); + new Request.JSON({ + method: 'POST', + url: "/json/filemanager/delete", + data: {'path': this.path, 'name': this.name}, + onSuccess: function(data) { + if(data.response == "success") + { + new Fx.Tween(this.ele).start('opacity', 0); + var ul = this.ele.parentNode; + this.ele.dispose(); + //if this was the only child, add a "empty folder" div + if(!ul.getChildren('li')[0]) + { + var div = new Element("div", { 'html': '{{ _("Folder is empty") }}' }); + div.replaces(ul); + } + + indicateSuccess(); + } else + { + //error from json code... + indicateFail(); + } + }.bind(this), + onFailure: indicateFail + }).send(); + + event.stop(); + }, + + rename: function(event) { + $("rename_form").removeEvents("submit"); + $("rename_form").addEvent("submit", this.renameDirectory.bind(this)); + + $("path").set("value", this.path); + $("old_name").set("value", this.name); + $("new_name").set("value", this.name); + + show_rename_box(); + event.stop(); + }, + + renameDirectory: function(event) { + hide_rename_box(); + new Request.JSON({ + method: 'POST', + url: "/json/filemanager/rename", + onSuccess: function(data) { + if(data.response == "success") + { + this.name = $("new_name").get("value"); + this.ele.getElements("b")[0].set('html', $("new_name").get("value")); + this.reorderElements(); + indicateSuccess(); + } else + { + //error from json code... + indicateFail(); + } + }.bind(this), + onFailure: indicateFail + }).send($("rename_form").toQueryString()); + + event.stop(); + }, + + mkdir: function(event) { + new Request.JSON({ + method: 'POST', + url: "/json/filemanager/mkdir", + data: {'path': this.path + "/" + this.name, 'name': '{{_("New folder")}}'}, + onSuccess: function(data) { + if(data.response == "success") + { + new Request.HTML({ + method: 'POST', + url: "/filemanager/get_dir", + data: {'path': data.path, 'name': data.name}, + onSuccess: function(li) { + //add node as first child of ul + var ul = this.ele.getChildren('ul')[0]; + if(!ul) + { + //remove the "Folder Empty" div + this.ele.getChildren('div').dispose(); + + //create new ul to contain subfolder + ul = new Element("ul"); + ul.inject(this.ele, 'bottom'); + } + li[0].inject(ul, 'top'); + + //add directory as a subdirectory of the current item + this.directories.push(new Item(this.ui, data.path, data.name, ul.firstChild)); + }.bind(this), + onFailure: indicateFail + }).send(); + indicateSuccess(); + } else + { + //error from json code... + indicateFail(); + } + }.bind(this), + onFailure: indicateFail + }).send(); + + event.stop(); + }, + + toggle: function() { + var child = this.ele.getElement('ul'); + if(child == null) + child = this.ele.getElement('div'); + + if(child != null) + { + if (child.getStyle('display') == "block") { + child.dissolve(); + } else { + child.reveal(); + } + } + } +}); diff --git a/pyload/webui/themes/default/js/render/package.js b/pyload/webui/themes/default/js/render/package.js new file mode 100644 index 000000000..659a8e6fc --- /dev/null +++ b/pyload/webui/themes/default/js/render/package.js @@ -0,0 +1,376 @@ +var root = this; + +document.addEvent("domready", function() { + root.load = new Fx.Tween($("load-indicator"), {link: "cancel"}); + root.load.set("opacity", 0); + + + root.packageBox = new MooDialog({destroyOnHide: false}); + root.packageBox.setContent($('pack_box')); + + $('pack_reset').addEvent('click', function() { + $('pack_form').reset(); + root.packageBox.close(); + }); +}); + +function indicateLoad() { + //$("load-indicator").reveal(); + root.load.start("opacity", 1) +} + +function indicateFinish() { + root.load.start("opacity", 0) +} + +function indicateSuccess() { + indicateFinish(); + root.notify.alert('{{_("Success")}}.', { + 'className': 'success' + }); +} + +function indicateFail() { + indicateFinish(); + root.notify.alert('{{_("Failed")}}.', { + 'className': 'error' + }); +} + +var PackageUI = new Class({ + initialize: function(url, type) { + this.url = url; + this.type = type; + this.packages = []; + this.parsePackages(); + + this.sorts = new Sortables($("package-list"), { + constrain: false, + clone: true, + revert: true, + opacity: 0.4, + handle: ".package_drag", + onComplete: this.saveSort.bind(this) + }); + + $("del_finished").addEvent("click", this.deleteFinished.bind(this)); + $("restart_failed").addEvent("click", this.restartFailed.bind(this)); + + }, + + parsePackages: function() { + $("package-list").getChildren("li").each(function(ele) { + var id = ele.getFirst().get("id").match(/[0-9]+/); + this.packages.push(new Package(this, id, ele)) + }.bind(this)) + }, + + loadPackages: function() { + }, + + deleteFinished: function() { + indicateLoad(); + new Request.JSON({ + method: 'get', + url: '/api/deleteFinished', + onSuccess: function(data) { + if (data.length > 0) { + window.location.reload() + } else { + this.packages.each(function(pack) { + pack.close(); + }); + indicateSuccess(); + } + }.bind(this), + onFailure: indicateFail + }).send(); + }, + + restartFailed: function() { + indicateLoad(); + new Request.JSON({ + method: 'get', + url: '/api/restartFailed', + onSuccess: function(data) { + this.packages.each(function(pack) { + pack.close(); + }); + indicateSuccess(); + }.bind(this), + onFailure: indicateFail + }).send(); + }, + + startSort: function(ele, copy) { + }, + + saveSort: function(ele, copy) { + var order = []; + this.sorts.serialize(function(li, pos) { + if (li == ele && ele.retrieve("order") != pos) { + order.push(ele.retrieve("pid") + "|" + pos) + } + li.store("order", pos) + }); + if (order.length > 0) { + indicateLoad(); + new Request.JSON({ + method: 'get', + url: '/json/package_order/' + order[0], + onSuccess: indicateFinish, + onFailure: indicateFail + }).send(); + } + } + +}); + +var Package = new Class({ + initialize: function(ui, id, ele, data) { + this.ui = ui; + this.id = id; + this.linksLoaded = false; + + if (!ele) { + this.createElement(data); + } else { + this.ele = ele; + this.order = ele.getElements("div.order")[0].get("html"); + this.ele.store("order", this.order); + this.ele.store("pid", this.id); + this.parseElement(); + } + + var pname = this.ele.getElements(".packagename")[0]; + this.buttons = new Fx.Tween(this.ele.getElements(".buttons")[0], {link: "cancel"}); + this.buttons.set("opacity", 0); + + pname.addEvent("mouseenter", function(e) { + this.buttons.start("opacity", 1) + }.bind(this)); + + pname.addEvent("mouseleave", function(e) { + this.buttons.start("opacity", 0) + }.bind(this)); + + + }, + + createElement: function() { + alert("create") + }, + + parseElement: function() { + var imgs = this.ele.getElements('img'); + + this.name = this.ele.getElements('.name')[0]; + this.folder = this.ele.getElements('.folder')[0]; + this.password = this.ele.getElements('.password')[0]; + + imgs[1].addEvent('click', this.deletePackage.bind(this)); + imgs[2].addEvent('click', this.restartPackage.bind(this)); + imgs[3].addEvent('click', this.editPackage.bind(this)); + imgs[4].addEvent('click', this.movePackage.bind(this)); + + this.ele.getElement('.packagename').addEvent('click', this.toggle.bind(this)); + + }, + + loadLinks: function() { + indicateLoad(); + new Request.JSON({ + method: 'get', + url: '/json/package/' + this.id, + onSuccess: this.createLinks.bind(this), + onFailure: indicateFail + }).send(); + }, + + createLinks: function(data) { + var ul = $("sort_children_{id}".substitute({'id': this.id})); + ul.set("html", ""); + data.links.each(function(link) { + link.id = link.fid; + var li = new Element("li", { + 'style': { + 'margin-left': 0 + } + }); + + var html = "\n".substitute({'icon': link.icon}); + html += "{name}
          ".substitute({'url': link.url, 'name': link.name}); + html += "{statusmsg}{error} ".substitute({'statusmsg': link.statusmsg, 'error':link.error}); + html += "{format_size}".substitute({'format_size': link.format_size}); + html += "{plugin}  ".substitute({'plugin': link.plugin}); + html += "  "; + html += "
          "; + + var div = new Element("div", { + 'id': "file_" + link.id, + 'class': "child", + 'html': html + }); + + li.store("order", link.order); + li.store("lid", link.id); + + li.adopt(div); + ul.adopt(li); + }); + this.sorts = new Sortables(ul, { + constrain: false, + clone: true, + revert: true, + opacity: 0.4, + handle: ".sorthandle", + onComplete: this.saveSort.bind(this) + }); + this.registerLinkEvents(); + this.linksLoaded = true; + indicateFinish(); + this.toggle(); + }, + + registerLinkEvents: function() { + this.ele.getElements('.child').each(function(child) { + var lid = child.get('id').match(/[0-9]+/); + var imgs = child.getElements('.child_secrow img'); + imgs[0].addEvent('click', function(e) { + new Request({ + method: 'get', + url: '/api/deleteFiles/[' + this + "]", + onSuccess: function() { + $('file_' + this).nix() + }.bind(this), + onFailure: indicateFail + }).send(); + }.bind(lid)); + + imgs[1].addEvent('click', function(e) { + new Request({ + method: 'get', + url: '/api/restartFile/' + this, + onSuccess: function() { + var ele = $('file_' + this); + var imgs = ele.getElements("img"); + imgs[0].set("src", "../img/status_queue.png"); + var spans = ele.getElements(".child_status"); + spans[1].set("html", "queued"); + indicateSuccess(); + }.bind(this), + onFailure: indicateFail + }).send(); + }.bind(lid)); + }); + }, + + toggle: function() { + var child = this.ele.getElement('.children'); + if (child.getStyle('display') == "block") { + child.dissolve(); + } else { + if (!this.linksLoaded) { + this.loadLinks(); + } else { + child.reveal(); + } + } + }, + + + deletePackage: function(event) { + indicateLoad(); + new Request({ + method: 'get', + url: '/api/deletePackages/[' + this.id + "]", + onSuccess: function() { + this.ele.nix(); + indicateFinish(); + }.bind(this), + onFailure: indicateFail + }).send(); + //hide_pack(); + event.stop(); + }, + + restartPackage: function(event) { + indicateLoad(); + new Request({ + method: 'get', + url: '/api/restartPackage/' + this.id, + onSuccess: function() { + this.close(); + indicateSuccess(); + }.bind(this), + onFailure: indicateFail + }).send(); + event.stop(); + }, + + close: function() { + var child = this.ele.getElement('.children'); + if (child.getStyle('display') == "block") { + child.dissolve(); + } + var ul = $("sort_children_{id}".substitute({'id': this.id})); + ul.erase("html"); + this.linksLoaded = false; + }, + + movePackage: function(event) { + indicateLoad(); + new Request({ + method: 'get', + url: '/json/move_package/' + ((this.ui.type + 1) % 2) + "/" + this.id, + onSuccess: function() { + this.ele.nix(); + indicateFinish(); + }.bind(this), + onFailure: indicateFail + }).send(); + event.stop(); + }, + + editPackage: function(event) { + $("pack_form").removeEvents("submit"); + $("pack_form").addEvent("submit", this.savePackage.bind(this)); + + $("pack_id").set("value", this.id); + $("pack_name").set("value", this.name.get("text")); + $("pack_folder").set("value", this.folder.get("text")); + $("pack_pws").set("value", this.password.get("text")); + + root.packageBox.open(); + event.stop(); + }, + + savePackage: function(event) { + $("pack_form").send(); + this.name.set("text", $("pack_name").get("value")); + this.folder.set("text", $("pack_folder").get("value")); + this.password.set("text", $("pack_pws").get("value")); + root.packageBox.close(); + event.stop(); + }, + + saveSort: function(ele, copy) { + var order = []; + this.sorts.serialize(function(li, pos) { + if (li == ele && ele.retrieve("order") != pos) { + order.push(ele.retrieve("lid") + "|" + pos) + } + li.store("order", pos) + }); + if (order.length > 0) { + indicateLoad(); + new Request.JSON({ + method: 'get', + url: '/json/link_order/' + order[0], + onSuccess: indicateFinish, + onFailure: indicateFail + }).send(); + } + } + +}); diff --git a/pyload/webui/themes/default/js/render/settings.coffee b/pyload/webui/themes/default/js/render/settings.coffee new file mode 100644 index 000000000..d522741b9 --- /dev/null +++ b/pyload/webui/themes/default/js/render/settings.coffee @@ -0,0 +1,107 @@ +root = this + +window.addEvent 'domready', -> + root.accountDialog = new MooDialog {destroyOnHide: false} + root.accountDialog.setContent $ 'account_box' + + new TinyTab $$('#toptabs li a'), $$('#tabs-body > span') + + $$('ul.nav').each (nav) -> + new MooDropMenu nav, { + onOpen: (el) -> el.fade 'in' + onClose: (el) -> el.fade 'out' + onInitialize: (el) -> el.fade('hide').set 'tween', {duration:500} + } + + new SettingsUI() + + +class SettingsUI + constructor: -> + @menu = $$ "#general-menu li" + @menu.append $$ "#plugin-menu li" + + @name = $ "tabsback" + @general = $ "general_form_content" + @plugin = $ "plugin_form_content" + + el.addEvent 'click', @menuClick.bind(this) for el in @menu + + $("general|submit").addEvent "click", @configSubmit.bind(this) + $("plugin|submit").addEvent "click", @configSubmit.bind(this) + + $("account_add").addEvent "click", (e) -> + root.accountDialog.open() + e.stop() + + $("account_reset").addEvent "click", (e) -> + root.accountDialog.close() + + $("account_add_button").addEvent "click", @addAccount.bind(this) + $("account_submit").addEvent "click", @submitAccounts.bind(this) + + + menuClick: (e) -> + [category, section] = e.target.get("id").split("|") + name = e.target.get "text" + + + target = if category is "general" then @general else @plugin + target.dissolve() + + new Request({ + "method" : "get" + "url" : "/json/load_config/#{category}/#{section}" + 'onSuccess': (data) => + target.set "html", data + target.reveal() + this.name.set "text", name + }).send() + + + configSubmit: (e) -> + category = e.target.get("id").split("|")[0] + form = $("#{category}_form") + + form.set "send", { + 'method': "post" + 'url': "/json/save_config/#{category}" + "onSuccess" : -> + root.notify.alert '{{ _("Settings saved.")}}', { + 'className': 'success' + } + 'onFailure': -> + root.notify.alert '{{ _("Error occured.")}}', { + 'className': 'error' + } + } + form.send() + e.stop() + + addAccount: (e) -> + form = $ "add_account_form" + form.set "send", { + 'method': "post" + "onSuccess" : -> window.location.reload() + 'onFailure': -> + root.notify.alert '{{_("Error occured.")}}', { + 'className': 'error' + } + } + + form.send() + e.stop() + + submitAccounts: (e) -> + form = $ "account_form" + form.set "send", { + 'method': "post", + "onSuccess" : -> window.location.reload() + 'onFailure': -> + root.notify.alert('{{ _("Error occured.") }}', { + 'className': 'error' + }) + } + + form.send() + e.stop() diff --git a/pyload/webui/themes/default/js/render/settings.min.js b/pyload/webui/themes/default/js/render/settings.min.js new file mode 100644 index 000000000..41d1cb25a --- /dev/null +++ b/pyload/webui/themes/default/js/render/settings.min.js @@ -0,0 +1,3 @@ +{% autoescape true %} +var SettingsUI,root;var __bind=function(a,b){return function(){return a.apply(b,arguments)}};root=this;window.addEvent("domready",function(){root.accountDialog=new MooDialog({destroyOnHide:false});root.accountDialog.setContent($("account_box"));new TinyTab($$("#toptabs li a"),$$("#tabs-body > span"));$$("ul.nav").each(function(a){return new MooDropMenu(a,{onOpen:function(b){return b.fade("in")},onClose:function(b){return b.fade("out")},onInitialize:function(b){return b.fade("hide").set("tween",{duration:500})}})});return new SettingsUI()});SettingsUI=(function(){function a(){var c,e,b,d;this.menu=$$("#general-menu li");this.menu.append($$("#plugin-menu li"));this.name=$("tabsback");this.general=$("general_form_content");this.plugin=$("plugin_form_content");d=this.menu;for(e=0,b=d.length;e*/// IE 6 scroll + if ((options.scroll && Browser.ie6) || options.forceScroll){ + wrapper.setStyle('position', 'absolute'); + var position = wrapper.getPosition(options.inject); + window.addEvent('scroll', function(){ + var scroll = document.getScroll(); + wrapper.setPosition({ + x: position.x + scroll.x, + y: position.y + scroll.y + }); + }); + } + /**/ + + if (options.useEscKey){ + // Add event for the esc key + document.addEvent('keydown', function(e){ + if (e.key == 'esc') this.close(); + }.bind(this)); + } + + this.addEvent('hide', function(){ + if (options.destroyOnHide) this.destroy(); + }.bind(this)); + + this.fireEvent('initialize', wrapper); + }, + + setContent: function(){ + var content = Array.from(arguments); + if (content.length == 1) content = content[0]; + + this.content.empty(); + + var type = typeOf(content); + if (['string', 'number'].contains(type)) this.content.set('text', content); + else this.content.adopt(content); + + this.fireEvent('contentChange', this.content); + + return this; + }, + + open: function(){ + this.fireEvent('beforeOpen', this.wrapper).fireEvent('open'); + this.opened = true; + return this; + }, + + close: function(){ + this.fireEvent('beforeClose', this.wrapper).fireEvent('close'); + this.opened = false; + return this; + }, + + destroy: function(){ + this.wrapper.destroy(); + }, + + toElement: function(){ + return this.wrapper; + } + +}); + + +Element.implement({ + + MooDialog: function(options){ + this.store('MooDialog', + new MooDialog(options).setContent(this).open() + ); + return this; + } + +}); diff --git a/pyload/webui/themes/default/js/static/MooDialog.min.js b/pyload/webui/themes/default/js/static/MooDialog.min.js new file mode 100644 index 000000000..90b3ae100 --- /dev/null +++ b/pyload/webui/themes/default/js/static/MooDialog.min.js @@ -0,0 +1 @@ +var MooDialog=new Class({Implements:[Options,Events],options:{"class":"MooDialog",title:null,scroll:!0,forceScroll:!1,useEscKey:!0,destroyOnHide:!0,autoOpen:!0,closeButton:!0,onInitialize:function(){this.wrapper.setStyle("display","none")},onBeforeOpen:function(){this.wrapper.setStyle("display","block"),this.fireEvent("show")},onBeforeClose:function(){this.wrapper.setStyle("display","none"),this.fireEvent("hide")}},initialize:function(t){this.setOptions(t),this.options.inject=this.options.inject||document.body,t=this.options;var e=this.wrapper=new Element("div."+t["class"].replace(" ",".")).inject(t.inject);if(this.content=new Element("div.content").inject(e),t.title&&(this.title=new Element("div.title").set("text",t.title).inject(e),e.addClass("MooDialogTitle")),t.closeButton&&(this.closeButton=new Element("a.close",{events:{click:this.close.bind(this)}}).inject(e)),t.scroll&&Browser.ie6||t.forceScroll){e.setStyle("position","absolute");var n=e.getPosition(t.inject);window.addEvent("scroll",function(){var t=document.getScroll();e.setPosition({x:n.x+t.x,y:n.y+t.y})})}t.useEscKey&&document.addEvent("keydown",function(t){"esc"==t.key&&this.close()}.bind(this)),this.addEvent("hide",function(){t.destroyOnHide&&this.destroy()}.bind(this)),this.fireEvent("initialize",e)},setContent:function(){var t=Array.from(arguments);1==t.length&&(t=t[0]),this.content.empty();var e=typeOf(t);return["string","number"].contains(e)?this.content.set("text",t):this.content.adopt(t),this.fireEvent("contentChange",this.content),this},open:function(){return this.fireEvent("beforeOpen",this.wrapper).fireEvent("open"),this.opened=!0,this},close:function(){return this.fireEvent("beforeClose",this.wrapper).fireEvent("close"),this.opened=!1,this},destroy:function(){this.wrapper.destroy()},toElement:function(){return this.wrapper}});Element.implement({MooDialog:function(t){return this.store("MooDialog",new MooDialog(t).setContent(this).open()),this}}); \ No newline at end of file diff --git a/pyload/webui/themes/default/js/static/MooDropMenu.js b/pyload/webui/themes/default/js/static/MooDropMenu.js new file mode 100644 index 000000000..ac0fa1874 --- /dev/null +++ b/pyload/webui/themes/default/js/static/MooDropMenu.js @@ -0,0 +1,86 @@ +/* +--- +description: This provides a simple Drop Down menu with infinit levels + +license: MIT-style + +authors: +- Arian Stolwijk + +requires: + - Core/Class.Extras + - Core/Element.Event + - Core/Selectors + +provides: [MooDropMenu, Element.MooDropMenu] + +... +*/ + +var MooDropMenu = new Class({ + + Implements: [Options, Events], + + options: { + onOpen: function(el){ + el.removeClass('close').addClass('open'); + }, + onClose: function(el){ + el.removeClass('open').addClass('close'); + }, + onInitialize: function(el){ + el.removeClass('open').addClass('close'); + }, + mouseoutDelay: 200, + mouseoverDelay: 0, + listSelector: 'ul', + itemSelector: 'li', + openEvent: 'mouseenter', + closeEvent: 'mouseleave' + }, + + initialize: function(menu, options, level){ + this.setOptions(options); + options = this.options; + + var menu = this.menu = document.id(menu); + + menu.getElements(options.itemSelector + ' > ' + options.listSelector).each(function(el){ + + this.fireEvent('initialize', el); + + var parent = el.getParent(options.itemSelector), + timer; + + parent.addEvent(options.openEvent, function(){ + parent.store('DropDownOpen', true); + + clearTimeout(timer); + if (options.mouseoverDelay) timer = this.fireEvent.delay(options.mouseoverDelay, this, ['open', el]); + else this.fireEvent('open', el); + + }.bind(this)).addEvent(options.closeEvent, function(){ + parent.store('DropDownOpen', false); + + clearTimeout(timer); + timer = (function(){ + if (!parent.retrieve('DropDownOpen')) this.fireEvent('close', el); + }).delay(options.mouseoutDelay, this); + + }.bind(this)); + + }, this); + }, + + toElement: function(){ + return this.menu + } + +}); + +/* So you can do like this $('nav').MooDropMenu(); or even $('nav').MooDropMenu().setStyle('border',1); */ +Element.implement({ + MooDropMenu: function(options){ + return this.store('MooDropMenu', new MooDropMenu(this, options)); + } +}); diff --git a/pyload/webui/themes/default/js/static/MooDropMenu.min.js b/pyload/webui/themes/default/js/static/MooDropMenu.min.js new file mode 100644 index 000000000..552ae247a --- /dev/null +++ b/pyload/webui/themes/default/js/static/MooDropMenu.min.js @@ -0,0 +1 @@ +var MooDropMenu=new Class({Implements:[Options,Events],options:{onOpen:function(e){e.removeClass("close").addClass("open")},onClose:function(e){e.removeClass("open").addClass("close")},onInitialize:function(e){e.removeClass("open").addClass("close")},mouseoutDelay:200,mouseoverDelay:0,listSelector:"ul",itemSelector:"li",openEvent:"mouseenter",closeEvent:"mouseleave"},initialize:function(e,o){this.setOptions(o),o=this.options;var e=this.menu=document.id(e);e.getElements(o.itemSelector+" > "+o.listSelector).each(function(e){this.fireEvent("initialize",e);var n,t=e.getParent(o.itemSelector);t.addEvent(o.openEvent,function(){t.store("DropDownOpen",!0),clearTimeout(n),o.mouseoverDelay?n=this.fireEvent.delay(o.mouseoverDelay,this,["open",e]):this.fireEvent("open",e)}.bind(this)).addEvent(o.closeEvent,function(){t.store("DropDownOpen",!1),clearTimeout(n),n=function(){t.retrieve("DropDownOpen")||this.fireEvent("close",e)}.delay(o.mouseoutDelay,this)}.bind(this))},this)},toElement:function(){return this.menu}});Element.implement({MooDropMenu:function(e){return this.store("MooDropMenu",new MooDropMenu(this,e))}}); \ No newline at end of file diff --git a/pyload/webui/themes/default/js/static/mootools-core.js b/pyload/webui/themes/default/js/static/mootools-core.js new file mode 100644 index 000000000..db83850fd --- /dev/null +++ b/pyload/webui/themes/default/js/static/mootools-core.js @@ -0,0 +1,5977 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/core/8423c12ffd6a6bfcde9ea22554aec795 + +packager build: + - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady + +... +*/ + +/* +--- + +name: Core + +description: The heart of MooTools. + +license: MIT-style license. + +copyright: Copyright (c) 2006-2014 [Valerio Proietti](http://mad4milk.net/). + +authors: The MooTools production team (http://mootools.net/developers/) + +inspiration: + - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php) + - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php) + +provides: [Core, MooTools, Type, typeOf, instanceOf, Native] + +... +*/ + +(function(){ + +this.MooTools = { + version: '1.5.0', + build: '0f7b690afee9349b15909f33016a25d2e4d9f4e3' +}; + +// typeOf, instanceOf + +var typeOf = this.typeOf = function(item){ + if (item == null) return 'null'; + if (item.$family != null) return item.$family(); + + if (item.nodeName){ + if (item.nodeType == 1) return 'element'; + if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace'; + } else if (typeof item.length == 'number'){ + if ('callee' in item) return 'arguments'; + if ('item' in item) return 'collection'; + } + + return typeof item; +}; + +var instanceOf = this.instanceOf = function(item, object){ + if (item == null) return false; + var constructor = item.$constructor || item.constructor; + while (constructor){ + if (constructor === object) return true; + constructor = constructor.parent; + } + /**/ + if (!item.hasOwnProperty) return false; + /**/ + return item instanceof object; +}; + +// Function overloading + +var Function = this.Function; + +var enumerables = true; +for (var i in {toString: 1}) enumerables = null; +if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor']; + +Function.prototype.overloadSetter = function(usePlural){ + var self = this; + return function(a, b){ + if (a == null) return this; + if (usePlural || typeof a != 'string'){ + for (var k in a) self.call(this, k, a[k]); + if (enumerables) for (var i = enumerables.length; i--;){ + k = enumerables[i]; + if (a.hasOwnProperty(k)) self.call(this, k, a[k]); + } + } else { + self.call(this, a, b); + } + return this; + }; +}; + +Function.prototype.overloadGetter = function(usePlural){ + var self = this; + return function(a){ + var args, result; + if (typeof a != 'string') args = a; + else if (arguments.length > 1) args = arguments; + else if (usePlural) args = [a]; + if (args){ + result = {}; + for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]); + } else { + result = self.call(this, a); + } + return result; + }; +}; + +Function.prototype.extend = function(key, value){ + this[key] = value; +}.overloadSetter(); + +Function.prototype.implement = function(key, value){ + this.prototype[key] = value; +}.overloadSetter(); + +// From + +var slice = Array.prototype.slice; + +Function.from = function(item){ + return (typeOf(item) == 'function') ? item : function(){ + return item; + }; +}; + +Array.from = function(item){ + if (item == null) return []; + return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item]; +}; + +Number.from = function(item){ + var number = parseFloat(item); + return isFinite(number) ? number : null; +}; + +String.from = function(item){ + return item + ''; +}; + +// hide, protect + +Function.implement({ + + hide: function(){ + this.$hidden = true; + return this; + }, + + protect: function(){ + this.$protected = true; + return this; + } + +}); + +// Type + +var Type = this.Type = function(name, object){ + if (name){ + var lower = name.toLowerCase(); + var typeCheck = function(item){ + return (typeOf(item) == lower); + }; + + Type['is' + name] = typeCheck; + if (object != null){ + object.prototype.$family = (function(){ + return lower; + }).hide(); + + } + } + + if (object == null) return null; + + object.extend(this); + object.$constructor = Type; + object.prototype.$constructor = object; + + return object; +}; + +var toString = Object.prototype.toString; + +Type.isEnumerable = function(item){ + return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' ); +}; + +var hooks = {}; + +var hooksOf = function(object){ + var type = typeOf(object.prototype); + return hooks[type] || (hooks[type] = []); +}; + +var implement = function(name, method){ + if (method && method.$hidden) return; + + var hooks = hooksOf(this); + + for (var i = 0; i < hooks.length; i++){ + var hook = hooks[i]; + if (typeOf(hook) == 'type') implement.call(hook, name, method); + else hook.call(this, name, method); + } + + var previous = this.prototype[name]; + if (previous == null || !previous.$protected) this.prototype[name] = method; + + if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){ + return method.apply(item, slice.call(arguments, 1)); + }); +}; + +var extend = function(name, method){ + if (method && method.$hidden) return; + var previous = this[name]; + if (previous == null || !previous.$protected) this[name] = method; +}; + +Type.implement({ + + implement: implement.overloadSetter(), + + extend: extend.overloadSetter(), + + alias: function(name, existing){ + implement.call(this, name, this.prototype[existing]); + }.overloadSetter(), + + mirror: function(hook){ + hooksOf(this).push(hook); + return this; + } + +}); + +new Type('Type', Type); + +// Default Types + +var force = function(name, object, methods){ + var isType = (object != Object), + prototype = object.prototype; + + if (isType) object = new Type(name, object); + + for (var i = 0, l = methods.length; i < l; i++){ + var key = methods[i], + generic = object[key], + proto = prototype[key]; + + if (generic) generic.protect(); + if (isType && proto) object.implement(key, proto.protect()); + } + + if (isType){ + var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]); + object.forEachMethod = function(fn){ + if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){ + fn.call(prototype, prototype[methods[i]], methods[i]); + } + for (var key in prototype) fn.call(prototype, prototype[key], key); + }; + } + + return force; +}; + +force('String', String, [ + 'charAt', 'charCodeAt', 'concat', 'contains', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search', + 'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase' +])('Array', Array, [ + 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', + 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight' +])('Number', Number, [ + 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision' +])('Function', Function, [ + 'apply', 'call', 'bind' +])('RegExp', RegExp, [ + 'exec', 'test' +])('Object', Object, [ + 'create', 'defineProperty', 'defineProperties', 'keys', + 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames', + 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen' +])('Date', Date, ['now']); + +Object.extend = extend.overloadSetter(); + +Date.extend('now', function(){ + return +(new Date); +}); + +new Type('Boolean', Boolean); + +// fixes NaN returning as Number + +Number.prototype.$family = function(){ + return isFinite(this) ? 'number' : 'null'; +}.hide(); + +// Number.random + +Number.extend('random', function(min, max){ + return Math.floor(Math.random() * (max - min + 1) + min); +}); + +// forEach, each + +var hasOwnProperty = Object.prototype.hasOwnProperty; +Object.extend('forEach', function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object); + } +}); + +Object.each = Object.forEach; + +Array.implement({ + + /**/ + forEach: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (i in this) fn.call(bind, this[i], i, this); + } + }, + /**/ + + each: function(fn, bind){ + Array.forEach(this, fn, bind); + return this; + } + +}); + +// Array & Object cloning, Object merging and appending + +var cloneOf = function(item){ + switch (typeOf(item)){ + case 'array': return item.clone(); + case 'object': return Object.clone(item); + default: return item; + } +}; + +Array.implement('clone', function(){ + var i = this.length, clone = new Array(i); + while (i--) clone[i] = cloneOf(this[i]); + return clone; +}); + +var mergeOne = function(source, key, current){ + switch (typeOf(current)){ + case 'object': + if (typeOf(source[key]) == 'object') Object.merge(source[key], current); + else source[key] = Object.clone(current); + break; + case 'array': source[key] = current.clone(); break; + default: source[key] = current; + } + return source; +}; + +Object.extend({ + + merge: function(source, k, v){ + if (typeOf(k) == 'string') return mergeOne(source, k, v); + for (var i = 1, l = arguments.length; i < l; i++){ + var object = arguments[i]; + for (var key in object) mergeOne(source, key, object[key]); + } + return source; + }, + + clone: function(object){ + var clone = {}; + for (var key in object) clone[key] = cloneOf(object[key]); + return clone; + }, + + append: function(original){ + for (var i = 1, l = arguments.length; i < l; i++){ + var extended = arguments[i] || {}; + for (var key in extended) original[key] = extended[key]; + } + return original; + } + +}); + +// Object-less types + +['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){ + new Type(name); +}); + +// Unique ID + +var UID = Date.now(); + +String.extend('uniqueID', function(){ + return (UID++).toString(36); +}); + + + +})(); + + +/* +--- + +name: Array + +description: Contains Array Prototypes like each, contains, and erase. + +license: MIT-style license. + +requires: [Type] + +provides: Array + +... +*/ + +Array.implement({ + + /**/ + every: function(fn, bind){ + for (var i = 0, l = this.length >>> 0; i < l; i++){ + if ((i in this) && !fn.call(bind, this[i], i, this)) return false; + } + return true; + }, + + filter: function(fn, bind){ + var results = []; + for (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){ + value = this[i]; + if (fn.call(bind, value, i, this)) results.push(value); + } + return results; + }, + + indexOf: function(item, from){ + var length = this.length >>> 0; + for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){ + if (this[i] === item) return i; + } + return -1; + }, + + map: function(fn, bind){ + var length = this.length >>> 0, results = Array(length); + for (var i = 0; i < length; i++){ + if (i in this) results[i] = fn.call(bind, this[i], i, this); + } + return results; + }, + + some: function(fn, bind){ + for (var i = 0, l = this.length >>> 0; i < l; i++){ + if ((i in this) && fn.call(bind, this[i], i, this)) return true; + } + return false; + }, + /**/ + + clean: function(){ + return this.filter(function(item){ + return item != null; + }); + }, + + invoke: function(methodName){ + var args = Array.slice(arguments, 1); + return this.map(function(item){ + return item[methodName].apply(item, args); + }); + }, + + associate: function(keys){ + var obj = {}, length = Math.min(this.length, keys.length); + for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; + return obj; + }, + + link: function(object){ + var result = {}; + for (var i = 0, l = this.length; i < l; i++){ + for (var key in object){ + if (object[key](this[i])){ + result[key] = this[i]; + delete object[key]; + break; + } + } + } + return result; + }, + + contains: function(item, from){ + return this.indexOf(item, from) != -1; + }, + + append: function(array){ + this.push.apply(this, array); + return this; + }, + + getLast: function(){ + return (this.length) ? this[this.length - 1] : null; + }, + + getRandom: function(){ + return (this.length) ? this[Number.random(0, this.length - 1)] : null; + }, + + include: function(item){ + if (!this.contains(item)) this.push(item); + return this; + }, + + combine: function(array){ + for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); + return this; + }, + + erase: function(item){ + for (var i = this.length; i--;){ + if (this[i] === item) this.splice(i, 1); + } + return this; + }, + + empty: function(){ + this.length = 0; + return this; + }, + + flatten: function(){ + var array = []; + for (var i = 0, l = this.length; i < l; i++){ + var type = typeOf(this[i]); + if (type == 'null') continue; + array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]); + } + return array; + }, + + pick: function(){ + for (var i = 0, l = this.length; i < l; i++){ + if (this[i] != null) return this[i]; + } + return null; + }, + + hexToRgb: function(array){ + if (this.length != 3) return null; + var rgb = this.map(function(value){ + if (value.length == 1) value += value; + return parseInt(value, 16); + }); + return (array) ? rgb : 'rgb(' + rgb + ')'; + }, + + rgbToHex: function(array){ + if (this.length < 3) return null; + if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; + var hex = []; + for (var i = 0; i < 3; i++){ + var bit = (this[i] - 0).toString(16); + hex.push((bit.length == 1) ? '0' + bit : bit); + } + return (array) ? hex : '#' + hex.join(''); + } + +}); + + + + +/* +--- + +name: String + +description: Contains String Prototypes like camelCase, capitalize, test, and toInt. + +license: MIT-style license. + +requires: [Type, Array] + +provides: String + +... +*/ + +String.implement({ + + // + contains: function(string, index){ + return (index ? String(this).slice(index) : String(this)).indexOf(string) > -1; + }, + // + + test: function(regex, params){ + return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this); + }, + + trim: function(){ + return String(this).replace(/^\s+|\s+$/g, ''); + }, + + clean: function(){ + return String(this).replace(/\s+/g, ' ').trim(); + }, + + camelCase: function(){ + return String(this).replace(/-\D/g, function(match){ + return match.charAt(1).toUpperCase(); + }); + }, + + hyphenate: function(){ + return String(this).replace(/[A-Z]/g, function(match){ + return ('-' + match.charAt(0).toLowerCase()); + }); + }, + + capitalize: function(){ + return String(this).replace(/\b[a-z]/g, function(match){ + return match.toUpperCase(); + }); + }, + + escapeRegExp: function(){ + return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + hexToRgb: function(array){ + var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); + return (hex) ? hex.slice(1).hexToRgb(array) : null; + }, + + rgbToHex: function(array){ + var rgb = String(this).match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHex(array) : null; + }, + + substitute: function(object, regexp){ + return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ + if (match.charAt(0) == '\\') return match.slice(1); + return (object[name] != null) ? object[name] : ''; + }); + } + +}); + + + + +/* +--- + +name: Number + +description: Contains Number Prototypes like limit, round, times, and ceil. + +license: MIT-style license. + +requires: Type + +provides: Number + +... +*/ + +Number.implement({ + + limit: function(min, max){ + return Math.min(max, Math.max(min, this)); + }, + + round: function(precision){ + precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0); + return Math.round(this * precision) / precision; + }, + + times: function(fn, bind){ + for (var i = 0; i < this; i++) fn.call(bind, i, this); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + } + +}); + +Number.alias('each', 'times'); + +(function(math){ + var methods = {}; + math.each(function(name){ + if (!Number[name]) methods[name] = function(){ + return Math[name].apply(null, [this].concat(Array.from(arguments))); + }; + }); + Number.implement(methods); +})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); + + +/* +--- + +name: Function + +description: Contains Function Prototypes like create, bind, pass, and delay. + +license: MIT-style license. + +requires: Type + +provides: Function + +... +*/ + +Function.extend({ + + attempt: function(){ + for (var i = 0, l = arguments.length; i < l; i++){ + try { + return arguments[i](); + } catch (e){} + } + return null; + } + +}); + +Function.implement({ + + attempt: function(args, bind){ + try { + return this.apply(bind, Array.from(args)); + } catch (e){} + + return null; + }, + + /**/ + bind: function(that){ + var self = this, + args = arguments.length > 1 ? Array.slice(arguments, 1) : null, + F = function(){}; + + var bound = function(){ + var context = that, length = arguments.length; + if (this instanceof bound){ + F.prototype = self.prototype; + context = new F; + } + var result = (!args && !length) + ? self.call(context) + : self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments); + return context == that ? result : context; + }; + return bound; + }, + /**/ + + pass: function(args, bind){ + var self = this; + if (args != null) args = Array.from(args); + return function(){ + return self.apply(bind, args || arguments); + }; + }, + + delay: function(delay, bind, args){ + return setTimeout(this.pass((args == null ? [] : args), bind), delay); + }, + + periodical: function(periodical, bind, args){ + return setInterval(this.pass((args == null ? [] : args), bind), periodical); + } + +}); + + + + +/* +--- + +name: Object + +description: Object generic methods + +license: MIT-style license. + +requires: Type + +provides: [Object, Hash] + +... +*/ + +(function(){ + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +Object.extend({ + + subset: function(object, keys){ + var results = {}; + for (var i = 0, l = keys.length; i < l; i++){ + var k = keys[i]; + if (k in object) results[k] = object[k]; + } + return results; + }, + + map: function(object, fn, bind){ + var results = {}; + for (var key in object){ + if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object); + } + return results; + }, + + filter: function(object, fn, bind){ + var results = {}; + for (var key in object){ + var value = object[key]; + if (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value; + } + return results; + }, + + every: function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false; + } + return true; + }, + + some: function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true; + } + return false; + }, + + keys: function(object){ + var keys = []; + for (var key in object){ + if (hasOwnProperty.call(object, key)) keys.push(key); + } + return keys; + }, + + values: function(object){ + var values = []; + for (var key in object){ + if (hasOwnProperty.call(object, key)) values.push(object[key]); + } + return values; + }, + + getLength: function(object){ + return Object.keys(object).length; + }, + + keyOf: function(object, value){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && object[key] === value) return key; + } + return null; + }, + + contains: function(object, value){ + return Object.keyOf(object, value) != null; + }, + + toQueryString: function(object, base){ + var queryString = []; + + Object.each(object, function(value, key){ + if (base) key = base + '[' + key + ']'; + var result; + switch (typeOf(value)){ + case 'object': result = Object.toQueryString(value, key); break; + case 'array': + var qs = {}; + value.each(function(val, i){ + qs[i] = val; + }); + result = Object.toQueryString(qs, key); + break; + default: result = key + '=' + encodeURIComponent(value); + } + if (value != null) queryString.push(result); + }); + + return queryString.join('&'); + } + +}); + +})(); + + + + +/* +--- + +name: Browser + +description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash. + +license: MIT-style license. + +requires: [Array, Function, Number, String] + +provides: [Browser, Window, Document] + +... +*/ + +(function(){ + +var document = this.document; +var window = document.window = this; + +var parse = function(ua, platform){ + ua = ua.toLowerCase(); + platform = (platform ? platform.toLowerCase() : ''); + + var UA = ua.match(/(opera|ie|firefox|chrome|trident|crios|version)[\s\/:]([\w\d\.]+)?.*?(safari|(?:rv[\s\/:]|version[\s\/:])([\w\d\.]+)|$)/) || [null, 'unknown', 0]; + + if (UA[1] == 'trident'){ + UA[1] = 'ie'; + if (UA[4]) UA[2] = UA[4]; + } else if (UA[1] == 'crios') { + UA[1] = 'chrome'; + } + + var platform = ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]; + if (platform == 'win') platform = 'windows'; + + return { + extend: Function.prototype.extend, + name: (UA[1] == 'version') ? UA[3] : UA[1], + version: parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]), + platform: platform + }; +}; + +var Browser = this.Browser = parse(navigator.userAgent, navigator.platform); + +if (Browser.ie){ + Browser.version = document.documentMode; +} + +Browser.extend({ + Features: { + xpath: !!(document.evaluate), + air: !!(window.runtime), + query: !!(document.querySelector), + json: !!(window.JSON) + }, + parseUA: parse +}); + + + +// Request + +Browser.Request = (function(){ + + var XMLHTTP = function(){ + return new XMLHttpRequest(); + }; + + var MSXML2 = function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }; + + var MSXML = function(){ + return new ActiveXObject('Microsoft.XMLHTTP'); + }; + + return Function.attempt(function(){ + XMLHTTP(); + return XMLHTTP; + }, function(){ + MSXML2(); + return MSXML2; + }, function(){ + MSXML(); + return MSXML; + }); + +})(); + +Browser.Features.xhr = !!(Browser.Request); + + + +// String scripts + +Browser.exec = function(text){ + if (!text) return text; + if (window.execScript){ + window.execScript(text); + } else { + var script = document.createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.text = text; + document.head.appendChild(script); + document.head.removeChild(script); + } + return text; +}; + +String.implement('stripScripts', function(exec){ + var scripts = ''; + var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(all, code){ + scripts += code + '\n'; + return ''; + }); + if (exec === true) Browser.exec(scripts); + else if (typeOf(exec) == 'function') exec(scripts, text); + return text; +}); + +// Window, Document + +Browser.extend({ + Document: this.Document, + Window: this.Window, + Element: this.Element, + Event: this.Event +}); + +this.Window = this.$constructor = new Type('Window', function(){}); + +this.$family = Function.from('window').hide(); + +Window.mirror(function(name, method){ + window[name] = method; +}); + +this.Document = document.$constructor = new Type('Document', function(){}); + +document.$family = Function.from('document').hide(); + +Document.mirror(function(name, method){ + document[name] = method; +}); + +document.html = document.documentElement; +if (!document.head) document.head = document.getElementsByTagName('head')[0]; + +if (document.execCommand) try { + document.execCommand("BackgroundImageCache", false, true); +} catch (e){} + +/**/ +if (this.attachEvent && !this.addEventListener){ + var unloadEvent = function(){ + this.detachEvent('onunload', unloadEvent); + document.head = document.html = document.window = null; + }; + this.attachEvent('onunload', unloadEvent); +} + +// IE fails on collections and ) +var arrayFrom = Array.from; +try { + arrayFrom(document.html.childNodes); +} catch(e){ + Array.from = function(item){ + if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){ + var i = item.length, array = new Array(i); + while (i--) array[i] = item[i]; + return array; + } + return arrayFrom(item); + }; + + var prototype = Array.prototype, + slice = prototype.slice; + ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){ + var method = prototype[name]; + Array[name] = function(item){ + return method.apply(Array.from(item), slice.call(arguments, 1)); + }; + }); +} +/**/ + + + +})(); + + +/* +--- + +name: Event + +description: Contains the Event Type, to make the event object cross-browser. + +license: MIT-style license. + +requires: [Window, Document, Array, Function, String, Object] + +provides: Event + +... +*/ + +(function() { + +var _keys = {}; + +var DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){ + if (!win) win = window; + event = event || win.event; + if (event.$extended) return event; + this.event = event; + this.$extended = true; + this.shift = event.shiftKey; + this.control = event.ctrlKey; + this.alt = event.altKey; + this.meta = event.metaKey; + var type = this.type = event.type; + var target = event.target || event.srcElement; + while (target && target.nodeType == 3) target = target.parentNode; + this.target = document.id(target); + + if (type.indexOf('key') == 0){ + var code = this.code = (event.which || event.keyCode); + this.key = _keys[code]; + if (type == 'keydown' || type == 'keyup'){ + if (code > 111 && code < 124) this.key = 'f' + (code - 111); + else if (code > 95 && code < 106) this.key = code - 96; + } + if (this.key == null) this.key = String.fromCharCode(code).toLowerCase(); + } else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){ + var doc = win.document; + doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; + this.page = { + x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft, + y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop + }; + this.client = { + x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX, + y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY + }; + if (type == 'DOMMouseScroll' || type == 'mousewheel') + this.wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; + + this.rightClick = (event.which == 3 || event.button == 2); + if (type == 'mouseover' || type == 'mouseout'){ + var related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']; + while (related && related.nodeType == 3) related = related.parentNode; + this.relatedTarget = document.id(related); + } + } else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){ + this.rotation = event.rotation; + this.scale = event.scale; + this.targetTouches = event.targetTouches; + this.changedTouches = event.changedTouches; + var touches = this.touches = event.touches; + if (touches && touches[0]){ + var touch = touches[0]; + this.page = {x: touch.pageX, y: touch.pageY}; + this.client = {x: touch.clientX, y: touch.clientY}; + } + } + + if (!this.client) this.client = {}; + if (!this.page) this.page = {}; +}); + +DOMEvent.implement({ + + stop: function(){ + return this.preventDefault().stopPropagation(); + }, + + stopPropagation: function(){ + if (this.event.stopPropagation) this.event.stopPropagation(); + else this.event.cancelBubble = true; + return this; + }, + + preventDefault: function(){ + if (this.event.preventDefault) this.event.preventDefault(); + else this.event.returnValue = false; + return this; + } + +}); + +DOMEvent.defineKey = function(code, key){ + _keys[code] = key; + return this; +}; + +DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true); + +DOMEvent.defineKeys({ + '38': 'up', '40': 'down', '37': 'left', '39': 'right', + '27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab', + '46': 'delete', '13': 'enter' +}); + +})(); + + + + + + +/* +--- + +name: Class + +description: Contains the Class Function for easily creating, extending, and implementing reusable Classes. + +license: MIT-style license. + +requires: [Array, String, Function, Number] + +provides: Class + +... +*/ + +(function(){ + +var Class = this.Class = new Type('Class', function(params){ + if (instanceOf(params, Function)) params = {initialize: params}; + + var newClass = function(){ + reset(this); + if (newClass.$prototyping) return this; + this.$caller = null; + var value = (this.initialize) ? this.initialize.apply(this, arguments) : this; + this.$caller = this.caller = null; + return value; + }.extend(this).implement(params); + + newClass.$constructor = Class; + newClass.prototype.$constructor = newClass; + newClass.prototype.parent = parent; + + return newClass; +}); + +var parent = function(){ + if (!this.$caller) throw new Error('The method "parent" cannot be called.'); + var name = this.$caller.$name, + parent = this.$caller.$owner.parent, + previous = (parent) ? parent.prototype[name] : null; + if (!previous) throw new Error('The method "' + name + '" has no parent.'); + return previous.apply(this, arguments); +}; + +var reset = function(object){ + for (var key in object){ + var value = object[key]; + switch (typeOf(value)){ + case 'object': + var F = function(){}; + F.prototype = value; + object[key] = reset(new F); + break; + case 'array': object[key] = value.clone(); break; + } + } + return object; +}; + +var wrap = function(self, key, method){ + if (method.$origin) method = method.$origin; + var wrapper = function(){ + if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.'); + var caller = this.caller, current = this.$caller; + this.caller = current; this.$caller = wrapper; + var result = method.apply(this, arguments); + this.$caller = current; this.caller = caller; + return result; + }.extend({$owner: self, $origin: method, $name: key}); + return wrapper; +}; + +var implement = function(key, value, retain){ + if (Class.Mutators.hasOwnProperty(key)){ + value = Class.Mutators[key].call(this, value); + if (value == null) return this; + } + + if (typeOf(value) == 'function'){ + if (value.$hidden) return this; + this.prototype[key] = (retain) ? value : wrap(this, key, value); + } else { + Object.merge(this.prototype, key, value); + } + + return this; +}; + +var getInstance = function(klass){ + klass.$prototyping = true; + var proto = new klass; + delete klass.$prototyping; + return proto; +}; + +Class.implement('implement', implement.overloadSetter()); + +Class.Mutators = { + + Extends: function(parent){ + this.parent = parent; + this.prototype = getInstance(parent); + }, + + Implements: function(items){ + Array.from(items).each(function(item){ + var instance = new item; + for (var key in instance) implement.call(this, key, instance[key], true); + }, this); + } +}; + +})(); + + +/* +--- + +name: Class.Extras + +description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. + +license: MIT-style license. + +requires: Class + +provides: [Class.Extras, Chain, Events, Options] + +... +*/ + +(function(){ + +this.Chain = new Class({ + + $chain: [], + + chain: function(){ + this.$chain.append(Array.flatten(arguments)); + return this; + }, + + callChain: function(){ + return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; + }, + + clearChain: function(){ + this.$chain.empty(); + return this; + } + +}); + +var removeOn = function(string){ + return string.replace(/^on([A-Z])/, function(full, first){ + return first.toLowerCase(); + }); +}; + +this.Events = new Class({ + + $events: {}, + + addEvent: function(type, fn, internal){ + type = removeOn(type); + + + + this.$events[type] = (this.$events[type] || []).include(fn); + if (internal) fn.internal = true; + return this; + }, + + addEvents: function(events){ + for (var type in events) this.addEvent(type, events[type]); + return this; + }, + + fireEvent: function(type, args, delay){ + type = removeOn(type); + var events = this.$events[type]; + if (!events) return this; + args = Array.from(args); + events.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + removeEvent: function(type, fn){ + type = removeOn(type); + var events = this.$events[type]; + if (events && !fn.internal){ + var index = events.indexOf(fn); + if (index != -1) delete events[index]; + } + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + if (events) events = removeOn(events); + for (type in this.$events){ + if (events && events != type) continue; + var fns = this.$events[type]; + for (var i = fns.length; i--;) if (i in fns){ + this.removeEvent(type, fns[i]); + } + } + return this; + } + +}); + +this.Options = new Class({ + + setOptions: function(){ + var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments)); + if (this.addEvent) for (var option in options){ + if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; + this.addEvent(option, options[option]); + delete options[option]; + } + return this; + } + +}); + +})(); + + +/* +--- +name: Slick.Parser +description: Standalone CSS3 Selector parser +provides: Slick.Parser +... +*/ + +;(function(){ + +var parsed, + separatorIndex, + combinatorIndex, + reversed, + cache = {}, + reverseCache = {}, + reUnescape = /\\/g; + +var parse = function(expression, isReversed){ + if (expression == null) return null; + if (expression.Slick === true) return expression; + expression = ('' + expression).replace(/^\s+|\s+$/g, ''); + reversed = !!isReversed; + var currentCache = (reversed) ? reverseCache : cache; + if (currentCache[expression]) return currentCache[expression]; + parsed = { + Slick: true, + expressions: [], + raw: expression, + reverse: function(){ + return parse(this.raw, true); + } + }; + separatorIndex = -1; + while (expression != (expression = expression.replace(regexp, parser))); + parsed.length = parsed.expressions.length; + return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed; +}; + +var reverseCombinator = function(combinator){ + if (combinator === '!') return ' '; + else if (combinator === ' ') return '!'; + else if ((/^!/).test(combinator)) return combinator.replace(/^!/, ''); + else return '!' + combinator; +}; + +var reverse = function(expression){ + var expressions = expression.expressions; + for (var i = 0; i < expressions.length; i++){ + var exp = expressions[i]; + var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)}; + + for (var j = 0; j < exp.length; j++){ + var cexp = exp[j]; + if (!cexp.reverseCombinator) cexp.reverseCombinator = ' '; + cexp.combinator = cexp.reverseCombinator; + delete cexp.reverseCombinator; + } + + exp.reverse().push(last); + } + return expression; +}; + +var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan MIT License + return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){ + return '\\' + match; + }); +}; + +var regexp = new RegExp( +/* +#!/usr/bin/env ruby +puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'') +__END__ + "(?x)^(?:\ + \\s* ( , ) \\s* # Separator \n\ + | \\s* ( + ) \\s* # Combinator \n\ + | ( \\s+ ) # CombinatorChildren \n\ + | ( + | \\* ) # Tag \n\ + | \\# ( + ) # ID \n\ + | \\. ( + ) # ClassName \n\ + | # Attribute \n\ + \\[ \ + \\s* (+) (?: \ + \\s* ([*^$!~|]?=) (?: \ + \\s* (?:\ + ([\"']?)(.*?)\\9 \ + )\ + ) \ + )? \\s* \ + \\](?!\\]) \n\ + | :+ ( + )(?:\ + \\( (?:\ + (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\ + ) \\)\ + )?\ + )" +*/ + "^(?:\\s*(,)\\s*|\\s*(+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)" + .replace(//, '[' + escapeRegExp(">+~`!@$%^&={}\\;/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') + .replace(//g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') +); + +function parser( + rawMatch, + + separator, + combinator, + combinatorChildren, + + tagName, + id, + className, + + attributeKey, + attributeOperator, + attributeQuote, + attributeValue, + + pseudoMarker, + pseudoClass, + pseudoQuote, + pseudoClassQuotedValue, + pseudoClassValue +){ + if (separator || separatorIndex === -1){ + parsed.expressions[++separatorIndex] = []; + combinatorIndex = -1; + if (separator) return ''; + } + + if (combinator || combinatorChildren || combinatorIndex === -1){ + combinator = combinator || ' '; + var currentSeparator = parsed.expressions[separatorIndex]; + if (reversed && currentSeparator[combinatorIndex]) + currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator); + currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'}; + } + + var currentParsed = parsed.expressions[separatorIndex][combinatorIndex]; + + if (tagName){ + currentParsed.tag = tagName.replace(reUnescape, ''); + + } else if (id){ + currentParsed.id = id.replace(reUnescape, ''); + + } else if (className){ + className = className.replace(reUnescape, ''); + + if (!currentParsed.classList) currentParsed.classList = []; + if (!currentParsed.classes) currentParsed.classes = []; + currentParsed.classList.push(className); + currentParsed.classes.push({ + value: className, + regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)') + }); + + } else if (pseudoClass){ + pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue; + pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null; + + if (!currentParsed.pseudos) currentParsed.pseudos = []; + currentParsed.pseudos.push({ + key: pseudoClass.replace(reUnescape, ''), + value: pseudoClassValue, + type: pseudoMarker.length == 1 ? 'class' : 'element' + }); + + } else if (attributeKey){ + attributeKey = attributeKey.replace(reUnescape, ''); + attributeValue = (attributeValue || '').replace(reUnescape, ''); + + var test, regexp; + + switch (attributeOperator){ + case '^=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) ); break; + case '$=' : regexp = new RegExp( escapeRegExp(attributeValue) +'$' ); break; + case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break; + case '|=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) +'(-|$)' ); break; + case '=' : test = function(value){ + return attributeValue == value; + }; break; + case '*=' : test = function(value){ + return value && value.indexOf(attributeValue) > -1; + }; break; + case '!=' : test = function(value){ + return attributeValue != value; + }; break; + default : test = function(value){ + return !!value; + }; + } + + if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){ + return false; + }; + + if (!test) test = function(value){ + return value && regexp.test(value); + }; + + if (!currentParsed.attributes) currentParsed.attributes = []; + currentParsed.attributes.push({ + key: attributeKey, + operator: attributeOperator, + value: attributeValue, + test: test + }); + + } + + return ''; +}; + +// Slick NS + +var Slick = (this.Slick || {}); + +Slick.parse = function(expression){ + return parse(expression); +}; + +Slick.escapeRegExp = escapeRegExp; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- +name: Slick.Finder +description: The new, superfast css selector engine. +provides: Slick.Finder +requires: Slick.Parser +... +*/ + +;(function(){ + +var local = {}, + featuresCache = {}, + toString = Object.prototype.toString; + +// Feature / Bug detection + +local.isNativeCode = function(fn){ + return (/\{\s*\[native code\]\s*\}/).test('' + fn); +}; + +local.isXML = function(document){ + return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') || + (document.nodeType == 9 && document.documentElement.nodeName != 'HTML'); +}; + +local.setDocument = function(document){ + + // convert elements / window arguments to document. if document cannot be extrapolated, the function returns. + var nodeType = document.nodeType; + if (nodeType == 9); // document + else if (nodeType) document = document.ownerDocument; // node + else if (document.navigator) document = document.document; // window + else return; + + // check if it's the old document + + if (this.document === document) return; + this.document = document; + + // check if we have done feature detection on this document before + + var root = document.documentElement, + rootUid = this.getUIDXML(root), + features = featuresCache[rootUid], + feature; + + if (features){ + for (feature in features){ + this[feature] = features[feature]; + } + return; + } + + features = featuresCache[rootUid] = {}; + + features.root = root; + features.isXMLDocument = this.isXML(document); + + features.brokenStarGEBTN + = features.starSelectsClosedQSA + = features.idGetsName + = features.brokenMixedCaseQSA + = features.brokenGEBCN + = features.brokenCheckedQSA + = features.brokenEmptyAttributeQSA + = features.isHTMLDocument + = features.nativeMatchesSelector + = false; + + var starSelectsClosed, starSelectsComments, + brokenSecondClassNameGEBCN, cachedGetElementsByClassName, + brokenFormAttributeGetter; + + var selected, id = 'slick_uniqueid'; + var testNode = document.createElement('div'); + + var testRoot = document.body || document.getElementsByTagName('body')[0] || root; + testRoot.appendChild(testNode); + + // on non-HTML documents innerHTML and getElementsById doesnt work properly + try { + testNode.innerHTML = ''; + features.isHTMLDocument = !!document.getElementById(id); + } catch(e){}; + + if (features.isHTMLDocument){ + + testNode.style.display = 'none'; + + // IE returns comment nodes for getElementsByTagName('*') for some documents + testNode.appendChild(document.createComment('')); + starSelectsComments = (testNode.getElementsByTagName('*').length > 1); + + // IE returns closed nodes (EG:"") for getElementsByTagName('*') for some documents + try { + testNode.innerHTML = 'foo'; + selected = testNode.getElementsByTagName('*'); + starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + features.brokenStarGEBTN = starSelectsComments || starSelectsClosed; + + // IE returns elements with the name instead of just id for getElementsById for some documents + try { + testNode.innerHTML = ''; + features.idGetsName = document.getElementById(id) === testNode.firstChild; + } catch(e){}; + + if (testNode.getElementsByClassName){ + + // Safari 3.2 getElementsByClassName caches results + try { + testNode.innerHTML = ''; + testNode.getElementsByClassName('b').length; + testNode.firstChild.className = 'b'; + cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2); + } catch(e){}; + + // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one + try { + testNode.innerHTML = ''; + brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2); + } catch(e){}; + + features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN; + } + + if (testNode.querySelectorAll){ + // IE 8 returns closed nodes (EG:"") for querySelectorAll('*') for some documents + try { + testNode.innerHTML = 'foo'; + selected = testNode.querySelectorAll('*'); + features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode + try { + testNode.innerHTML = ''; + features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length; + } catch(e){}; + + // Webkit and Opera dont return selected options on querySelectorAll + try { + testNode.innerHTML = ''; + features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0); + } catch(e){}; + + // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll + try { + testNode.innerHTML = ''; + features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0); + } catch(e){}; + + } + + // IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input + try { + testNode.innerHTML = '
          '; + brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's'); + } catch(e){}; + + // native matchesSelector function + + features.nativeMatchesSelector = root.matches || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector; + if (features.nativeMatchesSelector) try { + // if matchesSelector trows errors on incorrect sintaxes we can use it + features.nativeMatchesSelector.call(root, ':slick'); + features.nativeMatchesSelector = null; + } catch(e){}; + + } + + try { + root.slick_expando = 1; + delete root.slick_expando; + features.getUID = this.getUIDHTML; + } catch(e) { + features.getUID = this.getUIDXML; + } + + testRoot.removeChild(testNode); + testNode = selected = testRoot = null; + + // getAttribute + + features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){ + var method = this.attributeGetters[name]; + if (method) return method.call(node); + var attributeNode = node.getAttributeNode(name); + return (attributeNode) ? attributeNode.nodeValue : null; + } : function(node, name){ + var method = this.attributeGetters[name]; + return (method) ? method.call(node) : node.getAttribute(name); + }; + + // hasAttribute + + features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) { + return node.hasAttribute(attribute); + } : function(node, attribute) { + node = node.getAttributeNode(attribute); + return !!(node && (node.specified || node.nodeValue)); + }; + + // contains + // FIXME: Add specs: local.contains should be different for xml and html documents? + var nativeRootContains = root && this.isNativeCode(root.contains), + nativeDocumentContains = document && this.isNativeCode(document.contains); + + features.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){ + return context.contains(node); + } : (nativeRootContains && !nativeDocumentContains) ? function(context, node){ + // IE8 does not have .contains on document. + return context === node || ((context === document) ? document.documentElement : context).contains(node); + } : (root && root.compareDocumentPosition) ? function(context, node){ + return context === node || !!(context.compareDocumentPosition(node) & 16); + } : function(context, node){ + if (node) do { + if (node === context) return true; + } while ((node = node.parentNode)); + return false; + }; + + // document order sorting + // credits to Sizzle (http://sizzlejs.com/) + + features.documentSorter = (root.compareDocumentPosition) ? function(a, b){ + if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0; + return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + } : ('sourceIndex' in root) ? function(a, b){ + if (!a.sourceIndex || !b.sourceIndex) return 0; + return a.sourceIndex - b.sourceIndex; + } : (document.createRange) ? function(a, b){ + if (!a.ownerDocument || !b.ownerDocument) return 0; + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + return aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + } : null ; + + root = null; + + for (feature in features){ + this[feature] = features[feature]; + } +}; + +// Main Method + +var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/, + reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/, + qsaFailExpCache = {}; + +local.search = function(context, expression, append, first){ + + var found = this.found = (first) ? null : (append || []); + + if (!context) return found; + else if (context.navigator) context = context.document; // Convert the node from a window to a document + else if (!context.nodeType) return found; + + // setup + + var parsed, i, + uniques = this.uniques = {}, + hasOthers = !!(append && append.length), + contextIsDocument = (context.nodeType == 9); + + if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context); + + // avoid duplicating items already in the append array + if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true; + + // expression checks + + if (typeof expression == 'string'){ // expression is a string + + /**/ + var simpleSelector = expression.match(reSimpleSelector); + simpleSelectors: if (simpleSelector) { + + var symbol = simpleSelector[1], + name = simpleSelector[2], + node, nodes; + + if (!symbol){ + + if (name == '*' && this.brokenStarGEBTN) break simpleSelectors; + nodes = context.getElementsByTagName(name); + if (first) return nodes[0] || null; + for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + + } else if (symbol == '#'){ + + if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors; + node = context.getElementById(name); + if (!node) return found; + if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors; + if (first) return node || null; + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + + } else if (symbol == '.'){ + + if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors; + if (context.getElementsByClassName && !this.brokenGEBCN){ + nodes = context.getElementsByClassName(name); + if (first) return nodes[0] || null; + for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + } else { + var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)'); + nodes = context.getElementsByTagName('*'); + for (i = 0; node = nodes[i++];){ + className = node.className; + if (!(className && matchClass.test(className))) continue; + if (first) return node; + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + } + + } + + if (hasOthers) this.sort(found); + return (first) ? null : found; + + } + /**/ + + /**/ + querySelector: if (context.querySelectorAll) { + + if (!this.isHTMLDocument + || qsaFailExpCache[expression] + //TODO: only skip when expression is actually mixed case + || this.brokenMixedCaseQSA + || (this.brokenCheckedQSA && expression.indexOf(':checked') > -1) + || (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) + || (!contextIsDocument //Abort when !contextIsDocument and... + // there are multiple expressions in the selector + // since we currently only fix non-document rooted QSA for single expression selectors + && expression.indexOf(',') > -1 + ) + || Slick.disableQSA + ) break querySelector; + + var _expression = expression, _context = context; + if (!contextIsDocument){ + // non-document rooted QSA + // credits to Andrew Dupont + var currentId = _context.getAttribute('id'), slickid = 'slickid__'; + _context.setAttribute('id', slickid); + _expression = '#' + slickid + ' ' + _expression; + context = _context.parentNode; + } + + try { + if (first) return context.querySelector(_expression) || null; + else nodes = context.querySelectorAll(_expression); + } catch(e) { + qsaFailExpCache[expression] = 1; + break querySelector; + } finally { + if (!contextIsDocument){ + if (currentId) _context.setAttribute('id', currentId); + else _context.removeAttribute('id'); + context = _context; + } + } + + if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){ + if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node); + } else for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + + if (hasOthers) this.sort(found); + return found; + + } + /**/ + + parsed = this.Slick.parse(expression); + if (!parsed.length) return found; + } else if (expression == null){ // there is no expression + return found; + } else if (expression.Slick){ // expression is a parsed Slick object + parsed = expression; + } else if (this.contains(context.documentElement || context, expression)){ // expression is a node + (found) ? found.push(expression) : found = expression; + return found; + } else { // other junk + return found; + } + + /**//**/ + + // cache elements for the nth selectors + + this.posNTH = {}; + this.posNTHLast = {}; + this.posNTHType = {}; + this.posNTHTypeLast = {}; + + /**//**/ + + // if append is null and there is only a single selector with one expression use pushArray, else use pushUID + this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID; + + if (found == null) found = []; + + // default engine + + var j, m, n; + var combinator, tag, id, classList, classes, attributes, pseudos; + var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions; + + search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){ + + combinator = 'combinator:' + currentBit.combinator; + if (!this[combinator]) continue search; + + tag = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase(); + id = currentBit.id; + classList = currentBit.classList; + classes = currentBit.classes; + attributes = currentBit.attributes; + pseudos = currentBit.pseudos; + lastBit = (j === (currentExpression.length - 1)); + + this.bitUniques = {}; + + if (lastBit){ + this.uniques = uniques; + this.found = found; + } else { + this.uniques = {}; + this.found = []; + } + + if (j === 0){ + this[combinator](context, tag, id, classes, attributes, pseudos, classList); + if (first && lastBit && found.length) break search; + } else { + if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){ + this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + if (found.length) break search; + } else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + } + + currentItems = this.found; + } + + // should sort if there are nodes in append and if you pass multiple expressions. + if (hasOthers || (parsed.expressions.length > 1)) this.sort(found); + + return (first) ? (found[0] || null) : found; +}; + +// Utils + +local.uidx = 1; +local.uidk = 'slick-uniqueid'; + +local.getUIDXML = function(node){ + var uid = node.getAttribute(this.uidk); + if (!uid){ + uid = this.uidx++; + node.setAttribute(this.uidk, uid); + } + return uid; +}; + +local.getUIDHTML = function(node){ + return node.uniqueNumber || (node.uniqueNumber = this.uidx++); +}; + +// sort based on the setDocument documentSorter method. + +local.sort = function(results){ + if (!this.documentSorter) return results; + results.sort(this.documentSorter); + return results; +}; + +/**//**/ + +local.cacheNTH = {}; + +local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/; + +local.parseNTHArgument = function(argument){ + var parsed = argument.match(this.matchNTH); + if (!parsed) return false; + var special = parsed[2] || false; + var a = parsed[1] || 1; + if (a == '-') a = -1; + var b = +parsed[3] || 0; + parsed = + (special == 'n') ? {a: a, b: b} : + (special == 'odd') ? {a: 2, b: 1} : + (special == 'even') ? {a: 2, b: 0} : {a: 0, b: a}; + + return (this.cacheNTH[argument] = parsed); +}; + +local.createNTHPseudo = function(child, sibling, positions, ofType){ + return function(node, argument){ + var uid = this.getUID(node); + if (!this[positions][uid]){ + var parent = node.parentNode; + if (!parent) return false; + var el = parent[child], count = 1; + if (ofType){ + var nodeName = node.nodeName; + do { + if (el.nodeName != nodeName) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } else { + do { + if (el.nodeType != 1) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } + } + argument = argument || 'n'; + var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument); + if (!parsed) return false; + var a = parsed.a, b = parsed.b, pos = this[positions][uid]; + if (a == 0) return b == pos; + if (a > 0){ + if (pos < b) return false; + } else { + if (b < pos) return false; + } + return ((pos - b) % a) == 0; + }; +}; + +/**//**/ + +local.pushArray = function(node, tag, id, classes, attributes, pseudos){ + if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node); +}; + +local.pushUID = function(node, tag, id, classes, attributes, pseudos){ + var uid = this.getUID(node); + if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){ + this.uniques[uid] = true; + this.found.push(node); + } +}; + +local.matchNode = function(node, selector){ + if (this.isHTMLDocument && this.nativeMatchesSelector){ + try { + return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]')); + } catch(matchError) {} + } + + var parsed = this.Slick.parse(selector); + if (!parsed) return true; + + // simple (single) selectors + var expressions = parsed.expressions, simpleExpCounter = 0, i; + for (i = 0; (currentExpression = expressions[i]); i++){ + if (currentExpression.length == 1){ + var exp = currentExpression[0]; + if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true; + simpleExpCounter++; + } + } + + if (simpleExpCounter == parsed.length) return false; + + var nodes = this.search(this.document, parsed), item; + for (i = 0; item = nodes[i++];){ + if (item === node) return true; + } + return false; +}; + +local.matchPseudo = function(node, name, argument){ + var pseudoName = 'pseudo:' + name; + if (this[pseudoName]) return this[pseudoName](node, argument); + var attribute = this.getAttribute(node, name); + return (argument) ? argument == attribute : !!attribute; +}; + +local.matchSelector = function(node, tag, id, classes, attributes, pseudos){ + if (tag){ + var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase(); + if (tag == '*'){ + if (nodeName < '@') return false; // Fix for comment nodes and closed nodes + } else { + if (nodeName != tag) return false; + } + } + + if (id && node.getAttribute('id') != id) return false; + + var i, part, cls; + if (classes) for (i = classes.length; i--;){ + cls = this.getAttribute(node, 'class'); + if (!(cls && classes[i].regexp.test(cls))) return false; + } + if (attributes) for (i = attributes.length; i--;){ + part = attributes[i]; + if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false; + } + if (pseudos) for (i = pseudos.length; i--;){ + part = pseudos[i]; + if (!this.matchPseudo(node, part.key, part.value)) return false; + } + return true; +}; + +var combinators = { + + ' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level + + var i, item, children; + + if (this.isHTMLDocument){ + getById: if (id){ + item = this.document.getElementById(id); + if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){ + // all[id] returns all the elements with that name or id inside node + // if theres just one it will return the element, else it will be a collection + children = node.all[id]; + if (!children) return; + if (!children[0]) children = [children]; + for (i = 0; item = children[i++];){ + var idNode = item.getAttributeNode('id'); + if (idNode && idNode.nodeValue == id){ + this.push(item, tag, null, classes, attributes, pseudos); + break; + } + } + return; + } + if (!item){ + // if the context is in the dom we return, else we will try GEBTN, breaking the getById label + if (this.contains(this.root, node)) return; + else break getById; + } else if (this.document !== node && !this.contains(node, item)) return; + this.push(item, tag, null, classes, attributes, pseudos); + return; + } + getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){ + children = node.getElementsByClassName(classList.join(' ')); + if (!(children && children.length)) break getByClass; + for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos); + return; + } + } + getByTag: { + children = node.getElementsByTagName(tag); + if (!(children && children.length)) break getByTag; + if (!this.brokenStarGEBTN) tag = null; + for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos); + } + }, + + '>': function(node, tag, id, classes, attributes, pseudos){ // direct children + if ((node = node.firstChild)) do { + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + } while ((node = node.nextSibling)); + }, + + '+': function(node, tag, id, classes, attributes, pseudos){ // next sibling + while ((node = node.nextSibling)) if (node.nodeType == 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '^': function(node, tag, id, classes, attributes, pseudos){ // first child + node = node.firstChild; + if (node){ + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '~': function(node, tag, id, classes, attributes, pseudos){ // next siblings + while ((node = node.nextSibling)){ + if (node.nodeType != 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + }, + + '++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling + this['combinator:+'](node, tag, id, classes, attributes, pseudos); + this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + }, + + '~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings + this['combinator:~'](node, tag, id, classes, attributes, pseudos); + this['combinator:!~'](node, tag, id, classes, attributes, pseudos); + }, + + '!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document + while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level) + node = node.parentNode; + if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling + while ((node = node.previousSibling)) if (node.nodeType == 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '!^': function(node, tag, id, classes, attributes, pseudos){ // last child + node = node.lastChild; + if (node){ + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings + while ((node = node.previousSibling)){ + if (node.nodeType != 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + } + +}; + +for (var c in combinators) local['combinator:' + c] = combinators[c]; + +var pseudos = { + + /**/ + + 'empty': function(node){ + var child = node.firstChild; + return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length; + }, + + 'not': function(node, expression){ + return !this.matchNode(node, expression); + }, + + 'contains': function(node, text){ + return (node.innerText || node.textContent || '').indexOf(text) > -1; + }, + + 'first-child': function(node){ + while ((node = node.previousSibling)) if (node.nodeType == 1) return false; + return true; + }, + + 'last-child': function(node){ + while ((node = node.nextSibling)) if (node.nodeType == 1) return false; + return true; + }, + + 'only-child': function(node){ + var prev = node; + while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeType == 1) return false; + return true; + }, + + /**/ + + 'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'), + + 'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'), + + 'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true), + + 'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true), + + 'index': function(node, index){ + return this['pseudo:nth-child'](node, '' + (index + 1)); + }, + + 'even': function(node){ + return this['pseudo:nth-child'](node, '2n'); + }, + + 'odd': function(node){ + return this['pseudo:nth-child'](node, '2n+1'); + }, + + /**/ + + /**/ + + 'first-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false; + return true; + }, + + 'last-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false; + return true; + }, + + 'only-of-type': function(node){ + var prev = node, nodeName = node.nodeName; + while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false; + return true; + }, + + /**/ + + // custom pseudos + + 'enabled': function(node){ + return !node.disabled; + }, + + 'disabled': function(node){ + return node.disabled; + }, + + 'checked': function(node){ + return node.checked || node.selected; + }, + + 'focus': function(node){ + return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex')); + }, + + 'root': function(node){ + return (node === this.root); + }, + + 'selected': function(node){ + return node.selected; + } + + /**/ +}; + +for (var p in pseudos) local['pseudo:' + p] = pseudos[p]; + +// attributes methods + +var attributeGetters = local.attributeGetters = { + + 'for': function(){ + return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for'); + }, + + 'href': function(){ + return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href'); + }, + + 'style': function(){ + return (this.style) ? this.style.cssText : this.getAttribute('style'); + }, + + 'tabindex': function(){ + var attributeNode = this.getAttributeNode('tabindex'); + return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; + }, + + 'type': function(){ + return this.getAttribute('type'); + }, + + 'maxlength': function(){ + var attributeNode = this.getAttributeNode('maxLength'); + return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; + } + +}; + +attributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength; + +// Slick + +var Slick = local.Slick = (this.Slick || {}); + +Slick.version = '1.1.7'; + +// Slick finder + +Slick.search = function(context, expression, append){ + return local.search(context, expression, append); +}; + +Slick.find = function(context, expression){ + return local.search(context, expression, null, true); +}; + +// Slick containment checker + +Slick.contains = function(container, node){ + local.setDocument(container); + return local.contains(container, node); +}; + +// Slick attribute getter + +Slick.getAttribute = function(node, name){ + local.setDocument(node); + return local.getAttribute(node, name); +}; + +Slick.hasAttribute = function(node, name){ + local.setDocument(node); + return local.hasAttribute(node, name); +}; + +// Slick matcher + +Slick.match = function(node, selector){ + if (!(node && selector)) return false; + if (!selector || selector === node) return true; + local.setDocument(node); + return local.matchNode(node, selector); +}; + +// Slick attribute accessor + +Slick.defineAttributeGetter = function(name, fn){ + local.attributeGetters[name] = fn; + return this; +}; + +Slick.lookupAttributeGetter = function(name){ + return local.attributeGetters[name]; +}; + +// Slick pseudo accessor + +Slick.definePseudo = function(name, fn){ + local['pseudo:' + name] = function(node, argument){ + return fn.call(node, argument); + }; + return this; +}; + +Slick.lookupPseudo = function(name){ + var pseudo = local['pseudo:' + name]; + if (pseudo) return function(argument){ + return pseudo.call(this, argument); + }; + return null; +}; + +// Slick overrides accessor + +Slick.override = function(regexp, fn){ + local.override(regexp, fn); + return this; +}; + +Slick.isXML = local.isXML; + +Slick.uidOf = function(node){ + return local.getUIDHTML(node); +}; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- + +name: Element + +description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements. + +license: MIT-style license. + +requires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder] + +provides: [Element, Elements, $, $$, IFrame, Selectors] + +... +*/ + +var Element = this.Element = function(tag, props){ + var konstructor = Element.Constructors[tag]; + if (konstructor) return konstructor(props); + if (typeof tag != 'string') return document.id(tag).set(props); + + if (!props) props = {}; + + if (!(/^[\w-]+$/).test(tag)){ + var parsed = Slick.parse(tag).expressions[0][0]; + tag = (parsed.tag == '*') ? 'div' : parsed.tag; + if (parsed.id && props.id == null) props.id = parsed.id; + + var attributes = parsed.attributes; + if (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){ + attr = attributes[i]; + if (props[attr.key] != null) continue; + + if (attr.value != null && attr.operator == '=') props[attr.key] = attr.value; + else if (!attr.value && !attr.operator) props[attr.key] = true; + } + + if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' '); + } + + return document.newElement(tag, props); +}; + + +if (Browser.Element){ + Element.prototype = Browser.Element.prototype; + // IE8 and IE9 require the wrapping. + Element.prototype._fireEvent = (function(fireEvent){ + return function(type, event){ + return fireEvent.call(this, type, event); + }; + })(Element.prototype.fireEvent); +} + +new Type('Element', Element).mirror(function(name){ + if (Array.prototype[name]) return; + + var obj = {}; + obj[name] = function(){ + var results = [], args = arguments, elements = true; + for (var i = 0, l = this.length; i < l; i++){ + var element = this[i], result = results[i] = element[name].apply(element, args); + elements = (elements && typeOf(result) == 'element'); + } + return (elements) ? new Elements(results) : results; + }; + + Elements.implement(obj); +}); + +if (!Browser.Element){ + Element.parent = Object; + + Element.Prototype = { + '$constructor': Element, + '$family': Function.from('element').hide() + }; + + Element.mirror(function(name, method){ + Element.Prototype[name] = method; + }); +} + +Element.Constructors = {}; + + + +var IFrame = new Type('IFrame', function(){ + var params = Array.link(arguments, { + properties: Type.isObject, + iframe: function(obj){ + return (obj != null); + } + }); + + var props = params.properties || {}, iframe; + if (params.iframe) iframe = document.id(params.iframe); + var onload = props.onload || function(){}; + delete props.onload; + props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick(); + iframe = new Element(iframe || 'iframe', props); + + var onLoad = function(){ + onload.call(iframe.contentWindow); + }; + + if (window.frames[props.id]) onLoad(); + else iframe.addListener('load', onLoad); + return iframe; +}); + +var Elements = this.Elements = function(nodes){ + if (nodes && nodes.length){ + var uniques = {}, node; + for (var i = 0; node = nodes[i++];){ + var uid = Slick.uidOf(node); + if (!uniques[uid]){ + uniques[uid] = true; + this.push(node); + } + } + } +}; + +Elements.prototype = {length: 0}; +Elements.parent = Array; + +new Type('Elements', Elements).implement({ + + filter: function(filter, bind){ + if (!filter) return this; + return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){ + return item.match(filter); + } : filter, bind)); + }.protect(), + + push: function(){ + var length = this.length; + for (var i = 0, l = arguments.length; i < l; i++){ + var item = document.id(arguments[i]); + if (item) this[length++] = item; + } + return (this.length = length); + }.protect(), + + unshift: function(){ + var items = []; + for (var i = 0, l = arguments.length; i < l; i++){ + var item = document.id(arguments[i]); + if (item) items.push(item); + } + return Array.prototype.unshift.apply(this, items); + }.protect(), + + concat: function(){ + var newElements = new Elements(this); + for (var i = 0, l = arguments.length; i < l; i++){ + var item = arguments[i]; + if (Type.isEnumerable(item)) newElements.append(item); + else newElements.push(item); + } + return newElements; + }.protect(), + + append: function(collection){ + for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]); + return this; + }.protect(), + + empty: function(){ + while (this.length) delete this[--this.length]; + return this; + }.protect() + +}); + + + +(function(){ + +// FF, IE +var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2}; + +splice.call(object, 1, 1); +if (object[1] == 1) Elements.implement('splice', function(){ + var length = this.length; + var result = splice.apply(this, arguments); + while (length >= this.length) delete this[length--]; + return result; +}.protect()); + +Array.forEachMethod(function(method, name){ + Elements.implement(name, method); +}); + +Array.mirror(Elements); + +/**/ +var createElementAcceptsHTML; +try { + createElementAcceptsHTML = (document.createElement('').name == 'x'); +} catch (e){} + +var escapeQuotes = function(html){ + return ('' + html).replace(/&/g, '&').replace(/"/g, '"'); +}; +/**/ + +Document.implement({ + + newElement: function(tag, props){ + if (props && props.checked != null) props.defaultChecked = props.checked; + /**/// Fix for readonly name and type properties in IE < 8 + if (createElementAcceptsHTML && props){ + tag = '<' + tag; + if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"'; + if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"'; + tag += '>'; + delete props.name; + delete props.type; + } + /**/ + return this.id(this.createElement(tag)).set(props); + } + +}); + +})(); + +(function(){ + +Slick.uidOf(window); +Slick.uidOf(document); + +Document.implement({ + + newTextNode: function(text){ + return this.createTextNode(text); + }, + + getDocument: function(){ + return this; + }, + + getWindow: function(){ + return this.window; + }, + + id: (function(){ + + var types = { + + string: function(id, nocash, doc){ + id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1')); + return (id) ? types.element(id, nocash) : null; + }, + + element: function(el, nocash){ + Slick.uidOf(el); + if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){ + var fireEvent = el.fireEvent; + // wrapping needed in IE7, or else crash + el._fireEvent = function(type, event){ + return fireEvent(type, event); + }; + Object.append(el, Element.Prototype); + } + return el; + }, + + object: function(obj, nocash, doc){ + if (obj.toElement) return types.element(obj.toElement(doc), nocash); + return null; + } + + }; + + types.textnode = types.whitespace = types.window = types.document = function(zero){ + return zero; + }; + + return function(el, nocash, doc){ + if (el && el.$family && el.uniqueNumber) return el; + var type = typeOf(el); + return (types[type]) ? types[type](el, nocash, doc || document) : null; + }; + + })() + +}); + +if (window.$ == null) Window.implement('$', function(el, nc){ + return document.id(el, nc, this.document); +}); + +Window.implement({ + + getDocument: function(){ + return this.document; + }, + + getWindow: function(){ + return this; + } + +}); + +[Document, Element].invoke('implement', { + + getElements: function(expression){ + return Slick.search(this, expression, new Elements); + }, + + getElement: function(expression){ + return document.id(Slick.find(this, expression)); + } + +}); + +var contains = {contains: function(element){ + return Slick.contains(this, element); +}}; + +if (!document.contains) Document.implement(contains); +if (!document.createElement('div').contains) Element.implement(contains); + + + +// tree walking + +var injectCombinator = function(expression, combinator){ + if (!expression) return combinator; + + expression = Object.clone(Slick.parse(expression)); + + var expressions = expression.expressions; + for (var i = expressions.length; i--;) + expressions[i][0].combinator = combinator; + + return expression; +}; + +Object.forEach({ + getNext: '~', + getPrevious: '!~', + getParent: '!' +}, function(combinator, method){ + Element.implement(method, function(expression){ + return this.getElement(injectCombinator(expression, combinator)); + }); +}); + +Object.forEach({ + getAllNext: '~', + getAllPrevious: '!~', + getSiblings: '~~', + getChildren: '>', + getParents: '!' +}, function(combinator, method){ + Element.implement(method, function(expression){ + return this.getElements(injectCombinator(expression, combinator)); + }); +}); + +Element.implement({ + + getFirst: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]); + }, + + getLast: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast()); + }, + + getWindow: function(){ + return this.ownerDocument.window; + }, + + getDocument: function(){ + return this.ownerDocument; + }, + + getElementById: function(id){ + return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1'))); + }, + + match: function(expression){ + return !expression || Slick.match(this, expression); + } + +}); + + + +if (window.$$ == null) Window.implement('$$', function(selector){ + if (arguments.length == 1){ + if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements); + else if (Type.isEnumerable(selector)) return new Elements(selector); + } + return new Elements(arguments); +}); + +// Inserters + +var inserters = { + + before: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element); + }, + + after: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element.nextSibling); + }, + + bottom: function(context, element){ + element.appendChild(context); + }, + + top: function(context, element){ + element.insertBefore(context, element.firstChild); + } + +}; + +inserters.inside = inserters.bottom; + + + +// getProperty / setProperty + +var propertyGetters = {}, propertySetters = {}; + +// properties + +var properties = {}; +Array.forEach([ + 'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', + 'frameBorder', 'rowSpan', 'tabIndex', 'useMap' +], function(property){ + properties[property.toLowerCase()] = property; +}); + +properties.html = 'innerHTML'; +properties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent'; + +Object.forEach(properties, function(real, key){ + propertySetters[key] = function(node, value){ + node[real] = value; + }; + propertyGetters[key] = function(node){ + return node[real]; + }; +}); + +// Booleans + +var bools = [ + 'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', + 'disabled', 'readOnly', 'multiple', 'selected', 'noresize', + 'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay', + 'loop' +]; + +var booleans = {}; +Array.forEach(bools, function(bool){ + var lower = bool.toLowerCase(); + booleans[lower] = bool; + propertySetters[lower] = function(node, value){ + node[bool] = !!value; + }; + propertyGetters[lower] = function(node){ + return !!node[bool]; + }; +}); + +// Special cases + +Object.append(propertySetters, { + + 'class': function(node, value){ + ('className' in node) ? node.className = (value || '') : node.setAttribute('class', value); + }, + + 'for': function(node, value){ + ('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value); + }, + + 'style': function(node, value){ + (node.style) ? node.style.cssText = value : node.setAttribute('style', value); + }, + + 'value': function(node, value){ + node.value = (value != null) ? value : ''; + } + +}); + +propertyGetters['class'] = function(node){ + return ('className' in node) ? node.className || null : node.getAttribute('class'); +}; + +/* */ +var el = document.createElement('button'); +// IE sets type as readonly and throws +try { el.type = 'button'; } catch(e){} +if (el.type != 'button') propertySetters.type = function(node, value){ + node.setAttribute('type', value); +}; +el = null; +/* */ + +/**/ +var input = document.createElement('input'); +input.value = 't'; +input.type = 'submit'; +if (input.value != 't') propertySetters.type = function(node, type){ + var value = node.value; + node.type = type; + node.value = value; +}; +input = null; +/**/ + +/* getProperty, setProperty */ + +/* */ +var pollutesGetAttribute = (function(div){ + div.random = 'attribute'; + return (div.getAttribute('random') == 'attribute'); +})(document.createElement('div')); + +var hasCloneBug = (function(test){ + test.innerHTML = ''; + return test.cloneNode(true).firstChild.childNodes.length != 1; +})(document.createElement('div')); +/* */ + +var hasClassList = !!document.createElement('div').classList; + +var classes = function(className){ + var classNames = (className || '').clean().split(" "), uniques = {}; + return classNames.filter(function(className){ + if (className !== "" && !uniques[className]) return uniques[className] = className; + }); +}; + +var addToClassList = function(name){ + this.classList.add(name); +}; + +var removeFromClassList = function(name){ + this.classList.remove(name); +}; + +Element.implement({ + + setProperty: function(name, value){ + var setter = propertySetters[name.toLowerCase()]; + if (setter){ + setter(this, value); + } else { + /* */ + var attributeWhiteList; + if (pollutesGetAttribute) attributeWhiteList = this.retrieve('$attributeWhiteList', {}); + /* */ + + if (value == null){ + this.removeAttribute(name); + /* */ + if (pollutesGetAttribute) delete attributeWhiteList[name]; + /* */ + } else { + this.setAttribute(name, '' + value); + /* */ + if (pollutesGetAttribute) attributeWhiteList[name] = true; + /* */ + } + } + return this; + }, + + setProperties: function(attributes){ + for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); + return this; + }, + + getProperty: function(name){ + var getter = propertyGetters[name.toLowerCase()]; + if (getter) return getter(this); + /* */ + if (pollutesGetAttribute){ + var attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {}); + if (!attr) return null; + if (attr.expando && !attributeWhiteList[name]){ + var outer = this.outerHTML; + // segment by the opening tag and find mention of attribute name + if (outer.substr(0, outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name) < 0) return null; + attributeWhiteList[name] = true; + } + } + /* */ + var result = Slick.getAttribute(this, name); + return (!result && !Slick.hasAttribute(this, name)) ? null : result; + }, + + getProperties: function(){ + var args = Array.from(arguments); + return args.map(this.getProperty, this).associate(args); + }, + + removeProperty: function(name){ + return this.setProperty(name, null); + }, + + removeProperties: function(){ + Array.each(arguments, this.removeProperty, this); + return this; + }, + + set: function(prop, value){ + var property = Element.Properties[prop]; + (property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value); + }.overloadSetter(), + + get: function(prop){ + var property = Element.Properties[prop]; + return (property && property.get) ? property.get.apply(this) : this.getProperty(prop); + }.overloadGetter(), + + erase: function(prop){ + var property = Element.Properties[prop]; + (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); + return this; + }, + + hasClass: hasClassList ? function(className){ + return this.classList.contains(className); + } : function(className){ + return this.className.clean().contains(className, ' '); + }, + + addClass: hasClassList ? function(className){ + classes(className).forEach(addToClassList, this); + return this; + } : function(className){ + this.className = classes(className + ' ' + this.className).join(' '); + return this; + }, + + removeClass: hasClassList ? function(className){ + classes(className).forEach(removeFromClassList, this); + return this; + } : function(className){ + var classNames = classes(this.className); + classes(className).forEach(classNames.erase, classNames); + this.className = classNames.join(' '); + return this; + }, + + toggleClass: function(className, force){ + if (force == null) force = !this.hasClass(className); + return (force) ? this.addClass(className) : this.removeClass(className); + }, + + adopt: function(){ + var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length; + if (length > 1) parent = fragment = document.createDocumentFragment(); + + for (var i = 0; i < length; i++){ + var element = document.id(elements[i], true); + if (element) parent.appendChild(element); + } + + if (fragment) this.appendChild(fragment); + + return this; + }, + + appendText: function(text, where){ + return this.grab(this.getDocument().newTextNode(text), where); + }, + + grab: function(el, where){ + inserters[where || 'bottom'](document.id(el, true), this); + return this; + }, + + inject: function(el, where){ + inserters[where || 'bottom'](this, document.id(el, true)); + return this; + }, + + replaces: function(el){ + el = document.id(el, true); + el.parentNode.replaceChild(this, el); + return this; + }, + + wraps: function(el, where){ + el = document.id(el, true); + return this.replaces(el).grab(el, where); + }, + + getSelected: function(){ + this.selectedIndex; // Safari 3.2.1 + return new Elements(Array.from(this.options).filter(function(option){ + return option.selected; + })); + }, + + toQueryString: function(){ + var queryString = []; + this.getElements('input, select, textarea').each(function(el){ + var type = el.type; + if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return; + + var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){ + // IE + return document.id(opt).get('value'); + }) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value'); + + Array.from(value).each(function(val){ + if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val)); + }); + }); + return queryString.join('&'); + } + +}); + + +// appendHTML + +var appendInserters = { + before: 'beforeBegin', + after: 'afterEnd', + bottom: 'beforeEnd', + top: 'afterBegin', + inside: 'beforeEnd' +}; + +Element.implement('appendHTML', ('insertAdjacentHTML' in document.createElement('div')) ? function(html, where){ + this.insertAdjacentHTML(appendInserters[where || 'bottom'], html); + return this; +} : function(html, where){ + var temp = new Element('div', {html: html}), + children = temp.childNodes, + fragment = temp.firstChild; + + if (!fragment) return this; + if (children.length > 1){ + fragment = document.createDocumentFragment(); + for (var i = 0, l = children.length; i < l; i++){ + fragment.appendChild(children[i]); + } + } + + inserters[where || 'bottom'](fragment, this); + return this; +}); + +var collected = {}, storage = {}; + +var get = function(uid){ + return (storage[uid] || (storage[uid] = {})); +}; + +var clean = function(item){ + var uid = item.uniqueNumber; + if (item.removeEvents) item.removeEvents(); + if (item.clearAttributes) item.clearAttributes(); + if (uid != null){ + delete collected[uid]; + delete storage[uid]; + } + return item; +}; + +var formProps = {input: 'checked', option: 'selected', textarea: 'value'}; + +Element.implement({ + + destroy: function(){ + var children = clean(this).getElementsByTagName('*'); + Array.each(children, clean); + Element.dispose(this); + return null; + }, + + empty: function(){ + Array.from(this.childNodes).each(Element.dispose); + return this; + }, + + dispose: function(){ + return (this.parentNode) ? this.parentNode.removeChild(this) : this; + }, + + clone: function(contents, keepid){ + contents = contents !== false; + var clone = this.cloneNode(contents), ce = [clone], te = [this], i; + + if (contents){ + ce.append(Array.from(clone.getElementsByTagName('*'))); + te.append(Array.from(this.getElementsByTagName('*'))); + } + + for (i = ce.length; i--;){ + var node = ce[i], element = te[i]; + if (!keepid) node.removeAttribute('id'); + /**/ + if (node.clearAttributes){ + node.clearAttributes(); + node.mergeAttributes(element); + node.removeAttribute('uniqueNumber'); + if (node.options){ + var no = node.options, eo = element.options; + for (var j = no.length; j--;) no[j].selected = eo[j].selected; + } + } + /**/ + var prop = formProps[element.tagName.toLowerCase()]; + if (prop && element[prop]) node[prop] = element[prop]; + } + + /**/ + if (hasCloneBug){ + var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object'); + for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML; + } + /**/ + return document.id(clone); + } + +}); + +[Element, Window, Document].invoke('implement', { + + addListener: function(type, fn){ + if (window.attachEvent && !window.addEventListener){ + collected[Slick.uidOf(this)] = this; + } + if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]); + else this.attachEvent('on' + type, fn); + return this; + }, + + removeListener: function(type, fn){ + if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]); + else this.detachEvent('on' + type, fn); + return this; + }, + + retrieve: function(property, dflt){ + var storage = get(Slick.uidOf(this)), prop = storage[property]; + if (dflt != null && prop == null) prop = storage[property] = dflt; + return prop != null ? prop : null; + }, + + store: function(property, value){ + var storage = get(Slick.uidOf(this)); + storage[property] = value; + return this; + }, + + eliminate: function(property){ + var storage = get(Slick.uidOf(this)); + delete storage[property]; + return this; + } + +}); + +/**/ +if (window.attachEvent && !window.addEventListener){ + var gc = function(){ + Object.each(collected, clean); + if (window.CollectGarbage) CollectGarbage(); + window.removeListener('unload', gc); + } + window.addListener('unload', gc); +} +/**/ + +Element.Properties = {}; + + + +Element.Properties.style = { + + set: function(style){ + this.style.cssText = style; + }, + + get: function(){ + return this.style.cssText; + }, + + erase: function(){ + this.style.cssText = ''; + } + +}; + +Element.Properties.tag = { + + get: function(){ + return this.tagName.toLowerCase(); + } + +}; + +Element.Properties.html = { + + set: function(html){ + if (html == null) html = ''; + else if (typeOf(html) == 'array') html = html.join(''); + this.innerHTML = html; + }, + + erase: function(){ + this.innerHTML = ''; + } + +}; + +var supportsHTML5Elements = true, supportsTableInnerHTML = true, supportsTRInnerHTML = true; + +/**/ +// technique by jdbarlett - http://jdbartlett.com/innershiv/ +var div = document.createElement('div'); +div.innerHTML = ''; +supportsHTML5Elements = (div.childNodes.length == 1); +if (!supportsHTML5Elements){ + var tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '), + fragment = document.createDocumentFragment(), l = tags.length; + while (l--) fragment.createElement(tags[l]); +} +div = null; +/**/ + +/**/ +supportsTableInnerHTML = Function.attempt(function(){ + var table = document.createElement('table'); + table.innerHTML = ''; + return true; +}); + +/**/ +var tr = document.createElement('tr'), html = ''; +tr.innerHTML = html; +supportsTRInnerHTML = (tr.innerHTML == html); +tr = null; +/**/ + +if (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){ + + Element.Properties.html.set = (function(set){ + + var translations = { + table: [1, '', '
          '], + select: [1, ''], + tbody: [2, '', '
          '], + tr: [3, '', '
          '] + }; + + translations.thead = translations.tfoot = translations.tbody; + + return function(html){ + var wrap = translations[this.get('tag')]; + if (!wrap && !supportsHTML5Elements) wrap = [0, '', '']; + if (!wrap) return set.call(this, html); + + var level = wrap[0], wrapper = document.createElement('div'), target = wrapper; + if (!supportsHTML5Elements) fragment.appendChild(wrapper); + wrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join(''); + while (level--) target = target.firstChild; + this.empty().adopt(target.childNodes); + if (!supportsHTML5Elements) fragment.removeChild(wrapper); + wrapper = null; + }; + + })(Element.Properties.html.set); +} +/*
          */ + +/**/ +var testForm = document.createElement('form'); +testForm.innerHTML = ''; + +if (testForm.firstChild.value != 's') Element.Properties.value = { + + set: function(value){ + var tag = this.get('tag'); + if (tag != 'select') return this.setProperty('value', value); + var options = this.getElements('option'); + value = String(value); + for (var i = 0; i < options.length; i++){ + var option = options[i], + attr = option.getAttributeNode('value'), + optionValue = (attr && attr.specified) ? option.value : option.get('text'); + if (optionValue === value) return option.selected = true; + } + }, + + get: function(){ + var option = this, tag = option.get('tag'); + + if (tag != 'select' && tag != 'option') return this.getProperty('value'); + + if (tag == 'select' && !(option = option.getSelected()[0])) return ''; + + var attr = option.getAttributeNode('value'); + return (attr && attr.specified) ? option.value : option.get('text'); + } + +}; +testForm = null; +/**/ + +/**/ +if (document.createElement('div').getAttributeNode('id')) Element.Properties.id = { + set: function(id){ + this.id = this.getAttributeNode('id').value = id; + }, + get: function(){ + return this.id || null; + }, + erase: function(){ + this.id = this.getAttributeNode('id').value = ''; + } +}; +/**/ + +})(); + + +/* +--- + +name: Element.Style + +description: Contains methods for interacting with the styles of Elements in a fashionable way. + +license: MIT-style license. + +requires: Element + +provides: Element.Style + +... +*/ + +(function(){ + +var html = document.html, el; + +// +// Check for oldIE, which does not remove styles when they're set to null +el = document.createElement('div'); +el.style.color = 'red'; +el.style.color = null; +var doesNotRemoveStyles = el.style.color == 'red'; + +// check for oldIE, which returns border* shorthand styles in the wrong order (color-width-style instead of width-style-color) +var border = '1px solid #123abc'; +el.style.border = border; +var returnsBordersInWrongOrder = el.style.border != border; +el = null; +// + +var hasGetComputedStyle = !!window.getComputedStyle; + +Element.Properties.styles = {set: function(styles){ + this.setStyles(styles); +}}; + +var hasOpacity = (html.style.opacity != null), + hasFilter = (html.style.filter != null), + reAlpha = /alpha\(opacity=([\d.]+)\)/i; + +var setVisibility = function(element, opacity){ + element.store('$opacity', opacity); + element.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden'; +}; + +// +var setFilter = function(element, regexp, value){ + var style = element.style, + filter = style.filter || element.getComputedStyle('filter') || ''; + style.filter = (regexp.test(filter) ? filter.replace(regexp, value) : filter + ' ' + value).trim(); + if (!style.filter) style.removeAttribute('filter'); +}; +// + +var setOpacity = (hasOpacity ? function(element, opacity){ + element.style.opacity = opacity; +} : (hasFilter ? function(element, opacity){ + if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1; + if (opacity == null || opacity == 1){ + setFilter(element, reAlpha, ''); + if (opacity == 1 && getOpacity(element) != 1) setFilter(element, reAlpha, 'alpha(opacity=100)'); + } else { + setFilter(element, reAlpha, 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')'); + } +} : setVisibility)); + +var getOpacity = (hasOpacity ? function(element){ + var opacity = element.style.opacity || element.getComputedStyle('opacity'); + return (opacity == '') ? 1 : opacity.toFloat(); +} : (hasFilter ? function(element){ + var filter = (element.style.filter || element.getComputedStyle('filter')), + opacity; + if (filter) opacity = filter.match(reAlpha); + return (opacity == null || filter == null) ? 1 : (opacity[1] / 100); +} : function(element){ + var opacity = element.retrieve('$opacity'); + if (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1); + return opacity; +})); + +var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat', + namedPositions = {left: '0%', top: '0%', center: '50%', right: '100%', bottom: '100%'}, + hasBackgroundPositionXY = (html.style.backgroundPositionX != null); + +// +var removeStyle = function(style, property){ + if (property == 'backgroundPosition'){ + style.removeAttribute(property + 'X'); + property += 'Y'; + } + style.removeAttribute(property); +}; +// + +Element.implement({ + + getComputedStyle: function(property){ + if (!hasGetComputedStyle && this.currentStyle) return this.currentStyle[property.camelCase()]; + var defaultView = Element.getDocument(this).defaultView, + computed = defaultView ? defaultView.getComputedStyle(this, null) : null; + return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : ''; + }, + + setStyle: function(property, value){ + if (property == 'opacity'){ + if (value != null) value = parseFloat(value); + setOpacity(this, value); + return this; + } + property = (property == 'float' ? floatName : property).camelCase(); + if (typeOf(value) != 'string'){ + var map = (Element.Styles[property] || '@').split(' '); + value = Array.from(value).map(function(val, i){ + if (!map[i]) return ''; + return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; + }).join(' '); + } else if (value == String(Number(value))){ + value = Math.round(value); + } + this.style[property] = value; + // + if ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){ + removeStyle(this.style, property); + } + // + return this; + }, + + getStyle: function(property){ + if (property == 'opacity') return getOpacity(this); + property = (property == 'float' ? floatName : property).camelCase(); + var result = this.style[property]; + if (!result || property == 'zIndex'){ + if (Element.ShortStyles.hasOwnProperty(property)){ + result = []; + for (var s in Element.ShortStyles[property]) result.push(this.getStyle(s)); + return result.join(' '); + } + result = this.getComputedStyle(property); + } + if (hasBackgroundPositionXY && /^backgroundPosition[XY]?$/.test(property)){ + return result.replace(/(top|right|bottom|left)/g, function(position){ + return namedPositions[position]; + }) || '0px'; + } + if (!result && property == 'backgroundPosition') return '0px 0px'; + if (result){ + result = String(result); + var color = result.match(/rgba?\([\d\s,]+\)/); + if (color) result = result.replace(color[0], color[0].rgbToHex()); + } + if (!hasGetComputedStyle && !this.style[property]){ + if ((/^(height|width)$/).test(property) && !(/px$/.test(result))){ + var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; + values.each(function(value){ + size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); + }, this); + return this['offset' + property.capitalize()] - size + 'px'; + } + if ((/^border(.+)Width|margin|padding/).test(property) && isNaN(parseFloat(result))){ + return '0px'; + } + } + // + if (returnsBordersInWrongOrder && /^border(Top|Right|Bottom|Left)?$/.test(property) && /^#/.test(result)){ + return result.replace(/^(.+)\s(.+)\s(.+)$/, '$2 $3 $1'); + } + // + return result; + }, + + setStyles: function(styles){ + for (var style in styles) this.setStyle(style, styles[style]); + return this; + }, + + getStyles: function(){ + var result = {}; + Array.flatten(arguments).each(function(key){ + result[key] = this.getStyle(key); + }, this); + return result; + } + +}); + +Element.Styles = { + left: '@px', top: '@px', bottom: '@px', right: '@px', + width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px', + backgroundColor: 'rgb(@, @, @)', backgroundSize: '@px', backgroundPosition: '@px @px', color: 'rgb(@, @, @)', + fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)', + margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)', + borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)', + zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@' +}; + + + + + +Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; + +['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ + var Short = Element.ShortStyles; + var All = Element.Styles; + ['margin', 'padding'].each(function(style){ + var sd = style + direction; + Short[style][sd] = All[sd] = '@px'; + }); + var bd = 'border' + direction; + Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; + var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; + Short[bd] = {}; + Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; + Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; + Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; +}); + +if (hasBackgroundPositionXY) Element.ShortStyles.backgroundPosition = {backgroundPositionX: '@', backgroundPositionY: '@'}; +})(); + + +/* +--- + +name: Element.Event + +description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary. + +license: MIT-style license. + +requires: [Element, Event] + +provides: Element.Event + +... +*/ + +(function(){ + +Element.Properties.events = {set: function(events){ + this.addEvents(events); +}}; + +[Element, Window, Document].invoke('implement', { + + addEvent: function(type, fn){ + var events = this.retrieve('events', {}); + if (!events[type]) events[type] = {keys: [], values: []}; + if (events[type].keys.contains(fn)) return this; + events[type].keys.push(fn); + var realType = type, + custom = Element.Events[type], + condition = fn, + self = this; + if (custom){ + if (custom.onAdd) custom.onAdd.call(this, fn, type); + if (custom.condition){ + condition = function(event){ + if (custom.condition.call(this, event, type)) return fn.call(this, event); + return true; + }; + } + if (custom.base) realType = Function.from(custom.base).call(this, type); + } + var defn = function(){ + return fn.call(self); + }; + var nativeEvent = Element.NativeEvents[realType]; + if (nativeEvent){ + if (nativeEvent == 2){ + defn = function(event){ + event = new DOMEvent(event, self.getWindow()); + if (condition.call(self, event) === false) event.stop(); + }; + } + this.addListener(realType, defn, arguments[2]); + } + events[type].values.push(defn); + return this; + }, + + removeEvent: function(type, fn){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + var list = events[type]; + var index = list.keys.indexOf(fn); + if (index == -1) return this; + var value = list.values[index]; + delete list.keys[index]; + delete list.values[index]; + var custom = Element.Events[type]; + if (custom){ + if (custom.onRemove) custom.onRemove.call(this, fn, type); + if (custom.base) type = Function.from(custom.base).call(this, type); + } + return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this; + }, + + addEvents: function(events){ + for (var event in events) this.addEvent(event, events[event]); + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + var attached = this.retrieve('events'); + if (!attached) return this; + if (!events){ + for (type in attached) this.removeEvents(type); + this.eliminate('events'); + } else if (attached[events]){ + attached[events].keys.each(function(fn){ + this.removeEvent(events, fn); + }, this); + delete attached[events]; + } + return this; + }, + + fireEvent: function(type, args, delay){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + args = Array.from(args); + + events[type].keys.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + cloneEvents: function(from, type){ + from = document.id(from); + var events = from.retrieve('events'); + if (!events) return this; + if (!type){ + for (var eventType in events) this.cloneEvents(from, eventType); + } else if (events[type]){ + events[type].keys.each(function(fn){ + this.addEvent(type, fn); + }, this); + } + return this; + } + +}); + +Element.NativeEvents = { + click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons + mousewheel: 2, DOMMouseScroll: 2, //mouse wheel + mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement + keydown: 2, keypress: 2, keyup: 2, //keyboard + orientationchange: 2, // mobile + touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch + gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture + focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements + load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window + hashchange: 1, popstate: 2, // history + error: 1, abort: 1, scroll: 1 //misc +}; + +Element.Events = { + mousewheel: { + base: 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll' + } +}; + +var check = function(event){ + var related = event.relatedTarget; + if (related == null) return true; + if (!related) return false; + return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related)); +}; + +if ('onmouseenter' in document.documentElement){ + Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2; + Element.MouseenterCheck = check; +} else { + Element.Events.mouseenter = { + base: 'mouseover', + condition: check + }; + + Element.Events.mouseleave = { + base: 'mouseout', + condition: check + }; +} + +/**/ +if (!window.addEventListener){ + Element.NativeEvents.propertychange = 2; + Element.Events.change = { + base: function(){ + var type = this.type; + return (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change'; + }, + condition: function(event){ + return event.type != 'propertychange' || event.event.propertyName == 'checked'; + } + }; +} +/**/ + + + +})(); + + +/* +--- + +name: Element.Delegation + +description: Extends the Element native object to include the delegate method for more efficient event management. + +license: MIT-style license. + +requires: [Element.Event] + +provides: [Element.Delegation] + +... +*/ + +(function(){ + +var eventListenerSupport = !!window.addEventListener; + +Element.NativeEvents.focusin = Element.NativeEvents.focusout = 2; + +var bubbleUp = function(self, match, fn, event, target){ + while (target && target != self){ + if (match(target, event)) return fn.call(target, event, target); + target = document.id(target.parentNode); + } +}; + +var map = { + mouseenter: { + base: 'mouseover', + condition: Element.MouseenterCheck + }, + mouseleave: { + base: 'mouseout', + condition: Element.MouseenterCheck + }, + focus: { + base: 'focus' + (eventListenerSupport ? '' : 'in'), + capture: true + }, + blur: { + base: eventListenerSupport ? 'blur' : 'focusout', + capture: true + } +}; + +/**/ +var _key = '$delegation:'; +var formObserver = function(type){ + + return { + + base: 'focusin', + + remove: function(self, uid){ + var list = self.retrieve(_key + type + 'listeners', {})[uid]; + if (list && list.forms) for (var i = list.forms.length; i--;){ + list.forms[i].removeEvent(type, list.fns[i]); + } + }, + + listen: function(self, match, fn, event, target, uid){ + var form = (target.get('tag') == 'form') ? target : event.target.getParent('form'); + if (!form) return; + + var listeners = self.retrieve(_key + type + 'listeners', {}), + listener = listeners[uid] || {forms: [], fns: []}, + forms = listener.forms, fns = listener.fns; + + if (forms.indexOf(form) != -1) return; + forms.push(form); + + var _fn = function(event){ + bubbleUp(self, match, fn, event, target); + }; + form.addEvent(type, _fn); + fns.push(_fn); + + listeners[uid] = listener; + self.store(_key + type + 'listeners', listeners); + } + }; +}; + +var inputObserver = function(type){ + return { + base: 'focusin', + listen: function(self, match, fn, event, target){ + var events = {blur: function(){ + this.removeEvents(events); + }}; + events[type] = function(event){ + bubbleUp(self, match, fn, event, target); + }; + event.target.addEvents(events); + } + }; +}; + +if (!eventListenerSupport) Object.append(map, { + submit: formObserver('submit'), + reset: formObserver('reset'), + change: inputObserver('change'), + select: inputObserver('select') +}); +/**/ + +var proto = Element.prototype, + addEvent = proto.addEvent, + removeEvent = proto.removeEvent; + +var relay = function(old, method){ + return function(type, fn, useCapture){ + if (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture); + var parsed = Slick.parse(type).expressions[0][0]; + if (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture); + var newType = parsed.tag; + parsed.pseudos.slice(1).each(function(pseudo){ + newType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : ''); + }); + old.call(this, type, fn); + return method.call(this, newType, parsed.pseudos[0].value, fn); + }; +}; + +var delegation = { + + addEvent: function(type, match, fn){ + var storage = this.retrieve('$delegates', {}), stored = storage[type]; + if (stored) for (var _uid in stored){ + if (stored[_uid].fn == fn && stored[_uid].match == match) return this; + } + + var _type = type, _match = match, _fn = fn, _map = map[type] || {}; + type = _map.base || _type; + + match = function(target){ + return Slick.match(target, _match); + }; + + var elementEvent = Element.Events[_type]; + if (_map.condition || elementEvent && elementEvent.condition){ + var __match = match, condition = _map.condition || elementEvent.condition; + match = function(target, event){ + return __match(target, event) && condition.call(target, event, type); + }; + } + + var self = this, uid = String.uniqueID(); + var delegator = _map.listen ? function(event, target){ + if (!target && event && event.target) target = event.target; + if (target) _map.listen(self, match, fn, event, target, uid); + } : function(event, target){ + if (!target && event && event.target) target = event.target; + if (target) bubbleUp(self, match, fn, event, target); + }; + + if (!stored) stored = {}; + stored[uid] = { + match: _match, + fn: _fn, + delegator: delegator + }; + storage[_type] = stored; + return addEvent.call(this, type, delegator, _map.capture); + }, + + removeEvent: function(type, match, fn, _uid){ + var storage = this.retrieve('$delegates', {}), stored = storage[type]; + if (!stored) return this; + + if (_uid){ + var _type = type, delegator = stored[_uid].delegator, _map = map[type] || {}; + type = _map.base || _type; + if (_map.remove) _map.remove(this, _uid); + delete stored[_uid]; + storage[_type] = stored; + return removeEvent.call(this, type, delegator, _map.capture); + } + + var __uid, s; + if (fn) for (__uid in stored){ + s = stored[__uid]; + if (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid); + } else for (__uid in stored){ + s = stored[__uid]; + if (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid); + } + return this; + } + +}; + +[Element, Window, Document].invoke('implement', { + addEvent: relay(addEvent, delegation.addEvent), + removeEvent: relay(removeEvent, delegation.removeEvent) +}); + +})(); + + +/* +--- + +name: Element.Dimensions + +description: Contains methods to work with size, scroll, or positioning of Elements and the window object. + +license: MIT-style license. + +credits: + - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). + - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). + +requires: [Element, Element.Style] + +provides: [Element.Dimensions] + +... +*/ + +(function(){ + +var element = document.createElement('div'), + child = document.createElement('div'); +element.style.height = '0'; +element.appendChild(child); +var brokenOffsetParent = (child.offsetParent === element); +element = child = null; + +var isOffset = function(el){ + return styleString(el, 'position') != 'static' || isBody(el); +}; + +var isOffsetStatic = function(el){ + return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName); +}; + +Element.implement({ + + scrollTo: function(x, y){ + if (isBody(this)){ + this.getWindow().scrollTo(x, y); + } else { + this.scrollLeft = x; + this.scrollTop = y; + } + return this; + }, + + getSize: function(){ + if (isBody(this)) return this.getWindow().getSize(); + return {x: this.offsetWidth, y: this.offsetHeight}; + }, + + getScrollSize: function(){ + if (isBody(this)) return this.getWindow().getScrollSize(); + return {x: this.scrollWidth, y: this.scrollHeight}; + }, + + getScroll: function(){ + if (isBody(this)) return this.getWindow().getScroll(); + return {x: this.scrollLeft, y: this.scrollTop}; + }, + + getScrolls: function(){ + var element = this.parentNode, position = {x: 0, y: 0}; + while (element && !isBody(element)){ + position.x += element.scrollLeft; + position.y += element.scrollTop; + element = element.parentNode; + } + return position; + }, + + getOffsetParent: brokenOffsetParent ? function(){ + var element = this; + if (isBody(element) || styleString(element, 'position') == 'fixed') return null; + + var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset; + while ((element = element.parentNode)){ + if (isOffsetCheck(element)) return element; + } + return null; + } : function(){ + var element = this; + if (isBody(element) || styleString(element, 'position') == 'fixed') return null; + + try { + return element.offsetParent; + } catch(e) {} + return null; + }, + + getOffsets: function(){ + var hasGetBoundingClientRect = this.getBoundingClientRect; + + if (hasGetBoundingClientRect){ + var bound = this.getBoundingClientRect(), + html = document.id(this.getDocument().documentElement), + htmlScroll = html.getScroll(), + elemScrolls = this.getScrolls(), + isFixed = (styleString(this, 'position') == 'fixed'); + + return { + x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, + y: bound.top.toInt() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop + }; + } + + var element = this, position = {x: 0, y: 0}; + if (isBody(this)) return position; + + while (element && !isBody(element)){ + position.x += element.offsetLeft; + position.y += element.offsetTop; + + element = element.offsetParent; + } + + return position; + }, + + getPosition: function(relative){ + var offset = this.getOffsets(), + scroll = this.getScrolls(); + var position = { + x: offset.x - scroll.x, + y: offset.y - scroll.y + }; + + if (relative && (relative = document.id(relative))){ + var relativePosition = relative.getPosition(); + return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)}; + } + return position; + }, + + getCoordinates: function(element){ + if (isBody(this)) return this.getWindow().getCoordinates(); + var position = this.getPosition(element), + size = this.getSize(); + var obj = { + left: position.x, + top: position.y, + width: size.x, + height: size.y + }; + obj.right = obj.left + obj.width; + obj.bottom = obj.top + obj.height; + return obj; + }, + + computePosition: function(obj){ + return { + left: obj.x - styleNumber(this, 'margin-left'), + top: obj.y - styleNumber(this, 'margin-top') + }; + }, + + setPosition: function(obj){ + return this.setStyles(this.computePosition(obj)); + } + +}); + + +[Document, Window].invoke('implement', { + + getSize: function(){ + var doc = getCompatElement(this); + return {x: doc.clientWidth, y: doc.clientHeight}; + }, + + getScroll: function(){ + var win = this.getWindow(), doc = getCompatElement(this); + return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; + }, + + getScrollSize: function(){ + var doc = getCompatElement(this), + min = this.getSize(), + body = this.getDocument().body; + + return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)}; + }, + + getPosition: function(){ + return {x: 0, y: 0}; + }, + + getCoordinates: function(){ + var size = this.getSize(); + return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; + } + +}); + +// private methods + +var styleString = Element.getComputedStyle; + +function styleNumber(element, style){ + return styleString(element, style).toInt() || 0; +} + +function borderBox(element){ + return styleString(element, '-moz-box-sizing') == 'border-box'; +} + +function topBorder(element){ + return styleNumber(element, 'border-top-width'); +} + +function leftBorder(element){ + return styleNumber(element, 'border-left-width'); +} + +function isBody(element){ + return (/^(?:body|html)$/i).test(element.tagName); +} + +function getCompatElement(element){ + var doc = element.getDocument(); + return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; +} + +})(); + +//aliases +Element.alias({position: 'setPosition'}); //compatability + +[Window, Document, Element].invoke('implement', { + + getHeight: function(){ + return this.getSize().y; + }, + + getWidth: function(){ + return this.getSize().x; + }, + + getScrollTop: function(){ + return this.getScroll().y; + }, + + getScrollLeft: function(){ + return this.getScroll().x; + }, + + getScrollHeight: function(){ + return this.getScrollSize().y; + }, + + getScrollWidth: function(){ + return this.getScrollSize().x; + }, + + getTop: function(){ + return this.getPosition().y; + }, + + getLeft: function(){ + return this.getPosition().x; + } + +}); + + +/* +--- + +name: Fx + +description: Contains the basic animation logic to be extended by all other Fx Classes. + +license: MIT-style license. + +requires: [Chain, Events, Options] + +provides: Fx + +... +*/ + +(function(){ + +var Fx = this.Fx = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onStart: nil, + onCancel: nil, + onComplete: nil, + */ + fps: 60, + unit: false, + duration: 500, + frames: null, + frameSkip: true, + link: 'ignore' + }, + + initialize: function(options){ + this.subject = this.subject || this; + this.setOptions(options); + }, + + getTransition: function(){ + return function(p){ + return -(Math.cos(Math.PI * p) - 1) / 2; + }; + }, + + step: function(now){ + if (this.options.frameSkip){ + var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval; + this.time = now; + this.frame += frames; + } else { + this.frame++; + } + + if (this.frame < this.frames){ + var delta = this.transition(this.frame / this.frames); + this.set(this.compute(this.from, this.to, delta)); + } else { + this.frame = this.frames; + this.set(this.compute(this.from, this.to, 1)); + this.stop(); + } + }, + + set: function(now){ + return now; + }, + + compute: function(from, to, delta){ + return Fx.compute(from, to, delta); + }, + + check: function(){ + if (!this.isRunning()) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + start: function(from, to){ + if (!this.check(from, to)) return this; + this.from = from; + this.to = to; + this.frame = (this.options.frameSkip) ? 0 : -1; + this.time = null; + this.transition = this.getTransition(); + var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration; + this.duration = Fx.Durations[duration] || duration.toInt(); + this.frameInterval = 1000 / fps; + this.frames = frames || Math.round(this.duration / this.frameInterval); + this.fireEvent('start', this.subject); + pushInstance.call(this, fps); + return this; + }, + + stop: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + if (this.frames == this.frame){ + this.fireEvent('complete', this.subject); + if (!this.callChain()) this.fireEvent('chainComplete', this.subject); + } else { + this.fireEvent('stop', this.subject); + } + } + return this; + }, + + cancel: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + this.frame = this.frames; + this.fireEvent('cancel', this.subject).clearChain(); + } + return this; + }, + + pause: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + } + return this; + }, + + resume: function(){ + if (this.isPaused()) pushInstance.call(this, this.options.fps); + return this; + }, + + isRunning: function(){ + var list = instances[this.options.fps]; + return list && list.contains(this); + }, + + isPaused: function(){ + return (this.frame < this.frames) && !this.isRunning(); + } + +}); + +Fx.compute = function(from, to, delta){ + return (to - from) * delta + from; +}; + +Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; + +// global timers + +var instances = {}, timers = {}; + +var loop = function(){ + var now = Date.now(); + for (var i = this.length; i--;){ + var instance = this[i]; + if (instance) instance.step(now); + } +}; + +var pushInstance = function(fps){ + var list = instances[fps] || (instances[fps] = []); + list.push(this); + if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list); +}; + +var pullInstance = function(fps){ + var list = instances[fps]; + if (list){ + list.erase(this); + if (!list.length && timers[fps]){ + delete instances[fps]; + timers[fps] = clearInterval(timers[fps]); + } + } +}; + +})(); + + +/* +--- + +name: Fx.CSS + +description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. + +license: MIT-style license. + +requires: [Fx, Element.Style] + +provides: Fx.CSS + +... +*/ + +Fx.CSS = new Class({ + + Extends: Fx, + + //prepares the base from/to object + + prepare: function(element, property, values){ + values = Array.from(values); + var from = values[0], to = values[1]; + if (to == null){ + to = from; + from = element.getStyle(property); + var unit = this.options.unit; + // adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299 + if (unit && from && typeof from == 'string' && from.slice(-unit.length) != unit && parseFloat(from) != 0){ + element.setStyle(property, to + unit); + var value = element.getComputedStyle(property); + // IE and Opera support pixelLeft or pixelWidth + if (!(/px$/.test(value))){ + value = element.style[('pixel-' + property).camelCase()]; + if (value == null){ + // adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + var left = element.style.left; + element.style.left = to + unit; + value = element.style.pixelLeft; + element.style.left = left; + } + } + from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0); + element.setStyle(property, from + unit); + } + } + return {from: this.parse(from), to: this.parse(to)}; + }, + + //parses a value into an array + + parse: function(value){ + value = Function.from(value)(); + value = (typeof value == 'string') ? value.split(' ') : Array.from(value); + return value.map(function(val){ + val = String(val); + var found = false; + Object.each(Fx.CSS.Parsers, function(parser, key){ + if (found) return; + var parsed = parser.parse(val); + if (parsed || parsed === 0) found = {value: parsed, parser: parser}; + }); + found = found || {value: val, parser: Fx.CSS.Parsers.String}; + return found; + }); + }, + + //computes by a from and to prepared objects, using their parsers. + + compute: function(from, to, delta){ + var computed = []; + (Math.min(from.length, to.length)).times(function(i){ + computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); + }); + computed.$family = Function.from('fx:css:value'); + return computed; + }, + + //serves the value as settable + + serve: function(value, unit){ + if (typeOf(value) != 'fx:css:value') value = this.parse(value); + var returned = []; + value.each(function(bit){ + returned = returned.concat(bit.parser.serve(bit.value, unit)); + }); + return returned; + }, + + //renders the change to an element + + render: function(element, property, value, unit){ + element.setStyle(property, this.serve(value, unit)); + }, + + //searches inside the page css to find the values for a selector + + search: function(selector){ + if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; + var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$'); + + var searchStyles = function(rules){ + Array.each(rules, function(rule, i){ + if (rule.media){ + searchStyles(rule.rules || rule.cssRules); + return; + } + if (!rule.style) return; + var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ + return m.toLowerCase(); + }) : null; + if (!selectorText || !selectorTest.test(selectorText)) return; + Object.each(Element.Styles, function(value, style){ + if (!rule.style[style] || Element.ShortStyles[style]) return; + value = String(rule.style[style]); + to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value; + }); + }); + }; + + Array.each(document.styleSheets, function(sheet, j){ + var href = sheet.href; + if (href && href.indexOf('://') > -1 && href.indexOf(document.domain) == -1) return; + var rules = sheet.rules || sheet.cssRules; + searchStyles(rules); + }); + return Fx.CSS.Cache[selector] = to; + } + +}); + +Fx.CSS.Cache = {}; + +Fx.CSS.Parsers = { + + Color: { + parse: function(value){ + if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); + return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; + }, + compute: function(from, to, delta){ + return from.map(function(value, i){ + return Math.round(Fx.compute(from[i], to[i], delta)); + }); + }, + serve: function(value){ + return value.map(Number); + } + }, + + Number: { + parse: parseFloat, + compute: Fx.compute, + serve: function(value, unit){ + return (unit) ? value + unit : value; + } + }, + + String: { + parse: Function.from(false), + compute: function(zero, one){ + return one; + }, + serve: function(zero){ + return zero; + } + } + +}; + + + + +/* +--- + +name: Fx.Tween + +description: Formerly Fx.Style, effect to transition any CSS property for an element. + +license: MIT-style license. + +requires: Fx.CSS + +provides: [Fx.Tween, Element.fade, Element.highlight] + +... +*/ + +Fx.Tween = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(property, now){ + if (arguments.length == 1){ + now = property; + property = this.property || this.options.property; + } + this.render(this.element, property, now, this.options.unit); + return this; + }, + + start: function(property, from, to){ + if (!this.check(property, from, to)) return this; + var args = Array.flatten(arguments); + this.property = this.options.property || args.shift(); + var parsed = this.prepare(this.element, this.property, args); + return this.parent(parsed.from, parsed.to); + } + +}); + +Element.Properties.tween = { + + set: function(options){ + this.get('tween').cancel().setOptions(options); + return this; + }, + + get: function(){ + var tween = this.retrieve('tween'); + if (!tween){ + tween = new Fx.Tween(this, {link: 'cancel'}); + this.store('tween', tween); + } + return tween; + } + +}; + +Element.implement({ + + tween: function(property, from, to){ + this.get('tween').start(property, from, to); + return this; + }, + + fade: function(how){ + var fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle; + if (args[1] == null) args[1] = 'toggle'; + switch (args[1]){ + case 'in': method = 'start'; args[1] = 1; break; + case 'out': method = 'start'; args[1] = 0; break; + case 'show': method = 'set'; args[1] = 1; break; + case 'hide': method = 'set'; args[1] = 0; break; + case 'toggle': + var flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1); + method = 'start'; + args[1] = flag ? 0 : 1; + this.store('fade:flag', !flag); + toggle = true; + break; + default: method = 'start'; + } + if (!toggle) this.eliminate('fade:flag'); + fade[method].apply(fade, args); + var to = args[args.length - 1]; + if (method == 'set' || to != 0) this.setStyle('visibility', to == 0 ? 'hidden' : 'visible'); + else fade.chain(function(){ + this.element.setStyle('visibility', 'hidden'); + this.callChain(); + }); + return this; + }, + + highlight: function(start, end){ + if (!end){ + end = this.retrieve('highlight:original', this.getStyle('background-color')); + end = (end == 'transparent') ? '#fff' : end; + } + var tween = this.get('tween'); + tween.start('background-color', start || '#ffff88', end).chain(function(){ + this.setStyle('background-color', this.retrieve('highlight:original')); + tween.callChain(); + }.bind(this)); + return this; + } + +}); + + +/* +--- + +name: Fx.Morph + +description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules. + +license: MIT-style license. + +requires: Fx.CSS + +provides: Fx.Morph + +... +*/ + +Fx.Morph = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(now){ + if (typeof now == 'string') now = this.search(now); + for (var p in now) this.render(this.element, p, now[p], this.options.unit); + return this; + }, + + compute: function(from, to, delta){ + var now = {}; + for (var p in from) now[p] = this.parent(from[p], to[p], delta); + return now; + }, + + start: function(properties){ + if (!this.check(properties)) return this; + if (typeof properties == 'string') properties = this.search(properties); + var from = {}, to = {}; + for (var p in properties){ + var parsed = this.prepare(this.element, p, properties[p]); + from[p] = parsed.from; + to[p] = parsed.to; + } + return this.parent(from, to); + } + +}); + +Element.Properties.morph = { + + set: function(options){ + this.get('morph').cancel().setOptions(options); + return this; + }, + + get: function(){ + var morph = this.retrieve('morph'); + if (!morph){ + morph = new Fx.Morph(this, {link: 'cancel'}); + this.store('morph', morph); + } + return morph; + } + +}; + +Element.implement({ + + morph: function(props){ + this.get('morph').start(props); + return this; + } + +}); + + +/* +--- + +name: Fx.Transitions + +description: Contains a set of advanced transitions to be used with any of the Fx Classes. + +license: MIT-style license. + +credits: + - Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. + +requires: Fx + +provides: Fx.Transitions + +... +*/ + +Fx.implement({ + + getTransition: function(){ + var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; + if (typeof trans == 'string'){ + var data = trans.split(':'); + trans = Fx.Transitions; + trans = trans[data[0]] || trans[data[0].capitalize()]; + if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; + } + return trans; + } + +}); + +Fx.Transition = function(transition, params){ + params = Array.from(params); + var easeIn = function(pos){ + return transition(pos, params); + }; + return Object.append(easeIn, { + easeIn: easeIn, + easeOut: function(pos){ + return 1 - transition(1 - pos, params); + }, + easeInOut: function(pos){ + return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2; + } + }); +}; + +Fx.Transitions = { + + linear: function(zero){ + return zero; + } + +}; + + + +Fx.Transitions.extend = function(transitions){ + for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); +}; + +Fx.Transitions.extend({ + + Pow: function(p, x){ + return Math.pow(p, x && x[0] || 6); + }, + + Expo: function(p){ + return Math.pow(2, 8 * (p - 1)); + }, + + Circ: function(p){ + return 1 - Math.sin(Math.acos(p)); + }, + + Sine: function(p){ + return 1 - Math.cos(p * Math.PI / 2); + }, + + Back: function(p, x){ + x = x && x[0] || 1.618; + return Math.pow(p, 2) * ((x + 1) * p - x); + }, + + Bounce: function(p){ + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2){ + if (p >= (7 - 4 * a) / 11){ + value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + Elastic: function(p, x){ + return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3); + } + +}); + +['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ + Fx.Transitions[transition] = new Fx.Transition(function(p){ + return Math.pow(p, i + 2); + }); +}); + + +/* +--- + +name: Request + +description: Powerful all purpose Request Class. Uses XMLHTTPRequest. + +license: MIT-style license. + +requires: [Object, Element, Chain, Events, Options, Browser] + +provides: Request + +... +*/ + +(function(){ + +var empty = function(){}, + progressSupport = ('onprogress' in new Browser.Request); + +var Request = this.Request = new Class({ + + Implements: [Chain, Events, Options], + + options: {/* + onRequest: function(){}, + onLoadstart: function(event, xhr){}, + onProgress: function(event, xhr){}, + onComplete: function(){}, + onCancel: function(){}, + onSuccess: function(responseText, responseXML){}, + onFailure: function(xhr){}, + onException: function(headerName, value){}, + onTimeout: function(){}, + user: '', + password: '',*/ + url: '', + data: '', + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }, + async: true, + format: false, + method: 'post', + link: 'ignore', + isSuccess: null, + emulation: true, + urlEncoded: true, + encoding: 'utf-8', + evalScripts: false, + evalResponse: false, + timeout: 0, + noCache: false + }, + + initialize: function(options){ + this.xhr = new Browser.Request(); + this.setOptions(options); + this.headers = this.options.headers; + }, + + onStateChange: function(){ + var xhr = this.xhr; + if (xhr.readyState != 4 || !this.running) return; + this.running = false; + this.status = 0; + Function.attempt(function(){ + var status = xhr.status; + this.status = (status == 1223) ? 204 : status; + }.bind(this)); + xhr.onreadystatechange = empty; + if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; + clearTimeout(this.timer); + + this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML}; + if (this.options.isSuccess.call(this, this.status)) + this.success(this.response.text, this.response.xml); + else + this.failure(); + }, + + isSuccess: function(){ + var status = this.status; + return (status >= 200 && status < 300); + }, + + isRunning: function(){ + return !!this.running; + }, + + processScripts: function(text){ + if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text); + return text.stripScripts(this.options.evalScripts); + }, + + success: function(text, xml){ + this.onSuccess(this.processScripts(text), xml); + }, + + onSuccess: function(){ + this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); + }, + + failure: function(){ + this.onFailure(); + }, + + onFailure: function(){ + this.fireEvent('complete').fireEvent('failure', this.xhr); + }, + + loadstart: function(event){ + this.fireEvent('loadstart', [event, this.xhr]); + }, + + progress: function(event){ + this.fireEvent('progress', [event, this.xhr]); + }, + + timeout: function(){ + this.fireEvent('timeout', this.xhr); + }, + + setHeader: function(name, value){ + this.headers[name] = value; + return this; + }, + + getHeader: function(name){ + return Function.attempt(function(){ + return this.xhr.getResponseHeader(name); + }.bind(this)); + }, + + check: function(){ + if (!this.running) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + send: function(options){ + if (!this.check(options)) return this; + + this.options.isSuccess = this.options.isSuccess || this.isSuccess; + this.running = true; + + var type = typeOf(options); + if (type == 'string' || type == 'element') options = {data: options}; + + var old = this.options; + options = Object.append({data: old.data, url: old.url, method: old.method}, options); + var data = options.data, url = String(options.url), method = options.method.toLowerCase(); + + switch (typeOf(data)){ + case 'element': data = document.id(data).toQueryString(); break; + case 'object': case 'hash': data = Object.toQueryString(data); + } + + if (this.options.format){ + var format = 'format=' + this.options.format; + data = (data) ? format + '&' + data : format; + } + + if (this.options.emulation && !['get', 'post'].contains(method)){ + var _method = '_method=' + method; + data = (data) ? _method + '&' + data : _method; + method = 'post'; + } + + if (this.options.urlEncoded && ['post', 'put'].contains(method)){ + var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; + this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding; + } + + if (!url) url = document.location.pathname; + + var trimPosition = url.lastIndexOf('/'); + if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition); + + if (this.options.noCache) + url += (url.indexOf('?') > -1 ? '&' : '?') + String.uniqueID(); + + if (data && (method == 'get' || method == 'delete')){ + url += (url.indexOf('?') > -1 ? '&' : '?') + data; + data = null; + } + + var xhr = this.xhr; + if (progressSupport){ + xhr.onloadstart = this.loadstart.bind(this); + xhr.onprogress = this.progress.bind(this); + } + + xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password); + if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true; + + xhr.onreadystatechange = this.onStateChange.bind(this); + + Object.each(this.headers, function(value, key){ + try { + xhr.setRequestHeader(key, value); + } catch (e){ + this.fireEvent('exception', [key, value]); + } + }, this); + + this.fireEvent('request'); + xhr.send(data); + if (!this.options.async) this.onStateChange(); + else if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this); + return this; + }, + + cancel: function(){ + if (!this.running) return this; + this.running = false; + var xhr = this.xhr; + xhr.abort(); + clearTimeout(this.timer); + xhr.onreadystatechange = empty; + if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; + this.xhr = new Browser.Request(); + this.fireEvent('cancel'); + return this; + } + +}); + +var methods = {}; +['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ + methods[method] = function(data){ + var object = { + method: method + }; + if (data != null) object.data = data; + return this.send(object); + }; +}); + +Request.implement(methods); + +Element.Properties.send = { + + set: function(options){ + var send = this.get('send').cancel(); + send.setOptions(options); + return this; + }, + + get: function(){ + var send = this.retrieve('send'); + if (!send){ + send = new Request({ + data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') + }); + this.store('send', send); + } + return send; + } + +}; + +Element.implement({ + + send: function(url){ + var sender = this.get('send'); + sender.send({data: this, url: url || sender.options.url}); + return this; + } + +}); + +})(); + + +/* +--- + +name: Request.HTML + +description: Extends the basic Request Class with additional methods for interacting with HTML responses. + +license: MIT-style license. + +requires: [Element, Request] + +provides: Request.HTML + +... +*/ + +Request.HTML = new Class({ + + Extends: Request, + + options: { + update: false, + append: false, + evalScripts: true, + filter: false, + headers: { + Accept: 'text/html, application/xml, text/xml, */*' + } + }, + + success: function(text){ + var options = this.options, response = this.response; + + response.html = text.stripScripts(function(script){ + response.javascript = script; + }); + + var match = response.html.match(/]*>([\s\S]*?)<\/body>/i); + if (match) response.html = match[1]; + var temp = new Element('div').set('html', response.html); + + response.tree = temp.childNodes; + response.elements = temp.getElements(options.filter || '*'); + + if (options.filter) response.tree = response.elements; + if (options.update){ + var update = document.id(options.update).empty(); + if (options.filter) update.adopt(response.elements); + else update.set('html', response.html); + } else if (options.append){ + var append = document.id(options.append); + if (options.filter) response.elements.reverse().inject(append); + else append.adopt(temp.getChildren()); + } + if (options.evalScripts) Browser.exec(response.javascript); + + this.onSuccess(response.tree, response.elements, response.html, response.javascript); + } + +}); + +Element.Properties.load = { + + set: function(options){ + var load = this.get('load').cancel(); + load.setOptions(options); + return this; + }, + + get: function(){ + var load = this.retrieve('load'); + if (!load){ + load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'}); + this.store('load', load); + } + return load; + } + +}; + +Element.implement({ + + load: function(){ + this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString})); + return this; + } + +}); + + +/* +--- + +name: JSON + +description: JSON encoder and decoder. + +license: MIT-style license. + +SeeAlso: + +requires: [Array, String, Number, Function] + +provides: JSON + +... +*/ + +if (typeof JSON == 'undefined') this.JSON = {}; + + + +(function(){ + +var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}; + +var escape = function(chr){ + return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4); +}; + +JSON.validate = function(string){ + string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). + replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). + replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + + return (/^[\],:{}\s]*$/).test(string); +}; + +JSON.encode = JSON.stringify ? function(obj){ + return JSON.stringify(obj); +} : function(obj){ + if (obj && obj.toJSON) obj = obj.toJSON(); + + switch (typeOf(obj)){ + case 'string': + return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"'; + case 'array': + return '[' + obj.map(JSON.encode).clean() + ']'; + case 'object': case 'hash': + var string = []; + Object.each(obj, function(value, key){ + var json = JSON.encode(value); + if (json) string.push(JSON.encode(key) + ':' + json); + }); + return '{' + string + '}'; + case 'number': case 'boolean': return '' + obj; + case 'null': return 'null'; + } + + return null; +}; + +JSON.secure = true; + + +JSON.decode = function(string, secure){ + if (!string || typeOf(string) != 'string') return null; + + if (secure == null) secure = JSON.secure; + if (secure){ + if (JSON.parse) return JSON.parse(string); + if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.'); + } + + return eval('(' + string + ')'); +}; + +})(); + + +/* +--- + +name: Request.JSON + +description: Extends the basic Request Class with additional methods for sending and receiving JSON data. + +license: MIT-style license. + +requires: [Request, JSON] + +provides: Request.JSON + +... +*/ + +Request.JSON = new Class({ + + Extends: Request, + + options: { + /*onError: function(text, error){},*/ + secure: true + }, + + initialize: function(options){ + this.parent(options); + Object.append(this.headers, { + 'Accept': 'application/json', + 'X-Request': 'JSON' + }); + }, + + success: function(text){ + var json; + try { + json = this.response.json = JSON.decode(text, this.options.secure); + } catch (error){ + this.fireEvent('error', [text, error]); + return; + } + if (json == null) this.onFailure(); + else this.onSuccess(json, text); + } + +}); + + +/* +--- + +name: Cookie + +description: Class for creating, reading, and deleting browser Cookies. + +license: MIT-style license. + +credits: + - Based on the functions by Peter-Paul Koch (http://quirksmode.org). + +requires: [Options, Browser] + +provides: Cookie + +... +*/ + +var Cookie = new Class({ + + Implements: Options, + + options: { + path: '/', + domain: false, + duration: false, + secure: false, + document: document, + encode: true + }, + + initialize: function(key, options){ + this.key = key; + this.setOptions(options); + }, + + write: function(value){ + if (this.options.encode) value = encodeURIComponent(value); + if (this.options.domain) value += '; domain=' + this.options.domain; + if (this.options.path) value += '; path=' + this.options.path; + if (this.options.duration){ + var date = new Date(); + date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); + value += '; expires=' + date.toGMTString(); + } + if (this.options.secure) value += '; secure'; + this.options.document.cookie = this.key + '=' + value; + return this; + }, + + read: function(){ + var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); + return (value) ? decodeURIComponent(value[1]) : null; + }, + + dispose: function(){ + new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write(''); + return this; + } + +}); + +Cookie.write = function(key, value, options){ + return new Cookie(key, options).write(value); +}; + +Cookie.read = function(key){ + return new Cookie(key).read(); +}; + +Cookie.dispose = function(key, options){ + return new Cookie(key, options).dispose(); +}; + + +/* +--- + +name: DOMReady + +description: Contains the custom event domready. + +license: MIT-style license. + +requires: [Browser, Element, Element.Event] + +provides: [DOMReady, DomReady] + +... +*/ + +(function(window, document){ + +var ready, + loaded, + checks = [], + shouldPoll, + timer, + testElement = document.createElement('div'); + +var domready = function(){ + clearTimeout(timer); + if (ready) return; + Browser.loaded = ready = true; + document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check); + + document.fireEvent('domready'); + window.fireEvent('domready'); +}; + +var check = function(){ + for (var i = checks.length; i--;) if (checks[i]()){ + domready(); + return true; + } + return false; +}; + +var poll = function(){ + clearTimeout(timer); + if (!check()) timer = setTimeout(poll, 10); +}; + +document.addListener('DOMContentLoaded', domready); + +/**/ +// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/ +// testElement.doScroll() throws when the DOM is not ready, only in the top window +var doScrollWorks = function(){ + try { + testElement.doScroll(); + return true; + } catch (e){} + return false; +}; +// If doScroll works already, it can't be used to determine domready +// e.g. in an iframe +if (testElement.doScroll && !doScrollWorks()){ + checks.push(doScrollWorks); + shouldPoll = true; +} +/**/ + +if (document.readyState) checks.push(function(){ + var state = document.readyState; + return (state == 'loaded' || state == 'complete'); +}); + +if ('onreadystatechange' in document) document.addListener('readystatechange', check); +else shouldPoll = true; + +if (shouldPoll) poll(); + +Element.Events.domready = { + onAdd: function(fn){ + if (ready) fn.call(this); + } +}; + +// Make sure that domready fires before load +Element.Events.load = { + base: 'load', + onAdd: function(fn){ + if (loaded && this == window) fn.call(this); + }, + condition: function(){ + if (this == window){ + domready(); + delete Element.Events.load; + } + return true; + } +}; + +// This is based on the custom load event +window.addEvent('load', function(){ + loaded = true; +}); + +})(window, document); + diff --git a/pyload/webui/themes/default/js/static/mootools-core.min.js b/pyload/webui/themes/default/js/static/mootools-core.min.js new file mode 100644 index 000000000..354f94196 --- /dev/null +++ b/pyload/webui/themes/default/js/static/mootools-core.min.js @@ -0,0 +1,491 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/core/8423c12ffd6a6bfcde9ea22554aec795 + +packager build: + - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady + +copyrights: + - [MooTools](http://mootools.net) + +licenses: + - [MIT License](http://mootools.net/license.txt) +... +*/ + +(function(){this.MooTools={version:"1.5.0",build:"0f7b690afee9349b15909f33016a25d2e4d9f4e3"};var o=this.typeOf=function(i){if(i==null){return"null";}if(i.$family!=null){return i.$family(); +}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if("callee" in i){return"arguments"; +}if("item" in i){return"collection";}}}return typeof i;};var j=this.instanceOf=function(t,i){if(t==null){return false;}var s=t.$constructor||t.constructor; +while(s){if(s===i){return true;}s=s.parent;}if(!t.hasOwnProperty){return false;}return t instanceof i;};var f=this.Function;var p=true;for(var k in {toString:1}){p=null; +}if(p){p=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];}f.prototype.overloadSetter=function(s){var i=this; +return function(u,t){if(u==null){return this;}if(s||typeof u!="string"){for(var v in u){i.call(this,v,u[v]);}if(p){for(var w=p.length;w--;){v=p[w];if(u.hasOwnProperty(v)){i.call(this,v,u[v]); +}}}}else{i.call(this,u,t);}return this;};};f.prototype.overloadGetter=function(s){var i=this;return function(u){var v,t;if(typeof u!="string"){v=u;}else{if(arguments.length>1){v=arguments; +}else{if(s){v=[u];}}}if(v){t={};for(var w=0;w>>0; +b>>0;b>>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a>>0,b=Array(d);for(var a=0;a>>0; +b-1;},test:function(a,b){return((typeOf(a)=="regexp")?a:new RegExp(""+a,b)).test(this); +},trim:function(){return String(this).replace(/^\s+|\s+$/g,"");},clean:function(){return String(this).replace(/\s+/g," ").trim();},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase(); +});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase(); +});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this); +},hexToRgb:function(b){var a=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g); +return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1); +}return(a[c]!=null)?a[c]:"";});}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0); +return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype; +g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this; +if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b); +},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={}; +for(var e=0,b=g.length;e]*>([\s\S]*?)<\/script>/gi,function(m,n){e+=n+"\n";return""; +});if(k===true){j.exec(e);}else{if(typeOf(k)=="function"){k(e,l);}}return l;});j.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event}); +this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,k){d[e]=k;});this.Document=f.$constructor=new Type("Document",function(){}); +f.$family=Function.from("document").hide();Document.mirror(function(e,k){f[e]=k;});f.html=f.documentElement;if(!f.head){f.head=f.getElementsByTagName("head")[0]; +}if(f.execCommand){try{f.execCommand("BackgroundImageCache",false,true);}catch(c){}}if(this.attachEvent&&!this.addEventListener){var b=function(){this.detachEvent("onunload",b); +f.head=f.html=f.window=null;};this.attachEvent("onunload",b);}var g=Array.from;try{g(f.html.childNodes);}catch(c){Array.from=function(k){if(typeof k!="string"&&Type.isEnumerable(k)&&typeOf(k)!="array"){var e=k.length,l=new Array(e); +while(e--){l[e]=k[e];}return l;}return g(k);};var h=Array.prototype,i=h.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var k=h[e]; +Array[e]=function(l){return k.apply(Array.from(l),i.call(arguments,1));};});}})();(function(){var b={};var a=this.DOMEvent=new Type("DOMEvent",function(c,g){if(!g){g=window; +}c=c||g.event;if(c.$extended){return c;}this.event=c;this.$extended=true;this.shift=c.shiftKey;this.control=c.ctrlKey;this.alt=c.altKey;this.meta=c.metaKey; +var i=this.type=c.type;var h=c.target||c.srcElement;while(h&&h.nodeType==3){h=h.parentNode;}this.target=document.id(h);if(i.indexOf("key")==0){var d=this.code=(c.which||c.keyCode); +this.key=b[d];if(i=="keydown"||i=="keyup"){if(d>111&&d<124){this.key="f"+(d-111);}else{if(d>95&&d<106){this.key=d-96;}}}if(this.key==null){this.key=String.fromCharCode(d).toLowerCase(); +}}else{if(i=="click"||i=="dblclick"||i=="contextmenu"||i=="DOMMouseScroll"||i.indexOf("mouse")==0){var j=g.document;j=(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body; +this.page={x:(c.pageX!=null)?c.pageX:c.clientX+j.scrollLeft,y:(c.pageY!=null)?c.pageY:c.clientY+j.scrollTop};this.client={x:(c.pageX!=null)?c.pageX-g.pageXOffset:c.clientX,y:(c.pageY!=null)?c.pageY-g.pageYOffset:c.clientY}; +if(i=="DOMMouseScroll"||i=="mousewheel"){this.wheel=(c.wheelDelta)?c.wheelDelta/120:-(c.detail||0)/3;}this.rightClick=(c.which==3||c.button==2);if(i=="mouseover"||i=="mouseout"){var k=c.relatedTarget||c[(i=="mouseover"?"from":"to")+"Element"]; +while(k&&k.nodeType==3){k=k.parentNode;}this.relatedTarget=document.id(k);}}else{if(i.indexOf("touch")==0||i.indexOf("gesture")==0){this.rotation=c.rotation; +this.scale=c.scale;this.targetTouches=c.targetTouches;this.changedTouches=c.changedTouches;var f=this.touches=c.touches;if(f&&f[0]){var e=f[0];this.page={x:e.pageX,y:e.pageY}; +this.client={x:e.clientX,y:e.clientY};}}}}if(!this.client){this.client={};}if(!this.page){this.page={};}});a.implement({stop:function(){return this.preventDefault().stopPropagation(); +},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); +}else{this.event.returnValue=false;}return this;}});a.defineKey=function(d,c){b[d]=c;return this;};a.defineKeys=a.defineKey.overloadSetter(true);a.defineKeys({"38":"up","40":"down","37":"left","39":"right","27":"esc","32":"space","8":"backspace","9":"tab","46":"delete","13":"enter"}); +})();(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h};}var g=function(){e(this);if(g.$prototyping){return this; +}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;return i;}.extend(this).implement(h); +g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.'); +}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments); +};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone(); +break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.'); +}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h}); +return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this; +}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping; +return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j; +for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments)); +return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty(); +return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d); +this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; +},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c); +}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this; +},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue; +}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments)); +if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})(); +(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p; +var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length; +return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o; +}}}};var h=function(u){var r=u.expressions;for(var p=0;p+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(//,"["+f(">+~`!@$%^&={}\\;/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(//g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")); +function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n]; +if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,""); +}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")}); +}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"}); +}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)"); +break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break; +case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I); +};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o); +};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var k={},m={},d=Object.prototype.toString; +k.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};k.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(d.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML"); +};k.setDocument=function(w){var p=w.nodeType;if(p==9){}else{if(p){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return; +}this.document=w;var A=w.documentElement,o=this.getUIDXML(A),s=m[o],r;if(s){for(r in s){this[r]=s[r];}return;}s=m[o]={};s.root=A;s.isXMLDocument=this.isXML(w); +s.brokenStarGEBTN=s.starSelectsClosedQSA=s.idGetsName=s.brokenMixedCaseQSA=s.brokenGEBCN=s.brokenCheckedQSA=s.brokenEmptyAttributeQSA=s.isHTMLDocument=s.nativeMatchesSelector=false; +var q,u,y,z,t;var x,v="slick_uniqueid";var c=w.createElement("div");var n=w.body||w.getElementsByTagName("body")[0]||A;n.appendChild(c);try{c.innerHTML=''; +s.isHTMLDocument=!!w.getElementById(v);}catch(C){}if(s.isHTMLDocument){c.style.display="none";c.appendChild(w.createComment(""));u=(c.getElementsByTagName("*").length>1); +try{c.innerHTML="foo";x=c.getElementsByTagName("*");q=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");}catch(C){}s.brokenStarGEBTN=u||q;try{c.innerHTML=''; +s.idGetsName=w.getElementById(v)===c.firstChild;}catch(C){}if(c.getElementsByClassName){try{c.innerHTML='';c.getElementsByClassName("b").length; +c.firstChild.className="b";z=(c.getElementsByClassName("b").length!=2);}catch(C){}try{c.innerHTML='';y=(c.getElementsByClassName("a").length!=2); +}catch(C){}s.brokenGEBCN=z||y;}if(c.querySelectorAll){try{c.innerHTML="foo";x=c.querySelectorAll("*");s.starSelectsClosedQSA=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/"); +}catch(C){}try{c.innerHTML='';s.brokenMixedCaseQSA=!c.querySelectorAll(".MiX").length;}catch(C){}try{c.innerHTML=''; +s.brokenCheckedQSA=(c.querySelectorAll(":checked").length==0);}catch(C){}try{c.innerHTML='';s.brokenEmptyAttributeQSA=(c.querySelectorAll('[class*=""]').length!=0); +}catch(C){}}try{c.innerHTML='
          ';t=(c.firstChild.getAttribute("action")!="s");}catch(C){}s.nativeMatchesSelector=A.matches||A.mozMatchesSelector||A.webkitMatchesSelector; +if(s.nativeMatchesSelector){try{s.nativeMatchesSelector.call(A,":slick");s.nativeMatchesSelector=null;}catch(C){}}}try{A.slick_expando=1;delete A.slick_expando; +s.getUID=this.getUIDHTML;}catch(C){s.getUID=this.getUIDXML;}n.removeChild(c);c=x=n=null;s.getAttribute=(s.isHTMLDocument&&t)?function(G,E){var H=this.attributeGetters[E]; +if(H){return H.call(G);}var F=G.getAttributeNode(E);return(F)?F.nodeValue:null;}:function(F,E){var G=this.attributeGetters[E];return(G)?G.call(F):F.getAttribute(E); +};s.hasAttribute=(A&&this.isNativeCode(A.hasAttribute))?function(F,E){return F.hasAttribute(E);}:function(F,E){F=F.getAttributeNode(E);return !!(F&&(F.specified||F.nodeValue)); +};var D=A&&this.isNativeCode(A.contains),B=w&&this.isNativeCode(w.contains);s.contains=(D&&B)?function(E,F){return E.contains(F);}:(D&&!B)?function(E,F){return E===F||((E===w)?w.documentElement:E).contains(F); +}:(A&&A.compareDocumentPosition)?function(E,F){return E===F||!!(E.compareDocumentPosition(F)&16);}:function(E,F){if(F){do{if(F===E){return true;}}while((F=F.parentNode)); +}return false;};s.documentSorter=(A.compareDocumentPosition)?function(F,E){if(!F.compareDocumentPosition||!E.compareDocumentPosition){return 0;}return F.compareDocumentPosition(E)&4?-1:F===E?0:1; +}:("sourceIndex" in A)?function(F,E){if(!F.sourceIndex||!E.sourceIndex){return 0;}return F.sourceIndex-E.sourceIndex;}:(w.createRange)?function(H,F){if(!H.ownerDocument||!F.ownerDocument){return 0; +}var G=H.ownerDocument.createRange(),E=F.ownerDocument.createRange();G.setStart(H,0);G.setEnd(H,0);E.setStart(F,0);E.setEnd(F,0);return G.compareBoundaryPoints(Range.START_TO_END,E); +}:null;A=null;for(r in s){this[r]=s[r];}};var f=/^([#.]?)((?:[\w-]+|\*))$/,h=/\[.+[*$^]=(?:""|'')?\]/,g={};k.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]); +if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U); +}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(f);simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors; +}E=U.getElementsByTagName(v);if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors; +}A=U.getElementById(v);if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A); +}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v); +if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+e.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*"); +for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p); +}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||g[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&h.test(z))||(!y&&z.indexOf(",")>-1)||e.disableQSA){break querySelector; +}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null; +}else{E=U.querySelectorAll(S);}}catch(Q){g[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0; +A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p); +}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z; +return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID; +if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator; +if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1)); +this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search; +}}else{if(s&&w){for(L=0,K=N.length;L1)){this.sort(p);}return(s)?(p[0]||null):p;};k.uidx=1;k.uidk="slick-uniqueid";k.getUIDXML=function(n){var c=n.getAttribute(this.uidk); +if(!c){c=this.uidx++;n.setAttribute(this.uidk,c);}return c;};k.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};k.sort=function(c){if(!this.documentSorter){return c; +}c.sort(this.documentSorter);return c;};k.cacheNTH={};k.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;k.parseNTHArgument=function(q){var o=q.match(this.matchNTH); +if(!o){return false;}var p=o[2]||false;var n=o[1]||1;if(n=="-"){n=-1;}var c=+o[3]||0;o=(p=="n")?{a:n,b:c}:(p=="odd")?{a:2,b:1}:(p=="even")?{a:2,b:0}:{a:0,b:n}; +return(this.cacheNTH[q]=o);};k.createNTHPseudo=function(p,n,c,o){return function(s,q){var u=this.getUID(s);if(!this[c][u]){var A=s.parentNode;if(!A){return false; +}var r=A[p],t=1;if(o){var z=s.nodeName;do{if(r.nodeName!=z){continue;}this[c][this.getUID(r)]=t++;}while((r=r[n]));}else{do{if(r.nodeType!=1){continue; +}this[c][this.getUID(r)]=t++;}while((r=r[n]));}}q=q||"n";var v=this.cacheNTH[q]||this.parseNTHArgument(q);if(!v){return false;}var y=v.a,x=v.b,w=this[c][u]; +if(y==0){return x==w;}if(y>0){if(w":function(p,c,r,o,n,q){if((p=p.firstChild)){do{if(p.nodeType==1){this.push(p,c,r,o,n,q); +}}while((p=p.nextSibling));}},"+":function(p,c,r,o,n,q){while((p=p.nextSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);break;}}},"^":function(p,c,r,o,n,q){p=p.firstChild; +if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:+"](p,c,r,o,n,q);}}},"~":function(q,c,s,p,n,r){while((q=q.nextSibling)){if(q.nodeType!=1){continue; +}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}},"++":function(p,c,r,o,n,q){this["combinator:+"](p,c,r,o,n,q); +this["combinator:!+"](p,c,r,o,n,q);},"~~":function(p,c,r,o,n,q){this["combinator:~"](p,c,r,o,n,q);this["combinator:!~"](p,c,r,o,n,q);},"!":function(p,c,r,o,n,q){while((p=p.parentNode)){if(p!==this.document){this.push(p,c,r,o,n,q); +}}},"!>":function(p,c,r,o,n,q){p=p.parentNode;if(p!==this.document){this.push(p,c,r,o,n,q);}},"!+":function(p,c,r,o,n,q){while((p=p.previousSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q); +break;}}},"!^":function(p,c,r,o,n,q){p=p.lastChild;if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:!+"](p,c,r,o,n,q);}}},"!~":function(q,c,s,p,n,r){while((q=q.previousSibling)){if(q.nodeType!=1){continue; +}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}}};for(var i in j){k["combinator:"+i]=j[i];}var l={empty:function(c){var n=c.firstChild; +return !(n&&n.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,n){return !this.matchNode(c,n);},contains:function(c,n){return(c.innerText||c.textContent||"").indexOf(n)>-1; +},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false; +}}return true;},"only-child":function(o){var n=o;while((n=n.previousSibling)){if(n.nodeType==1){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeType==1){return false; +}}return true;},"nth-child":k.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":k.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":k.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":k.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(n,c){return this["pseudo:nth-child"](n,""+(c+1)); +},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var n=c.nodeName; +while((c=c.previousSibling)){if(c.nodeName==n){return false;}}return true;},"last-of-type":function(c){var n=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==n){return false; +}}return true;},"only-of-type":function(o){var n=o,p=o.nodeName;while((n=n.previousSibling)){if(n.nodeName==p){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeName==p){return false; +}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex")); +},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var b in l){k["pseudo:"+b]=l[b];}var a=k.attributeGetters={"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for"); +},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style"); +},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;},type:function(){return this.getAttribute("type"); +},maxlength:function(){var c=this.getAttributeNode("maxLength");return(c&&c.specified)?c.nodeValue:null;}};a.MAXLENGTH=a.maxLength=a.maxlength;var e=k.Slick=(this.Slick||{}); +e.version="1.1.7";e.search=function(n,o,c){return k.search(n,o,c);};e.find=function(c,n){return k.search(c,n,null,true);};e.contains=function(c,n){k.setDocument(c); +return k.contains(c,n);};e.getAttribute=function(n,c){k.setDocument(n);return k.getAttribute(n,c);};e.hasAttribute=function(n,c){k.setDocument(n);return k.hasAttribute(n,c); +};e.match=function(n,c){if(!(n&&c)){return false;}if(!c||c===n){return true;}k.setDocument(n);return k.matchNode(n,c);};e.defineAttributeGetter=function(c,n){k.attributeGetters[c]=n; +return this;};e.lookupAttributeGetter=function(c){return k.attributeGetters[c];};e.definePseudo=function(c,n){k["pseudo:"+c]=function(p,o){return n.call(p,o); +};return this;};e.lookupPseudo=function(c){var n=k["pseudo:"+c];if(n){return function(o){return n.call(this,o);};}return null;};e.override=function(n,c){k.override(n,c); +return this;};e.isXML=k.isXML;e.uidOf=function(c){return k.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this); +var Element=this.Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={}; +}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0];b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var a,f=0,c=d.length; +f=this.length){delete this[g--]; +}return e;}.protect());}Array.forEachMethod(function(g,e){Elements.implement(e,g);});Array.mirror(Elements);var d;try{d=(document.createElement("").name=="x"); +}catch(b){}var c=function(e){return(""+e).replace(/&/g,"&").replace(/"/g,""");};Document.implement({newElement:function(e,g){if(g&&g.checked!=null){g.defaultChecked=g.checked; +}if(d&&g){e="<"+e;if(g.name){e+=' name="'+c(g.name)+'"';}if(g.type){e+=' type="'+c(g.type)+'"';}e+=">";delete g.name;delete g.type;}return this.id(this.createElement(e)).set(g); +}});})();(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(e){return this.createTextNode(e);},getDocument:function(){return this; +},getWindow:function(){return this.window;},id:(function(){var e={string:function(L,K,l){L=Slick.find(l,"#"+L.replace(/(\W)/g,"\\$1"));return(L)?e.element(L,K):null; +},element:function(K,L){Slick.uidOf(K);if(!L&&!K.$family&&!(/^(?:object|embed)$/i).test(K.tagName)){var l=K.fireEvent;K._fireEvent=function(M,N){return l(M,N); +};Object.append(K,Element.Prototype);}return K;},object:function(K,L,l){if(K.toElement){return e.element(K.toElement(l),L);}return null;}};e.textnode=e.whitespace=e.window=e.document=function(l){return l; +};return function(K,M,L){if(K&&K.$family&&K.uniqueNumber){return K;}var l=typeOf(K);return(e[l])?e[l](K,M,L||document):null;};})()});if(window.$==null){Window.implement("$",function(e,l){return document.id(e,l,this.document); +});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(e){return Slick.search(this,e,new Elements); +},getElement:function(e){return document.id(Slick.find(this,e));}});var p={contains:function(e){return Slick.contains(this,e);}};if(!document.contains){Document.implement(p); +}if(!document.createElement("div").contains){Element.implement(p);}var v=function(L,K){if(!L){return K;}L=Object.clone(Slick.parse(L));var l=L.expressions; +for(var e=l.length;e--;){l[e][0].combinator=K;}return L;};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(e,l){Element.implement(l,function(K){return this.getElement(v(K,e)); +});});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(e,l){Element.implement(l,function(K){return this.getElements(v(K,e)); +});});Element.implement({getFirst:function(e){return document.id(Slick.search(this,v(e,">"))[0]);},getLast:function(e){return document.id(Slick.search(this,v(e,">")).getLast()); +},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(e){return document.id(Slick.find(this,"#"+(""+e).replace(/(\W)/g,"\\$1"))); +},match:function(e){return !e||Slick.match(this,e);}});if(window.$$==null){Window.implement("$$",function(e){if(arguments.length==1){if(typeof e=="string"){return Slick.search(this.document,e,new Elements); +}else{if(Type.isEnumerable(e)){return new Elements(e);}}}return new Elements(arguments);});}var A={before:function(l,e){var K=e.parentNode;if(K){K.insertBefore(l,e); +}},after:function(l,e){var K=e.parentNode;if(K){K.insertBefore(l,e.nextSibling);}},bottom:function(l,e){e.appendChild(l);},top:function(l,e){e.insertBefore(l,e.firstChild); +}};A.inside=A.bottom;var n={},d={};var o={};Array.forEach(["type","value","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","rowSpan","tabIndex","useMap"],function(e){o[e.toLowerCase()]=e; +});o.html="innerHTML";o.text=(document.createElement("div").textContent==null)?"innerText":"textContent";Object.forEach(o,function(l,e){d[e]=function(K,L){K[l]=L; +};n[e]=function(K){return K[l];};});var B=["compact","nowrap","ismap","declare","noshade","checked","disabled","readOnly","multiple","selected","noresize","defer","defaultChecked","autofocus","controls","autoplay","loop"]; +var k={};Array.forEach(B,function(e){var l=e.toLowerCase();k[l]=e;d[l]=function(K,L){K[e]=!!L;};n[l]=function(K){return !!K[e];};});Object.append(d,{"class":function(e,l){("className" in e)?e.className=(l||""):e.setAttribute("class",l); +},"for":function(e,l){("htmlFor" in e)?e.htmlFor=l:e.setAttribute("for",l);},style:function(e,l){(e.style)?e.style.cssText=l:e.setAttribute("style",l); +},value:function(e,l){e.value=(l!=null)?l:"";}});n["class"]=function(e){return("className" in e)?e.className||null:e.getAttribute("class");};var f=document.createElement("button"); +try{f.type="button";}catch(E){}if(f.type!="button"){d.type=function(e,l){e.setAttribute("type",l);};}f=null;var s=document.createElement("input");s.value="t"; +s.type="submit";if(s.value!="t"){d.type=function(l,e){var K=l.value;l.type=e;l.value=K;};}s=null;var u=(function(e){e.random="attribute";return(e.getAttribute("random")=="attribute"); +})(document.createElement("div"));var i=(function(e){e.innerHTML='';return e.cloneNode(true).firstChild.childNodes.length!=1; +})(document.createElement("div"));var j=!!document.createElement("div").classList;var F=function(e){var l=(e||"").clean().split(" "),K={};return l.filter(function(L){if(L!==""&&!K[L]){return K[L]=L; +}});};var t=function(e){this.classList.add(e);};var g=function(e){this.classList.remove(e);};Element.implement({setProperty:function(l,K){var L=d[l.toLowerCase()]; +if(L){L(this,K);}else{var e;if(u){e=this.retrieve("$attributeWhiteList",{});}if(K==null){this.removeAttribute(l);if(u){delete e[l];}}else{this.setAttribute(l,""+K); +if(u){e[l]=true;}}}return this;},setProperties:function(e){for(var l in e){this.setProperty(l,e[l]);}return this;},getProperty:function(M){var K=n[M.toLowerCase()]; +if(K){return K(this);}if(u){var l=this.getAttributeNode(M),L=this.retrieve("$attributeWhiteList",{});if(!l){return null;}if(l.expando&&!L[M]){var N=this.outerHTML; +if(N.substr(0,N.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(M)<0){return null;}L[M]=true;}}var e=Slick.getAttribute(this,M);return(!e&&!Slick.hasAttribute(this,M))?null:e; +},getProperties:function(){var e=Array.from(arguments);return e.map(this.getProperty,this).associate(e);},removeProperty:function(e){return this.setProperty(e,null); +},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;},set:function(K,l){var e=Element.Properties[K];(e&&e.set)?e.set.call(this,l):this.setProperty(K,l); +}.overloadSetter(),get:function(l){var e=Element.Properties[l];return(e&&e.get)?e.get.apply(this):this.getProperty(l);}.overloadGetter(),erase:function(l){var e=Element.Properties[l]; +(e&&e.erase)?e.erase.apply(this):this.removeProperty(l);return this;},hasClass:j?function(e){return this.classList.contains(e);}:function(e){return this.className.clean().contains(e," "); +},addClass:j?function(e){F(e).forEach(t,this);return this;}:function(e){this.className=F(e+" "+this.className).join(" ");return this;},removeClass:j?function(e){F(e).forEach(g,this); +return this;}:function(e){var l=F(this.className);F(e).forEach(l.erase,l);this.className=l.join(" ");return this;},toggleClass:function(e,l){if(l==null){l=!this.hasClass(e); +}return(l)?this.addClass(e):this.removeClass(e);},adopt:function(){var L=this,e,N=Array.flatten(arguments),M=N.length;if(M>1){L=e=document.createDocumentFragment(); +}for(var K=0;K1){L=document.createDocumentFragment(); +for(var N=0,e=O.length;N";a=(x.childNodes.length==1);if(!a){var w="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),b=document.createDocumentFragment(),y=w.length; +while(y--){b.createElement(w[y]);}}x=null;h=Function.attempt(function(){var e=document.createElement("table");e.innerHTML="";return true; +});var c=document.createElement("tr"),r="";c.innerHTML=r;C=(c.innerHTML==r);c=null;if(!h||!C||!a){Element.Properties.html.set=(function(l){var e={table:[1,"","
          "],select:[1,""],tbody:[2,"","
          "],tr:[3,"","
          "]}; +e.thead=e.tfoot=e.tbody;return function(K){var L=e[this.get("tag")];if(!L&&!a){L=[0,"",""];}if(!L){return l.call(this,K);}var O=L[0],N=document.createElement("div"),M=N; +if(!a){b.appendChild(N);}N.innerHTML=[L[1],K,L[2]].flatten().join("");while(O--){M=M.firstChild;}this.empty().adopt(M.childNodes);if(!a){b.removeChild(N); +}N=null;};})(Element.Properties.html.set);}var q=document.createElement("form");q.innerHTML="";if(q.firstChild.value!="s"){Element.Properties.value={set:function(N){var l=this.get("tag"); +if(l!="select"){return this.setProperty("value",N);}var K=this.getElements("option");N=String(N);for(var L=0;L0||r==null?"visible":"hidden";};var p=function(r,v,u){var t=r.style,s=t.filter||r.getComputedStyle("filter")||"";t.filter=(v.test(s)?s.replace(v,u):s+" "+u).trim(); +if(!t.filter){t.removeAttribute("filter");}};var h=(j?function(s,r){s.style.opacity=r;}:(g?function(s,r){if(!s.currentStyle||!s.currentStyle.hasLayout){s.style.zoom=1; +}if(r==null||r==1){p(s,q,"");if(r==1&&i(s)!=1){p(s,q,"alpha(opacity=100)");}}else{p(s,q,"alpha(opacity="+(r*100).limit(0,100).round()+")");}}:b));var i=(j?function(s){var r=s.style.opacity||s.getComputedStyle("opacity"); +return(r=="")?1:r.toFloat();}:(g?function(s){var t=(s.style.filter||s.getComputedStyle("filter")),r;if(t){r=t.match(q);}return(r==null||t==null)?1:(r[1]/100); +}:function(s){var r=s.retrieve("$opacity");if(r==null){r=(s.style.visibility=="hidden"?0:1);}return r;}));var d=(l.style.cssFloat==null)?"styleFloat":"cssFloat",a={left:"0%",top:"0%",center:"50%",right:"100%",bottom:"100%"},c=(l.style.backgroundPositionX!=null); +var m=function(r,s){if(s=="backgroundPosition"){r.removeAttribute(s+"X");s+="Y";}r.removeAttribute(s);};Element.implement({getComputedStyle:function(t){if(!n&&this.currentStyle){return this.currentStyle[t.camelCase()]; +}var s=Element.getDocument(this).defaultView,r=s?s.getComputedStyle(this,null):null;return(r)?r.getPropertyValue((t==d)?"float":t.hyphenate()):"";},setStyle:function(s,r){if(s=="opacity"){if(r!=null){r=parseFloat(r); +}h(this,r);return this;}s=(s=="float"?d:s).camelCase();if(typeOf(r)!="string"){var t=(Element.Styles[s]||"@").split(" ");r=Array.from(r).map(function(v,u){if(!t[u]){return""; +}return(typeOf(v)=="number")?t[u].replace("@",Math.round(v)):v;}).join(" ");}else{if(r==String(Number(r))){r=Math.round(r);}}this.style[s]=r;if((r==""||r==null)&&e&&this.style.removeAttribute){m(this.style,s); +}return this;},getStyle:function(x){if(x=="opacity"){return i(this);}x=(x=="float"?d:x).camelCase();var r=this.style[x];if(!r||x=="zIndex"){if(Element.ShortStyles.hasOwnProperty(x)){r=[]; +for(var w in Element.ShortStyles[x]){r.push(this.getStyle(w));}return r.join(" ");}r=this.getComputedStyle(x);}if(c&&/^backgroundPosition[XY]?$/.test(x)){return r.replace(/(top|right|bottom|left)/g,function(s){return a[s]; +})||"0px";}if(!r&&x=="backgroundPosition"){return"0px 0px";}if(r){r=String(r);var u=r.match(/rgba?\([\d\s,]+\)/);if(u){r=r.replace(u[0],u[0].rgbToHex()); +}}if(!n&&!this.style[x]){if((/^(height|width)$/).test(x)&&!(/px$/.test(r))){var t=(x=="width")?["left","right"]:["top","bottom"],v=0;t.each(function(s){v+=this.getStyle("border-"+s+"-width").toInt()+this.getStyle("padding-"+s).toInt(); +},this);return this["offset"+x.capitalize()]-v+"px";}if((/^border(.+)Width|margin|padding/).test(x)&&isNaN(parseFloat(r))){return"0px";}}if(o&&/^border(Top|Right|Bottom|Left)?$/.test(x)&&/^#/.test(r)){return r.replace(/^(.+)\s(.+)\s(.+)$/,"$2 $3 $1"); +}return r;},setStyles:function(s){for(var r in s){this.setStyle(r,s[r]);}return this;},getStyles:function(){var r={};Array.flatten(arguments).each(function(s){r[s]=this.getStyle(s); +},this);return r;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundSize:"@px",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}; +Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(x){var w=Element.ShortStyles; +var s=Element.Styles;["margin","padding"].each(function(y){var z=y+x;w[y][z]=s[z]="@px";});var v="border"+x;w.border[v]=s[v]="@px @ rgb(@, @, @)";var u=v+"Width",r=v+"Style",t=v+"Color"; +w[v]={};w.borderWidth[u]=w[v][u]=s[u]="@px";w.borderStyle[r]=w[v][r]=s[r]="@";w.borderColor[t]=w[v][t]=s[t]="rgb(@, @, @)";});if(c){Element.ShortStyles.backgroundPosition={backgroundPositionX:"@",backgroundPositionY:"@"}; +}})();(function(){Element.Properties.events={set:function(b){this.addEvents(b);}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{}); +if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h,f); +}if(b.condition){d=function(k){if(b.condition.call(this,k,f)){return h.call(this,k);}return true;};}if(b.base){g=Function.from(b.base).call(this,f);}}var e=function(){return h.call(j); +};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new DOMEvent(k,j.getWindow());if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]); +}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events");if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d); +if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];if(f){if(f.onRemove){f.onRemove.call(this,d,e);}if(f.base){e=Function.from(f.base).call(this,e); +}}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; +},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);}return this;}var c=this.retrieve("events");if(!c){return this; +}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);},this);delete c[b]; +}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c); +}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b); +}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,hashchange:1,popstate:2,error:1,abort:1,scroll:1}; +Element.Events={mousewheel:{base:"onwheel" in document?"wheel":"onmousewheel" in document?"mousewheel":"DOMMouseScroll"}};var a=function(b){var c=b.relatedTarget; +if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c));};if("onmouseenter" in document.documentElement){Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2; +Element.MouseenterCheck=a;}else{Element.Events.mouseenter={base:"mouseover",condition:a};Element.Events.mouseleave={base:"mouseout",condition:a};}if(!window.addEventListener){Element.NativeEvents.propertychange=2; +Element.Events.change={base:function(){var b=this.type;return(this.get("tag")=="input"&&(b=="radio"||b=="checkbox"))?"propertychange":"change";},condition:function(b){return b.type!="propertychange"||b.event.propertyName=="checked"; +}};}})();(function(){var c=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2;var k=function(l,m,n,o,p){while(p&&p!=l){if(m(p,o)){return n.call(p,o,p); +}p=document.id(p.parentNode);}};var a={mouseenter:{base:"mouseover",condition:Element.MouseenterCheck},mouseleave:{base:"mouseout",condition:Element.MouseenterCheck},focus:{base:"focus"+(c?"":"in"),capture:true},blur:{base:c?"blur":"focusout",capture:true}}; +var b="$delegation:";var i=function(l){return{base:"focusin",remove:function(m,o){var p=m.retrieve(b+l+"listeners",{})[o];if(p&&p.forms){for(var n=p.forms.length; +n--;){p.forms[n].removeEvent(l,p.fns[n]);}}},listen:function(x,r,v,n,t,s){var o=(t.get("tag")=="form")?t:n.target.getParent("form");if(!o){return;}var u=x.retrieve(b+l+"listeners",{}),p=u[s]||{forms:[],fns:[]},m=p.forms,w=p.fns; +if(m.indexOf(o)!=-1){return;}m.push(o);var q=function(y){k(x,r,v,y,t);};o.addEvent(l,q);w.push(q);u[s]=p;x.store(b+l+"listeners",u);}};};var d=function(l){return{base:"focusin",listen:function(m,n,p,q,r){var o={blur:function(){this.removeEvents(o); +}};o[l]=function(s){k(m,n,p,s,r);};q.target.addEvents(o);}};};if(!c){Object.append(a,{submit:i("submit"),reset:i("reset"),change:d("change"),select:d("select")}); +}var h=Element.prototype,f=h.addEvent,j=h.removeEvent;var e=function(l,m){return function(r,q,n){if(r.indexOf(":relay")==-1){return l.call(this,r,q,n); +}var o=Slick.parse(r).expressions[0][0];if(o.pseudos[0].key!="relay"){return l.call(this,r,q,n);}var p=o.tag;o.pseudos.slice(1).each(function(s){p+=":"+s.key+(s.value?"("+s.value+")":""); +});l.call(this,r,q);return m.call(this,p,o.pseudos[0].value,q);};};var g={addEvent:function(v,q,x){var t=this.retrieve("$delegates",{}),r=t[v];if(r){for(var y in r){if(r[y].fn==x&&r[y].match==q){return this; +}}}var p=v,u=q,o=x,n=a[v]||{};v=n.base||p;q=function(B){return Slick.match(B,u);};var w=Element.Events[p];if(n.condition||w&&w.condition){var l=q,m=n.condition||w.condition; +q=function(C,B){return l(C,B)&&m.call(C,B,v);};}var z=this,s=String.uniqueID();var A=n.listen?function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){n.listen(z,q,x,B,C,s); +}}:function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){k(z,q,x,B,C);}};if(!r){r={};}r[s]={match:u,fn:o,delegator:A};t[p]=r;return f.call(this,v,A,n.capture); +},removeEvent:function(r,n,t,u){var q=this.retrieve("$delegates",{}),p=q[r];if(!p){return this;}if(u){var m=r,w=p[u].delegator,l=a[r]||{};r=l.base||m;if(l.remove){l.remove(this,u); +}delete p[u];q[m]=p;return j.call(this,r,w,l.capture);}var o,v;if(t){for(o in p){v=p[o];if(v.match==n&&v.fn==t){return g.removeEvent.call(this,r,n,t,o); +}}}else{for(o in p){v=p[o];if(v.match==n){g.removeEvent.call(this,r,n,v.fn,o);}}}return this;}};[Element,Window,Document].invoke("implement",{addEvent:e(f,g.addEvent),removeEvent:e(j,g.removeEvent)}); +})();(function(){var h=document.createElement("div"),e=document.createElement("div");h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null; +var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName);};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n); +}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight}; +},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(a(this)){return this.getWindow().getScroll(); +}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0};while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop; +n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}var n=(k(m,"position")=="static")?i:l; +while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}try{return m.offsetParent; +}catch(n){}return null;},getOffsets:function(){var n=this.getBoundingClientRect;if(n){var r=this.getBoundingClientRect(),p=document.id(this.getDocument().documentElement),q=p.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed"); +return{x:r.left.toInt()+t.x+((s)?0:q.x)-p.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-p.clientTop};}var o=this,m={x:0,y:0};if(a(this)){return m;}while(o&&!a(o)){m.x+=o.offsetLeft; +m.y+=o.offsetTop;o=o.offsetParent;}return m;},getPosition:function(p){var q=this.getOffsets(),n=this.getScrolls();var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition(); +return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates();}var m=this.getPosition(o),n=this.getSize(); +var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")}; +},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight}; +},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body; +return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize(); +return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box"; +}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName); +}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y; +},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x; +},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y; +},getLeft:function(){return this.getPosition().x;}});(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this; +this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval; +this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame-1&&e.indexOf(document.domain)==-1){return;}var h=g.rules||g.cssRules; +b(h);});return Fx.CSS.Cache[a]=d;}});Fx.CSS.Cache={};Fx.CSS.Parsers={Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true); +}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a)); +});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:Function.from(false),compute:function(b,a){return a; +},serve:function(a){return a;}}};Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);},set:function(b,a){if(arguments.length==1){a=b; +b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit);return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this; +}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);return this.parent(a.from,a.to); +}});Element.Properties.tween={set:function(a){this.get("tween").cancel().setOptions(a);return this;},get:function(){var a=this.retrieve("tween");if(!a){a=new Fx.Tween(this,{link:"cancel"}); +this.store("tween",a);}return a;}};Element.implement({tween:function(a,c,b){this.get("tween").start(a,c,b);return this;},fade:function(d){var e=this.get("tween"),g,c=["opacity"].append(arguments),a; +if(c[1]==null){c[1]="toggle";}switch(c[1]){case"in":g="start";c[1]=1;break;case"out":g="start";c[1]=0;break;case"show":g="set";c[1]=1;break;case"hide":g="set"; +c[1]=0;break;case"toggle":var b=this.retrieve("fade:flag",this.getStyle("opacity")==1);g="start";c[1]=b?0:1;this.store("fade:flag",!b);a=true;break;default:g="start"; +}if(!a){this.eliminate("fade:flag");}e[g].apply(e,c);var f=c[c.length-1];if(g=="set"||f!=0){this.setStyle("visibility",f==0?"hidden":"visible");}else{e.chain(function(){this.element.setStyle("visibility","hidden"); +this.callChain();});}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));a=(a=="transparent")?"#fff":a; +}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original")); +b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a); +},set:function(a){if(typeof a=="string"){a=this.search(a);}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={}; +for(var b in e){a[b]=this.parent(e[b],d[b],c);}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={}; +for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){this.get("morph").cancel().setOptions(a); +return this;},get:function(){var a=this.retrieve("morph");if(!a){a=new Fx.Morph(this,{link:"cancel"});this.store("morph",a);}return a;}};Element.implement({morph:function(a){this.get("morph").start(a); +return this;}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof a=="string"){var b=a.split(":"); +a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")];}}return a;}});Fx.Transition=function(c,b){b=Array.from(b); +var a=function(d){return c(d,b);};return Object.append(a,{easeIn:a,easeOut:function(d){return 1-c(1-d,b);},easeInOut:function(d){return(d<=0.5?c(2*d,b):(2-c(2*(1-d),b)))/2; +}});};Fx.Transitions={linear:function(a){return a;}};Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b]);}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a&&a[0]||6); +},Expo:function(a){return Math.pow(2,8*(a-1));},Circ:function(a){return 1-Math.sin(Math.acos(a));},Sine:function(a){return 1-Math.cos(a*Math.PI/2);},Back:function(b,a){a=a&&a[0]||1.618; +return Math.pow(b,2)*((a+1)*b-a);},Bounce:function(f){var e;for(var d=0,c=1;1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e; +},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,a+2); +});});(function(){var d=function(){},a=("onprogress" in new Browser.Request);var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(e){this.xhr=new Browser.Request(); +this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false; +this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d; +}clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml); +}else{this.failure();}},isSuccess:function(){var e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e); +}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); +},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(e){this.fireEvent("loadstart",[e,this.xhr]); +},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f; +return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.bind(this));},check:function(){if(!this.running){return true; +}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(o){if(!this.check(o)){return this; +}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options; +o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString(); +break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e; +j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g; +}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.indexOf("?")>-1?"&":"?")+String.uniqueID(); +}if(j&&(e=="get"||e=="delete")){f+=(f.indexOf("?")>-1?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this); +}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true; +}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]); +}},this);this.fireEvent("request");n.send(j);if(!this.options.async){this.onStateChange();}else{if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this); +}}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d; +if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e}; +if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e); +return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")}); +this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.options.url});return this;}});})(); +Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(f){var e=this.options,c=this.response; +c.html=f.stripScripts(function(h){c.javascript=h;});var d=c.html.match(/]*>([\s\S]*?)<\/body>/i);if(d){c.html=d[1];}var b=new Element("div").set("html",c.html); +c.tree=b.childNodes;c.elements=b.getElements(e.filter||"*");if(e.filter){c.tree=c.elements;}if(e.update){var g=document.id(e.update).empty();if(e.filter){g.adopt(c.elements); +}else{g.set("html",c.html);}}else{if(e.append){var a=document.id(e.append);if(e.filter){c.elements.reverse().inject(a);}else{a.adopt(b.getChildren());}}}if(e.evalScripts){Browser.exec(c.javascript); +}this.onSuccess(c.tree,c.elements,c.html,c.javascript);}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this; +},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",a);}return a; +}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return this;}});if(typeof JSON=="undefined"){this.JSON={}; +}(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4); +};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""); +return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON(); +}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[]; +Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj; +case"null":return"null";}return null;};JSON.secure=true;JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null;}if(secure==null){secure=JSON.secure; +}if(secure){if(JSON.parse){return JSON.parse(string);}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure."); +}}return eval("("+string+")");};})();Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"}); +},success:function(c){var b;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure(); +}else{this.onSuccess(b,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b; +this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path; +}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure"; +}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); +return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}}); +Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose(); +};(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a); +k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b); +if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h); +c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a); +}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this); +}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document); \ No newline at end of file diff --git a/pyload/webui/themes/default/js/static/mootools-more.js b/pyload/webui/themes/default/js/static/mootools-more.js new file mode 100644 index 000000000..c7f4a1a0e --- /dev/null +++ b/pyload/webui/themes/default/js/static/mootools-more.js @@ -0,0 +1,2856 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/more/c1cc18c2fff04bcc58921b4dff80a6f1 + +packager build: + - packager build More/Form.Request More/Fx.Reveal More/Sortables More/Request.Periodical More/Color + +... +*/ + +/* +--- + +script: More.js + +name: More + +description: MooTools More + +license: MIT-style license + +authors: + - Guillermo Rauch + - Thomas Aylott + - Scott Kyle + - Arian Stolwijk + - Tim Wienk + - Christoph Pojer + - Aaron Newton + - Jacob Thornton + +requires: + - Core/MooTools + +provides: [MooTools.More] + +... +*/ + +MooTools.More = { + version: '1.5.0', + build: '73db5e24e6e9c5c87b3a27aebef2248053f7db37' +}; + + +/* +--- + +script: Class.Binds.js + +name: Class.Binds + +description: Automagically binds specified methods in a class to the instance of the class. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Class + - MooTools.More + +provides: [Class.Binds] + +... +*/ + +Class.Mutators.Binds = function(binds){ + if (!this.prototype.initialize) this.implement('initialize', function(){}); + return Array.from(binds).concat(this.prototype.Binds || []); +}; + +Class.Mutators.initialize = function(initialize){ + return function(){ + Array.from(this.Binds).each(function(name){ + var original = this[name]; + if (original) this[name] = original.bind(this); + }, this); + return initialize.apply(this, arguments); + }; +}; + + +/* +--- + +script: Class.Occlude.js + +name: Class.Occlude + +description: Prevents a class from being applied to a DOM element twice. + +license: MIT-style license. + +authors: + - Aaron Newton + +requires: + - Core/Class + - Core/Element + - MooTools.More + +provides: [Class.Occlude] + +... +*/ + +Class.Occlude = new Class({ + + occlude: function(property, element){ + element = document.id(element || this.element); + var instance = element.retrieve(property || this.property); + if (instance && !this.occluded) + return (this.occluded = instance); + + this.occluded = false; + element.store(property || this.property, this); + return this.occluded; + } + +}); + + +/* +--- + +script: Class.Refactor.js + +name: Class.Refactor + +description: Extends a class onto itself with new property, preserving any items attached to the class's namespace. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Class + - MooTools.More + +# Some modules declare themselves dependent on Class.Refactor +provides: [Class.refactor, Class.Refactor] + +... +*/ + +Class.refactor = function(original, refactors){ + + Object.each(refactors, function(item, name){ + var origin = original.prototype[name]; + origin = (origin && origin.$origin) || origin || function(){}; + original.implement(name, (typeof item == 'function') ? function(){ + var old = this.previous; + this.previous = origin; + var value = item.apply(this, arguments); + this.previous = old; + return value; + } : item); + }); + + return original; + +}; + + +/* +--- + +script: Element.Measure.js + +name: Element.Measure + +description: Extends the Element native object to include methods useful in measuring dimensions. + +credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz" + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Element.Style + - Core/Element.Dimensions + - MooTools.More + +provides: [Element.Measure] + +... +*/ + +(function(){ + +var getStylesList = function(styles, planes){ + var list = []; + Object.each(planes, function(directions){ + Object.each(directions, function(edge){ + styles.each(function(style){ + list.push(style + '-' + edge + (style == 'border' ? '-width' : '')); + }); + }); + }); + return list; +}; + +var calculateEdgeSize = function(edge, styles){ + var total = 0; + Object.each(styles, function(value, style){ + if (style.test(edge)) total = total + value.toInt(); + }); + return total; +}; + +var isVisible = function(el){ + return !!(!el || el.offsetHeight || el.offsetWidth); +}; + + +Element.implement({ + + measure: function(fn){ + if (isVisible(this)) return fn.call(this); + var parent = this.getParent(), + toMeasure = []; + while (!isVisible(parent) && parent != document.body){ + toMeasure.push(parent.expose()); + parent = parent.getParent(); + } + var restore = this.expose(), + result = fn.call(this); + restore(); + toMeasure.each(function(restore){ + restore(); + }); + return result; + }, + + expose: function(){ + if (this.getStyle('display') != 'none') return function(){}; + var before = this.style.cssText; + this.setStyles({ + display: 'block', + position: 'absolute', + visibility: 'hidden' + }); + return function(){ + this.style.cssText = before; + }.bind(this); + }, + + getDimensions: function(options){ + options = Object.merge({computeSize: false}, options); + var dim = {x: 0, y: 0}; + + var getSize = function(el, options){ + return (options.computeSize) ? el.getComputedSize(options) : el.getSize(); + }; + + var parent = this.getParent('body'); + + if (parent && this.getStyle('display') == 'none'){ + dim = this.measure(function(){ + return getSize(this, options); + }); + } else if (parent){ + try { //safari sometimes crashes here, so catch it + dim = getSize(this, options); + }catch(e){} + } + + return Object.append(dim, (dim.x || dim.x === 0) ? { + width: dim.x, + height: dim.y + } : { + x: dim.width, + y: dim.height + } + ); + }, + + getComputedSize: function(options){ + + + options = Object.merge({ + styles: ['padding','border'], + planes: { + height: ['top','bottom'], + width: ['left','right'] + }, + mode: 'both' + }, options); + + var styles = {}, + size = {width: 0, height: 0}, + dimensions; + + if (options.mode == 'vertical'){ + delete size.width; + delete options.planes.width; + } else if (options.mode == 'horizontal'){ + delete size.height; + delete options.planes.height; + } + + getStylesList(options.styles, options.planes).each(function(style){ + styles[style] = this.getStyle(style).toInt(); + }, this); + + Object.each(options.planes, function(edges, plane){ + + var capitalized = plane.capitalize(), + style = this.getStyle(plane); + + if (style == 'auto' && !dimensions) dimensions = this.getDimensions(); + + style = styles[plane] = (style == 'auto') ? dimensions[plane] : style.toInt(); + size['total' + capitalized] = style; + + edges.each(function(edge){ + var edgesize = calculateEdgeSize(edge, styles); + size['computed' + edge.capitalize()] = edgesize; + size['total' + capitalized] += edgesize; + }); + + }, this); + + return Object.append(size, styles); + } + +}); + +})(); + + +/* +--- + +script: Element.Position.js + +name: Element.Position + +description: Extends the Element native object to include methods useful positioning elements relative to others. + +license: MIT-style license + +authors: + - Aaron Newton + - Jacob Thornton + +requires: + - Core/Options + - Core/Element.Dimensions + - Element.Measure + +provides: [Element.Position] + +... +*/ + +(function(original){ + +var local = Element.Position = { + + options: {/* + edge: false, + returnPos: false, + minimum: {x: 0, y: 0}, + maximum: {x: 0, y: 0}, + relFixedPosition: false, + ignoreMargins: false, + ignoreScroll: false, + allowNegative: false,*/ + relativeTo: document.body, + position: { + x: 'center', //left, center, right + y: 'center' //top, center, bottom + }, + offset: {x: 0, y: 0} + }, + + getOptions: function(element, options){ + options = Object.merge({}, local.options, options); + local.setPositionOption(options); + local.setEdgeOption(options); + local.setOffsetOption(element, options); + local.setDimensionsOption(element, options); + return options; + }, + + setPositionOption: function(options){ + options.position = local.getCoordinateFromValue(options.position); + }, + + setEdgeOption: function(options){ + var edgeOption = local.getCoordinateFromValue(options.edge); + options.edge = edgeOption ? edgeOption : + (options.position.x == 'center' && options.position.y == 'center') ? {x: 'center', y: 'center'} : + {x: 'left', y: 'top'}; + }, + + setOffsetOption: function(element, options){ + var parentOffset = {x: 0, y: 0}; + var parentScroll = {x: 0, y: 0}; + var offsetParent = element.measure(function(){ + return document.id(this.getOffsetParent()); + }); + + if (!offsetParent || offsetParent == element.getDocument().body) return; + + parentScroll = offsetParent.getScroll(); + parentOffset = offsetParent.measure(function(){ + var position = this.getPosition(); + if (this.getStyle('position') == 'fixed'){ + var scroll = window.getScroll(); + position.x += scroll.x; + position.y += scroll.y; + } + return position; + }); + + options.offset = { + parentPositioned: offsetParent != document.id(options.relativeTo), + x: options.offset.x - parentOffset.x + parentScroll.x, + y: options.offset.y - parentOffset.y + parentScroll.y + }; + }, + + setDimensionsOption: function(element, options){ + options.dimensions = element.getDimensions({ + computeSize: true, + styles: ['padding', 'border', 'margin'] + }); + }, + + getPosition: function(element, options){ + var position = {}; + options = local.getOptions(element, options); + var relativeTo = document.id(options.relativeTo) || document.body; + + local.setPositionCoordinates(options, position, relativeTo); + if (options.edge) local.toEdge(position, options); + + var offset = options.offset; + position.left = ((position.x >= 0 || offset.parentPositioned || options.allowNegative) ? position.x : 0).toInt(); + position.top = ((position.y >= 0 || offset.parentPositioned || options.allowNegative) ? position.y : 0).toInt(); + + local.toMinMax(position, options); + + if (options.relFixedPosition || relativeTo.getStyle('position') == 'fixed') local.toRelFixedPosition(relativeTo, position); + if (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position); + if (options.ignoreMargins) local.toIgnoreMargins(position, options); + + position.left = Math.ceil(position.left); + position.top = Math.ceil(position.top); + delete position.x; + delete position.y; + + return position; + }, + + setPositionCoordinates: function(options, position, relativeTo){ + var offsetY = options.offset.y, + offsetX = options.offset.x, + calc = (relativeTo == document.body) ? window.getScroll() : relativeTo.getPosition(), + top = calc.y, + left = calc.x, + winSize = window.getSize(); + + switch(options.position.x){ + case 'left': position.x = left + offsetX; break; + case 'right': position.x = left + offsetX + relativeTo.offsetWidth; break; + default: position.x = left + ((relativeTo == document.body ? winSize.x : relativeTo.offsetWidth) / 2) + offsetX; break; + } + + switch(options.position.y){ + case 'top': position.y = top + offsetY; break; + case 'bottom': position.y = top + offsetY + relativeTo.offsetHeight; break; + default: position.y = top + ((relativeTo == document.body ? winSize.y : relativeTo.offsetHeight) / 2) + offsetY; break; + } + }, + + toMinMax: function(position, options){ + var xy = {left: 'x', top: 'y'}, value; + ['minimum', 'maximum'].each(function(minmax){ + ['left', 'top'].each(function(lr){ + value = options[minmax] ? options[minmax][xy[lr]] : null; + if (value != null && ((minmax == 'minimum') ? position[lr] < value : position[lr] > value)) position[lr] = value; + }); + }); + }, + + toRelFixedPosition: function(relativeTo, position){ + var winScroll = window.getScroll(); + position.top += winScroll.y; + position.left += winScroll.x; + }, + + toIgnoreScroll: function(relativeTo, position){ + var relScroll = relativeTo.getScroll(); + position.top -= relScroll.y; + position.left -= relScroll.x; + }, + + toIgnoreMargins: function(position, options){ + position.left += options.edge.x == 'right' + ? options.dimensions['margin-right'] + : (options.edge.x != 'center' + ? -options.dimensions['margin-left'] + : -options.dimensions['margin-left'] + ((options.dimensions['margin-right'] + options.dimensions['margin-left']) / 2)); + + position.top += options.edge.y == 'bottom' + ? options.dimensions['margin-bottom'] + : (options.edge.y != 'center' + ? -options.dimensions['margin-top'] + : -options.dimensions['margin-top'] + ((options.dimensions['margin-bottom'] + options.dimensions['margin-top']) / 2)); + }, + + toEdge: function(position, options){ + var edgeOffset = {}, + dimensions = options.dimensions, + edge = options.edge; + + switch(edge.x){ + case 'left': edgeOffset.x = 0; break; + case 'right': edgeOffset.x = -dimensions.x - dimensions.computedRight - dimensions.computedLeft; break; + // center + default: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break; + } + + switch(edge.y){ + case 'top': edgeOffset.y = 0; break; + case 'bottom': edgeOffset.y = -dimensions.y - dimensions.computedTop - dimensions.computedBottom; break; + // center + default: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2)); break; + } + + position.x += edgeOffset.x; + position.y += edgeOffset.y; + }, + + getCoordinateFromValue: function(option){ + if (typeOf(option) != 'string') return option; + option = option.toLowerCase(); + + return { + x: option.test('left') ? 'left' + : (option.test('right') ? 'right' : 'center'), + y: option.test(/upper|top/) ? 'top' + : (option.test('bottom') ? 'bottom' : 'center') + }; + } + +}; + +Element.implement({ + + position: function(options){ + if (options && (options.x != null || options.y != null)){ + return (original ? original.apply(this, arguments) : this); + } + var position = this.setStyle('position', 'absolute').calculatePosition(options); + return (options && options.returnPos) ? position : this.setStyles(position); + }, + + calculatePosition: function(options){ + return local.getPosition(this, options); + } + +}); + +})(Element.prototype.position); + + +/* +--- + +script: IframeShim.js + +name: IframeShim + +description: Defines IframeShim, a class for obscuring select lists and flash objects in IE. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Element.Event + - Core/Element.Style + - Core/Options + - Core/Events + - Element.Position + - Class.Occlude + +provides: [IframeShim] + +... +*/ + +(function(){ + +var browsers = false; + + +this.IframeShim = new Class({ + + Implements: [Options, Events, Class.Occlude], + + options: { + className: 'iframeShim', + src: 'javascript:false;document.write("");', + display: false, + zIndex: null, + margin: 0, + offset: {x: 0, y: 0}, + browsers: browsers + }, + + property: 'IframeShim', + + initialize: function(element, options){ + this.element = document.id(element); + if (this.occlude()) return this.occluded; + this.setOptions(options); + this.makeShim(); + return this; + }, + + makeShim: function(){ + if (this.options.browsers){ + var zIndex = this.element.getStyle('zIndex').toInt(); + + if (!zIndex){ + zIndex = 1; + var pos = this.element.getStyle('position'); + if (pos == 'static' || !pos) this.element.setStyle('position', 'relative'); + this.element.setStyle('zIndex', zIndex); + } + zIndex = ((this.options.zIndex != null || this.options.zIndex === 0) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1; + if (zIndex < 0) zIndex = 1; + this.shim = new Element('iframe', { + src: this.options.src, + scrolling: 'no', + frameborder: 0, + styles: { + zIndex: zIndex, + position: 'absolute', + border: 'none', + filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)' + }, + 'class': this.options.className + }).store('IframeShim', this); + var inject = (function(){ + this.shim.inject(this.element, 'after'); + this[this.options.display ? 'show' : 'hide'](); + this.fireEvent('inject'); + }).bind(this); + if (!IframeShim.ready) window.addEvent('load', inject); + else inject(); + } else { + this.position = this.hide = this.show = this.dispose = Function.from(this); + } + }, + + position: function(){ + if (!IframeShim.ready || !this.shim) return this; + var size = this.element.measure(function(){ + return this.getSize(); + }); + if (this.options.margin != undefined){ + size.x = size.x - (this.options.margin * 2); + size.y = size.y - (this.options.margin * 2); + this.options.offset.x += this.options.margin; + this.options.offset.y += this.options.margin; + } + this.shim.set({width: size.x, height: size.y}).position({ + relativeTo: this.element, + offset: this.options.offset + }); + return this; + }, + + hide: function(){ + if (this.shim) this.shim.setStyle('display', 'none'); + return this; + }, + + show: function(){ + if (this.shim) this.shim.setStyle('display', 'block'); + return this.position(); + }, + + dispose: function(){ + if (this.shim) this.shim.dispose(); + return this; + }, + + destroy: function(){ + if (this.shim) this.shim.destroy(); + return this; + } + +}); + +})(); + +window.addEvent('load', function(){ + IframeShim.ready = true; +}); + + +/* +--- + +script: Mask.js + +name: Mask + +description: Creates a mask element to cover another. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Options + - Core/Events + - Core/Element.Event + - Class.Binds + - Element.Position + - IframeShim + +provides: [Mask] + +... +*/ + +var Mask = new Class({ + + Implements: [Options, Events], + + Binds: ['position'], + + options: {/* + onShow: function(){}, + onHide: function(){}, + onDestroy: function(){}, + onClick: function(event){}, + inject: { + where: 'after', + target: null, + }, + hideOnClick: false, + id: null, + destroyOnHide: false,*/ + style: {}, + 'class': 'mask', + maskMargins: false, + useIframeShim: true, + iframeShimOptions: {} + }, + + initialize: function(target, options){ + this.target = document.id(target) || document.id(document.body); + this.target.store('mask', this); + this.setOptions(options); + this.render(); + this.inject(); + }, + + render: function(){ + this.element = new Element('div', { + 'class': this.options['class'], + id: this.options.id || 'mask-' + String.uniqueID(), + styles: Object.merge({}, this.options.style, { + display: 'none' + }), + events: { + click: function(event){ + this.fireEvent('click', event); + if (this.options.hideOnClick) this.hide(); + }.bind(this) + } + }); + + this.hidden = true; + }, + + toElement: function(){ + return this.element; + }, + + inject: function(target, where){ + where = where || (this.options.inject ? this.options.inject.where : '') || (this.target == document.body ? 'inside' : 'after'); + target = target || (this.options.inject && this.options.inject.target) || this.target; + + this.element.inject(target, where); + + if (this.options.useIframeShim){ + this.shim = new IframeShim(this.element, this.options.iframeShimOptions); + + this.addEvents({ + show: this.shim.show.bind(this.shim), + hide: this.shim.hide.bind(this.shim), + destroy: this.shim.destroy.bind(this.shim) + }); + } + }, + + position: function(){ + this.resize(this.options.width, this.options.height); + + this.element.position({ + relativeTo: this.target, + position: 'topLeft', + ignoreMargins: !this.options.maskMargins, + ignoreScroll: this.target == document.body + }); + + return this; + }, + + resize: function(x, y){ + var opt = { + styles: ['padding', 'border'] + }; + if (this.options.maskMargins) opt.styles.push('margin'); + + var dim = this.target.getComputedSize(opt); + if (this.target == document.body){ + this.element.setStyles({width: 0, height: 0}); + var win = window.getScrollSize(); + if (dim.totalHeight < win.y) dim.totalHeight = win.y; + if (dim.totalWidth < win.x) dim.totalWidth = win.x; + } + this.element.setStyles({ + width: Array.pick([x, dim.totalWidth, dim.x]), + height: Array.pick([y, dim.totalHeight, dim.y]) + }); + + return this; + }, + + show: function(){ + if (!this.hidden) return this; + + window.addEvent('resize', this.position); + this.position(); + this.showMask.apply(this, arguments); + + return this; + }, + + showMask: function(){ + this.element.setStyle('display', 'block'); + this.hidden = false; + this.fireEvent('show'); + }, + + hide: function(){ + if (this.hidden) return this; + + window.removeEvent('resize', this.position); + this.hideMask.apply(this, arguments); + if (this.options.destroyOnHide) return this.destroy(); + + return this; + }, + + hideMask: function(){ + this.element.setStyle('display', 'none'); + this.hidden = true; + this.fireEvent('hide'); + }, + + toggle: function(){ + this[this.hidden ? 'show' : 'hide'](); + }, + + destroy: function(){ + this.hide(); + this.element.destroy(); + this.fireEvent('destroy'); + this.target.eliminate('mask'); + } + +}); + +Element.Properties.mask = { + + set: function(options){ + var mask = this.retrieve('mask'); + if (mask) mask.destroy(); + return this.eliminate('mask').store('mask:options', options); + }, + + get: function(){ + var mask = this.retrieve('mask'); + if (!mask){ + mask = new Mask(this, this.retrieve('mask:options')); + this.store('mask', mask); + } + return mask; + } + +}; + +Element.implement({ + + mask: function(options){ + if (options) this.set('mask', options); + this.get('mask').show(); + return this; + }, + + unmask: function(){ + this.get('mask').hide(); + return this; + } + +}); + + +/* +--- + +script: Spinner.js + +name: Spinner + +description: Adds a semi-transparent overlay over a dom element with a spinnin ajax icon. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Fx.Tween + - Core/Request + - Class.refactor + - Mask + +provides: [Spinner] + +... +*/ + +var Spinner = new Class({ + + Extends: Mask, + + Implements: Chain, + + options: {/* + message: false,*/ + 'class': 'spinner', + containerPosition: {}, + content: { + 'class': 'spinner-content' + }, + messageContainer: { + 'class': 'spinner-msg' + }, + img: { + 'class': 'spinner-img' + }, + fxOptions: { + link: 'chain' + } + }, + + initialize: function(target, options){ + this.target = document.id(target) || document.id(document.body); + this.target.store('spinner', this); + this.setOptions(options); + this.render(); + this.inject(); + + // Add this to events for when noFx is true; parent methods handle hide/show. + var deactivate = function(){ this.active = false; }.bind(this); + this.addEvents({ + hide: deactivate, + show: deactivate + }); + }, + + render: function(){ + this.parent(); + + this.element.set('id', this.options.id || 'spinner-' + String.uniqueID()); + + this.content = document.id(this.options.content) || new Element('div', this.options.content); + this.content.inject(this.element); + + if (this.options.message){ + this.msg = document.id(this.options.message) || new Element('p', this.options.messageContainer).appendText(this.options.message); + this.msg.inject(this.content); + } + + if (this.options.img){ + this.img = document.id(this.options.img) || new Element('div', this.options.img); + this.img.inject(this.content); + } + + this.element.set('tween', this.options.fxOptions); + }, + + show: function(noFx){ + if (this.active) return this.chain(this.show.bind(this)); + if (!this.hidden){ + this.callChain.delay(20, this); + return this; + } + + this.target.set('aria-busy', 'true'); + this.active = true; + + return this.parent(noFx); + }, + + showMask: function(noFx){ + var pos = function(){ + this.content.position(Object.merge({ + relativeTo: this.element + }, this.options.containerPosition)); + }.bind(this); + + if (noFx){ + this.parent(); + pos(); + } else { + if (!this.options.style.opacity) this.options.style.opacity = this.element.getStyle('opacity').toFloat(); + this.element.setStyles({ + display: 'block', + opacity: 0 + }).tween('opacity', this.options.style.opacity); + pos(); + this.hidden = false; + this.fireEvent('show'); + this.callChain(); + } + }, + + hide: function(noFx){ + if (this.active) return this.chain(this.hide.bind(this)); + if (this.hidden){ + this.callChain.delay(20, this); + return this; + } + + this.target.set('aria-busy', 'false'); + this.active = true; + + return this.parent(noFx); + }, + + hideMask: function(noFx){ + if (noFx) return this.parent(); + this.element.tween('opacity', 0).get('tween').chain(function(){ + this.element.setStyle('display', 'none'); + this.hidden = true; + this.fireEvent('hide'); + this.callChain(); + }.bind(this)); + }, + + destroy: function(){ + this.content.destroy(); + this.parent(); + this.target.eliminate('spinner'); + } + +}); + +Request = Class.refactor(Request, { + + options: { + useSpinner: false, + spinnerOptions: {}, + spinnerTarget: false + }, + + initialize: function(options){ + this._send = this.send; + this.send = function(options){ + var spinner = this.getSpinner(); + if (spinner) spinner.chain(this._send.pass(options, this)).show(); + else this._send(options); + return this; + }; + this.previous(options); + }, + + getSpinner: function(){ + if (!this.spinner){ + var update = document.id(this.options.spinnerTarget) || document.id(this.options.update); + if (this.options.useSpinner && update){ + update.set('spinner', this.options.spinnerOptions); + var spinner = this.spinner = update.get('spinner'); + ['complete', 'exception', 'cancel'].each(function(event){ + this.addEvent(event, spinner.hide.bind(spinner)); + }, this); + } + } + return this.spinner; + } + +}); + +Element.Properties.spinner = { + + set: function(options){ + var spinner = this.retrieve('spinner'); + if (spinner) spinner.destroy(); + return this.eliminate('spinner').store('spinner:options', options); + }, + + get: function(){ + var spinner = this.retrieve('spinner'); + if (!spinner){ + spinner = new Spinner(this, this.retrieve('spinner:options')); + this.store('spinner', spinner); + } + return spinner; + } + +}; + +Element.implement({ + + spin: function(options){ + if (options) this.set('spinner', options); + this.get('spinner').show(); + return this; + }, + + unspin: function(){ + this.get('spinner').hide(); + return this; + } + +}); + + +/* +--- + +script: String.QueryString.js + +name: String.QueryString + +description: Methods for dealing with URI query strings. + +license: MIT-style license + +authors: + - Sebastian Markbåge + - Aaron Newton + - Lennart Pilon + - Valerio Proietti + +requires: + - Core/Array + - Core/String + - MooTools.More + +provides: [String.QueryString] + +... +*/ + +String.implement({ + + parseQueryString: function(decodeKeys, decodeValues){ + if (decodeKeys == null) decodeKeys = true; + if (decodeValues == null) decodeValues = true; + + var vars = this.split(/[&;]/), + object = {}; + if (!vars.length) return object; + + vars.each(function(val){ + var index = val.indexOf('=') + 1, + value = index ? val.substr(index) : '', + keys = index ? val.substr(0, index - 1).match(/([^\]\[]+|(\B)(?=\]))/g) : [val], + obj = object; + if (!keys) return; + if (decodeValues) value = decodeURIComponent(value); + keys.each(function(key, i){ + if (decodeKeys) key = decodeURIComponent(key); + var current = obj[key]; + + if (i < keys.length - 1) obj = obj[key] = current || {}; + else if (typeOf(current) == 'array') current.push(value); + else obj[key] = current != null ? [current, value] : value; + }); + }); + + return object; + }, + + cleanQueryString: function(method){ + return this.split('&').filter(function(val){ + var index = val.indexOf('='), + key = index < 0 ? '' : val.substr(0, index), + value = val.substr(index + 1); + + return method ? method.call(null, key, value) : (value || value === 0); + }).join('&'); + } + +}); + + +/* +--- + +name: Events.Pseudos + +description: Adds the functionality to add pseudo events + +license: MIT-style license + +authors: + - Arian Stolwijk + +requires: [Core/Class.Extras, Core/Slick.Parser, MooTools.More] + +provides: [Events.Pseudos] + +... +*/ + +(function(){ + +Events.Pseudos = function(pseudos, addEvent, removeEvent){ + + var storeKey = '_monitorEvents:'; + + var storageOf = function(object){ + return { + store: object.store ? function(key, value){ + object.store(storeKey + key, value); + } : function(key, value){ + (object._monitorEvents || (object._monitorEvents = {}))[key] = value; + }, + retrieve: object.retrieve ? function(key, dflt){ + return object.retrieve(storeKey + key, dflt); + } : function(key, dflt){ + if (!object._monitorEvents) return dflt; + return object._monitorEvents[key] || dflt; + } + }; + }; + + var splitType = function(type){ + if (type.indexOf(':') == -1 || !pseudos) return null; + + var parsed = Slick.parse(type).expressions[0][0], + parsedPseudos = parsed.pseudos, + l = parsedPseudos.length, + splits = []; + + while (l--){ + var pseudo = parsedPseudos[l].key, + listener = pseudos[pseudo]; + if (listener != null) splits.push({ + event: parsed.tag, + value: parsedPseudos[l].value, + pseudo: pseudo, + original: type, + listener: listener + }); + } + return splits.length ? splits : null; + }; + + return { + + addEvent: function(type, fn, internal){ + var split = splitType(type); + if (!split) return addEvent.call(this, type, fn, internal); + + var storage = storageOf(this), + events = storage.retrieve(type, []), + eventType = split[0].event, + args = Array.slice(arguments, 2), + stack = fn, + self = this; + + split.each(function(item){ + var listener = item.listener, + stackFn = stack; + if (listener == false) eventType += ':' + item.pseudo + '(' + item.value + ')'; + else stack = function(){ + listener.call(self, item, stackFn, arguments, stack); + }; + }); + + events.include({type: eventType, event: fn, monitor: stack}); + storage.store(type, events); + + if (type != eventType) addEvent.apply(this, [type, fn].concat(args)); + return addEvent.apply(this, [eventType, stack].concat(args)); + }, + + removeEvent: function(type, fn){ + var split = splitType(type); + if (!split) return removeEvent.call(this, type, fn); + + var storage = storageOf(this), + events = storage.retrieve(type); + if (!events) return this; + + var args = Array.slice(arguments, 2); + + removeEvent.apply(this, [type, fn].concat(args)); + events.each(function(monitor, i){ + if (!fn || monitor.event == fn) removeEvent.apply(this, [monitor.type, monitor.monitor].concat(args)); + delete events[i]; + }, this); + + storage.store(type, events); + return this; + } + + }; + +}; + +var pseudos = { + + once: function(split, fn, args, monitor){ + fn.apply(this, args); + this.removeEvent(split.event, monitor) + .removeEvent(split.original, fn); + }, + + throttle: function(split, fn, args){ + if (!fn._throttled){ + fn.apply(this, args); + fn._throttled = setTimeout(function(){ + fn._throttled = false; + }, split.value || 250); + } + }, + + pause: function(split, fn, args){ + clearTimeout(fn._pause); + fn._pause = fn.delay(split.value || 250, this, args); + } + +}; + +Events.definePseudo = function(key, listener){ + pseudos[key] = listener; + return this; +}; + +Events.lookupPseudo = function(key){ + return pseudos[key]; +}; + +var proto = Events.prototype; +Events.implement(Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent)); + +['Request', 'Fx'].each(function(klass){ + if (this[klass]) this[klass].implement(Events.prototype); +}); + +})(); + + +/* +--- + +name: Element.Event.Pseudos + +description: Adds the functionality to add pseudo events for Elements + +license: MIT-style license + +authors: + - Arian Stolwijk + +requires: [Core/Element.Event, Core/Element.Delegation, Events.Pseudos] + +provides: [Element.Event.Pseudos, Element.Delegation.Pseudo] + +... +*/ + +(function(){ + +var pseudos = {relay: false}, + copyFromEvents = ['once', 'throttle', 'pause'], + count = copyFromEvents.length; + +while (count--) pseudos[copyFromEvents[count]] = Events.lookupPseudo(copyFromEvents[count]); + +DOMEvent.definePseudo = function(key, listener){ + pseudos[key] = listener; + return this; +}; + +var proto = Element.prototype; +[Element, Window, Document].invoke('implement', Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent)); + +})(); + + +/* +--- + +script: Form.Request.js + +name: Form.Request + +description: Handles the basic functionality of submitting a form and updating a dom element with the result. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Request.HTML + - Class.Binds + - Class.Occlude + - Spinner + - String.QueryString + - Element.Delegation.Pseudo + +provides: [Form.Request] + +... +*/ + +if (!window.Form) window.Form = {}; + +(function(){ + + Form.Request = new Class({ + + Binds: ['onSubmit', 'onFormValidate'], + + Implements: [Options, Events, Class.Occlude], + + options: {/* + onFailure: function(){}, + onSuccess: function(){}, // aliased to onComplete, + onSend: function(){}*/ + requestOptions: { + evalScripts: true, + useSpinner: true, + emulation: false, + link: 'ignore' + }, + sendButtonClicked: true, + extraData: {}, + resetForm: true + }, + + property: 'form.request', + + initialize: function(form, target, options){ + this.element = document.id(form); + if (this.occlude()) return this.occluded; + this.setOptions(options) + .setTarget(target) + .attach(); + }, + + setTarget: function(target){ + this.target = document.id(target); + if (!this.request){ + this.makeRequest(); + } else { + this.request.setOptions({ + update: this.target + }); + } + return this; + }, + + toElement: function(){ + return this.element; + }, + + makeRequest: function(){ + var self = this; + this.request = new Request.HTML(Object.merge({ + update: this.target, + emulation: false, + spinnerTarget: this.element, + method: this.element.get('method') || 'post' + }, this.options.requestOptions)).addEvents({ + success: function(tree, elements, html, javascript){ + ['complete', 'success'].each(function(evt){ + self.fireEvent(evt, [self.target, tree, elements, html, javascript]); + }); + }, + failure: function(){ + self.fireEvent('complete', arguments).fireEvent('failure', arguments); + }, + exception: function(){ + self.fireEvent('failure', arguments); + } + }); + return this.attachReset(); + }, + + attachReset: function(){ + if (!this.options.resetForm) return this; + this.request.addEvent('success', function(){ + Function.attempt(function(){ + this.element.reset(); + }.bind(this)); + if (window.OverText) OverText.update(); + }.bind(this)); + return this; + }, + + attach: function(attach){ + var method = (attach != false) ? 'addEvent' : 'removeEvent'; + this.element[method]('click:relay(button, input[type=submit])', this.saveClickedButton.bind(this)); + + var fv = this.element.retrieve('validator'); + if (fv) fv[method]('onFormValidate', this.onFormValidate); + else this.element[method]('submit', this.onSubmit); + + return this; + }, + + detach: function(){ + return this.attach(false); + }, + + //public method + enable: function(){ + return this.attach(); + }, + + //public method + disable: function(){ + return this.detach(); + }, + + onFormValidate: function(valid, form, event){ + //if there's no event, then this wasn't a submit event + if (!event) return; + var fv = this.element.retrieve('validator'); + if (valid || (fv && !fv.options.stopOnFailure)){ + event.stop(); + this.send(); + } + }, + + onSubmit: function(event){ + var fv = this.element.retrieve('validator'); + if (fv){ + //form validator was created after Form.Request + this.element.removeEvent('submit', this.onSubmit); + fv.addEvent('onFormValidate', this.onFormValidate); + fv.validate(event); + return; + } + if (event) event.stop(); + this.send(); + }, + + saveClickedButton: function(event, target){ + var targetName = target.get('name'); + if (!targetName || !this.options.sendButtonClicked) return; + this.options.extraData[targetName] = target.get('value') || true; + this.clickedCleaner = function(){ + delete this.options.extraData[targetName]; + this.clickedCleaner = function(){}; + }.bind(this); + }, + + clickedCleaner: function(){}, + + send: function(){ + var str = this.element.toQueryString().trim(), + data = Object.toQueryString(this.options.extraData); + + if (str) str += "&" + data; + else str = data; + + this.fireEvent('send', [this.element, str.parseQueryString()]); + this.request.send({ + data: str, + url: this.options.requestOptions.url || this.element.get('action') + }); + this.clickedCleaner(); + return this; + } + + }); + + Element.implement('formUpdate', function(update, options){ + var fq = this.retrieve('form.request'); + if (!fq){ + fq = new Form.Request(this, update, options); + } else { + if (update) fq.setTarget(update); + if (options) fq.setOptions(options).makeRequest(); + } + fq.send(); + return this; + }); + +})(); + + +/* +--- + +script: Element.Shortcuts.js + +name: Element.Shortcuts + +description: Extends the Element native object to include some shortcut methods. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Element.Style + - MooTools.More + +provides: [Element.Shortcuts] + +... +*/ + +Element.implement({ + + isDisplayed: function(){ + return this.getStyle('display') != 'none'; + }, + + isVisible: function(){ + var w = this.offsetWidth, + h = this.offsetHeight; + return (w == 0 && h == 0) ? false : (w > 0 && h > 0) ? true : this.style.display != 'none'; + }, + + toggle: function(){ + return this[this.isDisplayed() ? 'hide' : 'show'](); + }, + + hide: function(){ + var d; + try { + //IE fails here if the element is not in the dom + d = this.getStyle('display'); + } catch(e){} + if (d == 'none') return this; + return this.store('element:_originalDisplay', d || '').setStyle('display', 'none'); + }, + + show: function(display){ + if (!display && this.isDisplayed()) return this; + display = display || this.retrieve('element:_originalDisplay') || 'block'; + return this.setStyle('display', (display == 'none') ? 'block' : display); + }, + + swapClass: function(remove, add){ + return this.removeClass(remove).addClass(add); + } + +}); + +Document.implement({ + + clearSelection: function(){ + if (window.getSelection){ + var selection = window.getSelection(); + if (selection && selection.removeAllRanges) selection.removeAllRanges(); + } else if (document.selection && document.selection.empty){ + try { + //IE fails here if selected element is not in dom + document.selection.empty(); + } catch(e){} + } + } + +}); + + +/* +--- + +script: Fx.Reveal.js + +name: Fx.Reveal + +description: Defines Fx.Reveal, a class that shows and hides elements with a transition. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Fx.Morph + - Element.Shortcuts + - Element.Measure + +provides: [Fx.Reveal] + +... +*/ + +(function(){ + + +var hideTheseOf = function(object){ + var hideThese = object.options.hideInputs; + if (window.OverText){ + var otClasses = [null]; + OverText.each(function(ot){ + otClasses.include('.' + ot.options.labelClass); + }); + if (otClasses) hideThese += otClasses.join(', '); + } + return (hideThese) ? object.element.getElements(hideThese) : null; +}; + + +Fx.Reveal = new Class({ + + Extends: Fx.Morph, + + options: {/* + onShow: function(thisElement){}, + onHide: function(thisElement){}, + onComplete: function(thisElement){}, + heightOverride: null, + widthOverride: null,*/ + link: 'cancel', + styles: ['padding', 'border', 'margin'], + transitionOpacity: 'opacity' in document.documentElement, + mode: 'vertical', + display: function(){ + return this.element.get('tag') != 'tr' ? 'block' : 'table-row'; + }, + opacity: 1, + hideInputs: !('opacity' in document.documentElement) ? 'select, input, textarea, object, embed' : null + }, + + dissolve: function(){ + if (!this.hiding && !this.showing){ + if (this.element.getStyle('display') != 'none'){ + this.hiding = true; + this.showing = false; + this.hidden = true; + this.cssText = this.element.style.cssText; + + var startStyles = this.element.getComputedSize({ + styles: this.options.styles, + mode: this.options.mode + }); + if (this.options.transitionOpacity) startStyles.opacity = this.options.opacity; + + var zero = {}; + Object.each(startStyles, function(style, name){ + zero[name] = [style, 0]; + }); + + this.element.setStyles({ + display: Function.from(this.options.display).call(this), + overflow: 'hidden' + }); + + var hideThese = hideTheseOf(this); + if (hideThese) hideThese.setStyle('visibility', 'hidden'); + + this.$chain.unshift(function(){ + if (this.hidden){ + this.hiding = false; + this.element.style.cssText = this.cssText; + this.element.setStyle('display', 'none'); + if (hideThese) hideThese.setStyle('visibility', 'visible'); + } + this.fireEvent('hide', this.element); + this.callChain(); + }.bind(this)); + + this.start(zero); + } else { + this.callChain.delay(10, this); + this.fireEvent('complete', this.element); + this.fireEvent('hide', this.element); + } + } else if (this.options.link == 'chain'){ + this.chain(this.dissolve.bind(this)); + } else if (this.options.link == 'cancel' && !this.hiding){ + this.cancel(); + this.dissolve(); + } + return this; + }, + + reveal: function(){ + if (!this.showing && !this.hiding){ + if (this.element.getStyle('display') == 'none'){ + this.hiding = false; + this.showing = true; + this.hidden = false; + this.cssText = this.element.style.cssText; + + var startStyles; + this.element.measure(function(){ + startStyles = this.element.getComputedSize({ + styles: this.options.styles, + mode: this.options.mode + }); + }.bind(this)); + if (this.options.heightOverride != null) startStyles.height = this.options.heightOverride.toInt(); + if (this.options.widthOverride != null) startStyles.width = this.options.widthOverride.toInt(); + if (this.options.transitionOpacity){ + this.element.setStyle('opacity', 0); + startStyles.opacity = this.options.opacity; + } + + var zero = { + height: 0, + display: Function.from(this.options.display).call(this) + }; + Object.each(startStyles, function(style, name){ + zero[name] = 0; + }); + zero.overflow = 'hidden'; + + this.element.setStyles(zero); + + var hideThese = hideTheseOf(this); + if (hideThese) hideThese.setStyle('visibility', 'hidden'); + + this.$chain.unshift(function(){ + this.element.style.cssText = this.cssText; + this.element.setStyle('display', Function.from(this.options.display).call(this)); + if (!this.hidden) this.showing = false; + if (hideThese) hideThese.setStyle('visibility', 'visible'); + this.callChain(); + this.fireEvent('show', this.element); + }.bind(this)); + + this.start(startStyles); + } else { + this.callChain(); + this.fireEvent('complete', this.element); + this.fireEvent('show', this.element); + } + } else if (this.options.link == 'chain'){ + this.chain(this.reveal.bind(this)); + } else if (this.options.link == 'cancel' && !this.showing){ + this.cancel(); + this.reveal(); + } + return this; + }, + + toggle: function(){ + if (this.element.getStyle('display') == 'none'){ + this.reveal(); + } else { + this.dissolve(); + } + return this; + }, + + cancel: function(){ + this.parent.apply(this, arguments); + if (this.cssText != null) this.element.style.cssText = this.cssText; + this.hiding = false; + this.showing = false; + return this; + } + +}); + +Element.Properties.reveal = { + + set: function(options){ + this.get('reveal').cancel().setOptions(options); + return this; + }, + + get: function(){ + var reveal = this.retrieve('reveal'); + if (!reveal){ + reveal = new Fx.Reveal(this); + this.store('reveal', reveal); + } + return reveal; + } + +}; + +Element.Properties.dissolve = Element.Properties.reveal; + +Element.implement({ + + reveal: function(options){ + this.get('reveal').setOptions(options).reveal(); + return this; + }, + + dissolve: function(options){ + this.get('reveal').setOptions(options).dissolve(); + return this; + }, + + nix: function(options){ + var params = Array.link(arguments, {destroy: Type.isBoolean, options: Type.isObject}); + this.get('reveal').setOptions(options).dissolve().chain(function(){ + this[params.destroy ? 'destroy' : 'dispose'](); + }.bind(this)); + return this; + }, + + wink: function(){ + var params = Array.link(arguments, {duration: Type.isNumber, options: Type.isObject}); + var reveal = this.get('reveal').setOptions(params.options); + reveal.reveal().chain(function(){ + (function(){ + reveal.dissolve(); + }).delay(params.duration || 2000); + }); + } + +}); + +})(); + + +/* +--- + +script: Drag.js + +name: Drag + +description: The base Drag Class. Can be used to drag and resize Elements using mouse events. + +license: MIT-style license + +authors: + - Valerio Proietti + - Tom Occhinno + - Jan Kassens + +requires: + - Core/Events + - Core/Options + - Core/Element.Event + - Core/Element.Style + - Core/Element.Dimensions + - MooTools.More + +provides: [Drag] +... + +*/ + +var Drag = new Class({ + + Implements: [Events, Options], + + options: {/* + onBeforeStart: function(thisElement){}, + onStart: function(thisElement, event){}, + onSnap: function(thisElement){}, + onDrag: function(thisElement, event){}, + onCancel: function(thisElement){}, + onComplete: function(thisElement, event){},*/ + snap: 6, + unit: 'px', + grid: false, + style: true, + limit: false, + handle: false, + invert: false, + preventDefault: false, + stopPropagation: false, + modifiers: {x: 'left', y: 'top'} + }, + + initialize: function(){ + var params = Array.link(arguments, { + 'options': Type.isObject, + 'element': function(obj){ + return obj != null; + } + }); + + this.element = document.id(params.element); + this.document = this.element.getDocument(); + this.setOptions(params.options || {}); + var htype = typeOf(this.options.handle); + this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element; + this.mouse = {'now': {}, 'pos': {}}; + this.value = {'start': {}, 'now': {}}; + + this.selection = 'selectstart' in document ? 'selectstart' : 'mousedown'; + + + if ('ondragstart' in document && !('FileReader' in window) && !Drag.ondragstartFixed){ + document.ondragstart = Function.from(false); + Drag.ondragstartFixed = true; + } + + this.bound = { + start: this.start.bind(this), + check: this.check.bind(this), + drag: this.drag.bind(this), + stop: this.stop.bind(this), + cancel: this.cancel.bind(this), + eventStop: Function.from(false) + }; + this.attach(); + }, + + attach: function(){ + this.handles.addEvent('mousedown', this.bound.start); + return this; + }, + + detach: function(){ + this.handles.removeEvent('mousedown', this.bound.start); + return this; + }, + + start: function(event){ + var options = this.options; + + if (event.rightClick) return; + + if (options.preventDefault) event.preventDefault(); + if (options.stopPropagation) event.stopPropagation(); + this.mouse.start = event.page; + + this.fireEvent('beforeStart', this.element); + + var limit = options.limit; + this.limit = {x: [], y: []}; + + var z, coordinates; + for (z in options.modifiers){ + if (!options.modifiers[z]) continue; + + var style = this.element.getStyle(options.modifiers[z]); + + // Some browsers (IE and Opera) don't always return pixels. + if (style && !style.match(/px$/)){ + if (!coordinates) coordinates = this.element.getCoordinates(this.element.getOffsetParent()); + style = coordinates[options.modifiers[z]]; + } + + if (options.style) this.value.now[z] = (style || 0).toInt(); + else this.value.now[z] = this.element[options.modifiers[z]]; + + if (options.invert) this.value.now[z] *= -1; + + this.mouse.pos[z] = event.page[z] - this.value.now[z]; + + if (limit && limit[z]){ + var i = 2; + while (i--){ + var limitZI = limit[z][i]; + if (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI == 'function') ? limitZI() : limitZI; + } + } + } + + if (typeOf(this.options.grid) == 'number') this.options.grid = { + x: this.options.grid, + y: this.options.grid + }; + + var events = { + mousemove: this.bound.check, + mouseup: this.bound.cancel + }; + events[this.selection] = this.bound.eventStop; + this.document.addEvents(events); + }, + + check: function(event){ + if (this.options.preventDefault) event.preventDefault(); + var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2))); + if (distance > this.options.snap){ + this.cancel(); + this.document.addEvents({ + mousemove: this.bound.drag, + mouseup: this.bound.stop + }); + this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element); + } + }, + + drag: function(event){ + var options = this.options; + + if (options.preventDefault) event.preventDefault(); + this.mouse.now = event.page; + + for (var z in options.modifiers){ + if (!options.modifiers[z]) continue; + this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z]; + + if (options.invert) this.value.now[z] *= -1; + + if (options.limit && this.limit[z]){ + if ((this.limit[z][1] || this.limit[z][1] === 0) && (this.value.now[z] > this.limit[z][1])){ + this.value.now[z] = this.limit[z][1]; + } else if ((this.limit[z][0] || this.limit[z][0] === 0) && (this.value.now[z] < this.limit[z][0])){ + this.value.now[z] = this.limit[z][0]; + } + } + + if (options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % options.grid[z]); + + if (options.style) this.element.setStyle(options.modifiers[z], this.value.now[z] + options.unit); + else this.element[options.modifiers[z]] = this.value.now[z]; + } + + this.fireEvent('drag', [this.element, event]); + }, + + cancel: function(event){ + this.document.removeEvents({ + mousemove: this.bound.check, + mouseup: this.bound.cancel + }); + if (event){ + this.document.removeEvent(this.selection, this.bound.eventStop); + this.fireEvent('cancel', this.element); + } + }, + + stop: function(event){ + var events = { + mousemove: this.bound.drag, + mouseup: this.bound.stop + }; + events[this.selection] = this.bound.eventStop; + this.document.removeEvents(events); + if (event) this.fireEvent('complete', [this.element, event]); + } + +}); + +Element.implement({ + + makeResizable: function(options){ + var drag = new Drag(this, Object.merge({ + modifiers: { + x: 'width', + y: 'height' + } + }, options)); + + this.store('resizer', drag); + return drag.addEvent('drag', function(){ + this.fireEvent('resize', drag); + }.bind(this)); + } + +}); + + +/* +--- + +script: Drag.Move.js + +name: Drag.Move + +description: A Drag extension that provides support for the constraining of draggables to containers and droppables. + +license: MIT-style license + +authors: + - Valerio Proietti + - Tom Occhinno + - Jan Kassens + - Aaron Newton + - Scott Kyle + +requires: + - Core/Element.Dimensions + - Drag + +provides: [Drag.Move] + +... +*/ + +Drag.Move = new Class({ + + Extends: Drag, + + options: {/* + onEnter: function(thisElement, overed){}, + onLeave: function(thisElement, overed){}, + onDrop: function(thisElement, overed, event){},*/ + droppables: [], + container: false, + precalculate: false, + includeMargins: true, + checkDroppables: true + }, + + initialize: function(element, options){ + this.parent(element, options); + element = this.element; + + this.droppables = $$(this.options.droppables); + this.setContainer(this.options.container); + + if (this.options.style){ + if (this.options.modifiers.x == 'left' && this.options.modifiers.y == 'top'){ + var parent = element.getOffsetParent(), + styles = element.getStyles('left', 'top'); + if (parent && (styles.left == 'auto' || styles.top == 'auto')){ + element.setPosition(element.getPosition(parent)); + } + } + + if (element.getStyle('position') == 'static') element.setStyle('position', 'absolute'); + } + + this.addEvent('start', this.checkDroppables, true); + this.overed = null; + }, + + setContainer: function(container) { + this.container = document.id(container); + if (this.container && typeOf(this.container) != 'element'){ + this.container = document.id(this.container.getDocument().body); + } + }, + + start: function(event){ + if (this.container) this.options.limit = this.calculateLimit(); + + if (this.options.precalculate){ + this.positions = this.droppables.map(function(el){ + return el.getCoordinates(); + }); + } + + this.parent(event); + }, + + calculateLimit: function(){ + var element = this.element, + container = this.container, + + offsetParent = document.id(element.getOffsetParent()) || document.body, + containerCoordinates = container.getCoordinates(offsetParent), + elementMargin = {}, + elementBorder = {}, + containerMargin = {}, + containerBorder = {}, + offsetParentPadding = {}; + + ['top', 'right', 'bottom', 'left'].each(function(pad){ + elementMargin[pad] = element.getStyle('margin-' + pad).toInt(); + elementBorder[pad] = element.getStyle('border-' + pad).toInt(); + containerMargin[pad] = container.getStyle('margin-' + pad).toInt(); + containerBorder[pad] = container.getStyle('border-' + pad).toInt(); + offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt(); + }, this); + + var width = element.offsetWidth + elementMargin.left + elementMargin.right, + height = element.offsetHeight + elementMargin.top + elementMargin.bottom, + left = 0, + top = 0, + right = containerCoordinates.right - containerBorder.right - width, + bottom = containerCoordinates.bottom - containerBorder.bottom - height; + + if (this.options.includeMargins){ + left += elementMargin.left; + top += elementMargin.top; + } else { + right += elementMargin.right; + bottom += elementMargin.bottom; + } + + if (element.getStyle('position') == 'relative'){ + var coords = element.getCoordinates(offsetParent); + coords.left -= element.getStyle('left').toInt(); + coords.top -= element.getStyle('top').toInt(); + + left -= coords.left; + top -= coords.top; + if (container.getStyle('position') != 'relative'){ + left += containerBorder.left; + top += containerBorder.top; + } + right += elementMargin.left - coords.left; + bottom += elementMargin.top - coords.top; + + if (container != offsetParent){ + left += containerMargin.left + offsetParentPadding.left; + if (!offsetParentPadding.left && left < 0) left = 0; + top += offsetParent == document.body ? 0 : containerMargin.top + offsetParentPadding.top; + if (!offsetParentPadding.top && top < 0) top = 0; + } + } else { + left -= elementMargin.left; + top -= elementMargin.top; + if (container != offsetParent){ + left += containerCoordinates.left + containerBorder.left; + top += containerCoordinates.top + containerBorder.top; + } + } + + return { + x: [left, right], + y: [top, bottom] + }; + }, + + getDroppableCoordinates: function(element){ + var position = element.getCoordinates(); + if (element.getStyle('position') == 'fixed'){ + var scroll = window.getScroll(); + position.left += scroll.x; + position.right += scroll.x; + position.top += scroll.y; + position.bottom += scroll.y; + } + return position; + }, + + checkDroppables: function(){ + var overed = this.droppables.filter(function(el, i){ + el = this.positions ? this.positions[i] : this.getDroppableCoordinates(el); + var now = this.mouse.now; + return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top); + }, this).getLast(); + + if (this.overed != overed){ + if (this.overed) this.fireEvent('leave', [this.element, this.overed]); + if (overed) this.fireEvent('enter', [this.element, overed]); + this.overed = overed; + } + }, + + drag: function(event){ + this.parent(event); + if (this.options.checkDroppables && this.droppables.length) this.checkDroppables(); + }, + + stop: function(event){ + this.checkDroppables(); + this.fireEvent('drop', [this.element, this.overed, event]); + this.overed = null; + return this.parent(event); + } + +}); + +Element.implement({ + + makeDraggable: function(options){ + var drag = new Drag.Move(this, options); + this.store('dragger', drag); + return drag; + } + +}); + + +/* +--- + +script: Sortables.js + +name: Sortables + +description: Class for creating a drag and drop sorting interface for lists of items. + +license: MIT-style license + +authors: + - Tom Occhino + +requires: + - Core/Fx.Morph + - Drag.Move + +provides: [Sortables] + +... +*/ + +var Sortables = new Class({ + + Implements: [Events, Options], + + options: {/* + onSort: function(element, clone){}, + onStart: function(element, clone){}, + onComplete: function(element){},*/ + opacity: 1, + clone: false, + revert: false, + handle: false, + dragOptions: {}, + unDraggableTags: ['button', 'input', 'a', 'textarea', 'select', 'option'] + }, + + initialize: function(lists, options){ + this.setOptions(options); + + this.elements = []; + this.lists = []; + this.idle = true; + + this.addLists($$(document.id(lists) || lists)); + + if (!this.options.clone) this.options.revert = false; + if (this.options.revert) this.effect = new Fx.Morph(null, Object.merge({ + duration: 250, + link: 'cancel' + }, this.options.revert)); + }, + + attach: function(){ + this.addLists(this.lists); + return this; + }, + + detach: function(){ + this.lists = this.removeLists(this.lists); + return this; + }, + + addItems: function(){ + Array.flatten(arguments).each(function(element){ + this.elements.push(element); + var start = element.retrieve('sortables:start', function(event){ + this.start.call(this, event, element); + }.bind(this)); + (this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start); + }, this); + return this; + }, + + addLists: function(){ + Array.flatten(arguments).each(function(list){ + this.lists.include(list); + this.addItems(list.getChildren()); + }, this); + return this; + }, + + removeItems: function(){ + return $$(Array.flatten(arguments).map(function(element){ + this.elements.erase(element); + var start = element.retrieve('sortables:start'); + (this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start); + + return element; + }, this)); + }, + + removeLists: function(){ + return $$(Array.flatten(arguments).map(function(list){ + this.lists.erase(list); + this.removeItems(list.getChildren()); + + return list; + }, this)); + }, + + getDroppableCoordinates: function (element){ + var offsetParent = element.getOffsetParent(); + var position = element.getPosition(offsetParent); + var scroll = { + w: window.getScroll(), + offsetParent: offsetParent.getScroll() + }; + position.x += scroll.offsetParent.x; + position.y += scroll.offsetParent.y; + + if (offsetParent.getStyle('position') == 'fixed'){ + position.x -= scroll.w.x; + position.y -= scroll.w.y; + } + + return position; + }, + + getClone: function(event, element){ + if (!this.options.clone) return new Element(element.tagName).inject(document.body); + if (typeOf(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list); + var clone = element.clone(true).setStyles({ + margin: 0, + position: 'absolute', + visibility: 'hidden', + width: element.getStyle('width') + }).addEvent('mousedown', function(event){ + element.fireEvent('mousedown', event); + }); + //prevent the duplicated radio inputs from unchecking the real one + if (clone.get('html').test('radio')){ + clone.getElements('input[type=radio]').each(function(input, i){ + input.set('name', 'clone_' + i); + if (input.get('checked')) element.getElements('input[type=radio]')[i].set('checked', true); + }); + } + + return clone.inject(this.list).setPosition(this.getDroppableCoordinates(this.element)); + }, + + getDroppables: function(){ + var droppables = this.list.getChildren().erase(this.clone).erase(this.element); + if (!this.options.constrain) droppables.append(this.lists).erase(this.list); + return droppables; + }, + + insert: function(dragging, element){ + var where = 'inside'; + if (this.lists.contains(element)){ + this.list = element; + this.drag.droppables = this.getDroppables(); + } else { + where = this.element.getAllPrevious().contains(element) ? 'before' : 'after'; + } + this.element.inject(element, where); + this.fireEvent('sort', [this.element, this.clone]); + }, + + start: function(event, element){ + if ( + !this.idle || + event.rightClick || + (!this.options.handle && this.options.unDraggableTags.contains(event.target.get('tag'))) + ) return; + + this.idle = false; + this.element = element; + this.opacity = element.getStyle('opacity'); + this.list = element.getParent(); + this.clone = this.getClone(event, element); + + this.drag = new Drag.Move(this.clone, Object.merge({ + + droppables: this.getDroppables() + }, this.options.dragOptions)).addEvents({ + onSnap: function(){ + event.stop(); + this.clone.setStyle('visibility', 'visible'); + this.element.setStyle('opacity', this.options.opacity || 0); + this.fireEvent('start', [this.element, this.clone]); + }.bind(this), + onEnter: this.insert.bind(this), + onCancel: this.end.bind(this), + onComplete: this.end.bind(this) + }); + + this.clone.inject(this.element, 'before'); + this.drag.start(event); + }, + + end: function(){ + this.drag.detach(); + this.element.setStyle('opacity', this.opacity); + var self = this; + if (this.effect){ + var dim = this.element.getStyles('width', 'height'), + clone = this.clone, + pos = clone.computePosition(this.getDroppableCoordinates(clone)); + + var destroy = function(){ + this.removeEvent('cancel', destroy); + clone.destroy(); + self.reset(); + }; + + this.effect.element = clone; + this.effect.start({ + top: pos.top, + left: pos.left, + width: dim.width, + height: dim.height, + opacity: 0.25 + }).addEvent('cancel', destroy).chain(destroy); + } else { + this.clone.destroy(); + self.reset(); + } + + }, + + reset: function(){ + this.idle = true; + this.fireEvent('complete', this.element); + }, + + serialize: function(){ + var params = Array.link(arguments, { + modifier: Type.isFunction, + index: function(obj){ + return obj != null; + } + }); + var serial = this.lists.map(function(list){ + return list.getChildren().map(params.modifier || function(element){ + return element.get('id'); + }, this); + }, this); + + var index = params.index; + if (this.lists.length == 1) index = 0; + return (index || index === 0) && index >= 0 && index < this.lists.length ? serial[index] : serial; + } + +}); + + +/* +--- + +script: Request.Periodical.js + +name: Request.Periodical + +description: Requests the same URL to pull data from a server but increases the intervals if no data is returned to reduce the load + +license: MIT-style license + +authors: + - Christoph Pojer + +requires: + - Core/Request + - MooTools.More + +provides: [Request.Periodical] + +... +*/ + +Request.implement({ + + options: { + initialDelay: 5000, + delay: 5000, + limit: 60000 + }, + + startTimer: function(data){ + var fn = function(){ + if (!this.running) this.send({data: data}); + }; + this.lastDelay = this.options.initialDelay; + this.timer = fn.delay(this.lastDelay, this); + this.completeCheck = function(response){ + clearTimeout(this.timer); + this.lastDelay = (response) ? this.options.delay : (this.lastDelay + this.options.delay).min(this.options.limit); + this.timer = fn.delay(this.lastDelay, this); + }; + return this.addEvent('complete', this.completeCheck); + }, + + stopTimer: function(){ + clearTimeout(this.timer); + return this.removeEvent('complete', this.completeCheck); + } + +}); + + +/* +--- + +script: Color.js + +name: Color + +description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa. + +license: MIT-style license + +authors: + - Valerio Proietti + +requires: + - Core/Array + - Core/String + - Core/Number + - Core/Hash + - Core/Function + - MooTools.More + +provides: [Color] + +... +*/ + +(function(){ + +var Color = this.Color = new Type('Color', function(color, type){ + if (arguments.length >= 3){ + type = 'rgb'; color = Array.slice(arguments, 0, 3); + } else if (typeof color == 'string'){ + if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true); + else if (color.match(/hsb/)) color = color.hsbToRgb(); + else color = color.hexToRgb(true); + } + type = type || 'rgb'; + switch (type){ + case 'hsb': + var old = color; + color = color.hsbToRgb(); + color.hsb = old; + break; + case 'hex': color = color.hexToRgb(true); break; + } + color.rgb = color.slice(0, 3); + color.hsb = color.hsb || color.rgbToHsb(); + color.hex = color.rgbToHex(); + return Object.append(color, this); +}); + +Color.implement({ + + mix: function(){ + var colors = Array.slice(arguments); + var alpha = (typeOf(colors.getLast()) == 'number') ? colors.pop() : 50; + var rgb = this.slice(); + colors.each(function(color){ + color = new Color(color); + for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha)); + }); + return new Color(rgb, 'rgb'); + }, + + invert: function(){ + return new Color(this.map(function(value){ + return 255 - value; + })); + }, + + setHue: function(value){ + return new Color([value, this.hsb[1], this.hsb[2]], 'hsb'); + }, + + setSaturation: function(percent){ + return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb'); + }, + + setBrightness: function(percent){ + return new Color([this.hsb[0], this.hsb[1], percent], 'hsb'); + } + +}); + +this.$RGB = function(r, g, b){ + return new Color([r, g, b], 'rgb'); +}; + +this.$HSB = function(h, s, b){ + return new Color([h, s, b], 'hsb'); +}; + +this.$HEX = function(hex){ + return new Color(hex, 'hex'); +}; + +Array.implement({ + + rgbToHsb: function(){ + var red = this[0], + green = this[1], + blue = this[2], + hue = 0; + var max = Math.max(red, green, blue), + min = Math.min(red, green, blue); + var delta = max - min; + var brightness = max / 255, + saturation = (max != 0) ? delta / max : 0; + if (saturation != 0){ + var rr = (max - red) / delta; + var gr = (max - green) / delta; + var br = (max - blue) / delta; + if (red == max) hue = br - gr; + else if (green == max) hue = 2 + rr - br; + else hue = 4 + gr - rr; + hue /= 6; + if (hue < 0) hue++; + } + return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)]; + }, + + hsbToRgb: function(){ + var br = Math.round(this[2] / 100 * 255); + if (this[1] == 0){ + return [br, br, br]; + } else { + var hue = this[0] % 360; + var f = hue % 60; + var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255); + var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255); + var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255); + switch (Math.floor(hue / 60)){ + case 0: return [br, t, p]; + case 1: return [q, br, p]; + case 2: return [p, br, t]; + case 3: return [p, q, br]; + case 4: return [t, p, br]; + case 5: return [br, p, q]; + } + } + return false; + } + +}); + +String.implement({ + + rgbToHsb: function(){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHsb() : null; + }, + + hsbToRgb: function(){ + var hsb = this.match(/\d{1,3}/g); + return (hsb) ? hsb.hsbToRgb() : null; + } + +}); + +})(); + + diff --git a/pyload/webui/themes/default/js/static/mootools-more.min.js b/pyload/webui/themes/default/js/static/mootools-more.min.js new file mode 100644 index 000000000..ce03a60fd --- /dev/null +++ b/pyload/webui/themes/default/js/static/mootools-more.min.js @@ -0,0 +1,226 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/more/c1cc18c2fff04bcc58921b4dff80a6f1 + +packager build: + - packager build More/Form.Request More/Fx.Reveal More/Sortables More/Request.Periodical More/Color + +copyrights: + - [MooTools](http://mootools.net) + +licenses: + - [MIT License](http://mootools.net/license.txt) +... +*/ + +MooTools.More={version:"1.5.0",build:"73db5e24e6e9c5c87b3a27aebef2248053f7db37"};Class.Mutators.Binds=function(a){if(!this.prototype.initialize){this.implement("initialize",function(){}); +}return Array.from(a).concat(this.prototype.Binds||[]);};Class.Mutators.initialize=function(a){return function(){Array.from(this.Binds).each(function(b){var c=this[b]; +if(c){this[b]=c.bind(this);}},this);return a.apply(this,arguments);};};Class.Occlude=new Class({occlude:function(c,b){b=document.id(b||this.element);var a=b.retrieve(c||this.property); +if(a&&!this.occluded){return(this.occluded=a);}this.occluded=false;b.store(c||this.property,this);return this.occluded;}});Class.refactor=function(b,a){Object.each(a,function(e,d){var c=b.prototype[d]; +c=(c&&c.$origin)||c||function(){};b.implement(d,(typeof e=="function")?function(){var f=this.previous;this.previous=c;var g=e.apply(this,arguments);this.previous=f; +return g;}:e);});return b;};(function(){var b=function(e,d){var f=[];Object.each(d,function(g){Object.each(g,function(h){e.each(function(i){f.push(i+"-"+h+(i=="border"?"-width":"")); +});});});return f;};var c=function(f,e){var d=0;Object.each(e,function(h,g){if(g.test(f)){d=d+h.toInt();}});return d;};var a=function(d){return !!(!d||d.offsetHeight||d.offsetWidth); +};Element.implement({measure:function(h){if(a(this)){return h.call(this);}var g=this.getParent(),e=[];while(!a(g)&&g!=document.body){e.push(g.expose()); +g=g.getParent();}var f=this.expose(),d=h.call(this);f();e.each(function(i){i();});return d;},expose:function(){if(this.getStyle("display")!="none"){return function(){}; +}var d=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=d;}.bind(this); +},getDimensions:function(d){d=Object.merge({computeSize:false},d);var i={x:0,y:0};var h=function(j,e){return(e.computeSize)?j.getComputedSize(e):j.getSize(); +};var f=this.getParent("body");if(f&&this.getStyle("display")=="none"){i=this.measure(function(){return h(this,d);});}else{if(f){try{i=h(this,d);}catch(g){}}}return Object.append(i,(i.x||i.x===0)?{width:i.x,height:i.y}:{x:i.width,y:i.height}); +},getComputedSize:function(d){d=Object.merge({styles:["padding","border"],planes:{height:["top","bottom"],width:["left","right"]},mode:"both"},d);var g={},e={width:0,height:0},f; +if(d.mode=="vertical"){delete e.width;delete d.planes.width;}else{if(d.mode=="horizontal"){delete e.height;delete d.planes.height;}}b(d.styles,d.planes).each(function(h){g[h]=this.getStyle(h).toInt(); +},this);Object.each(d.planes,function(i,h){var k=h.capitalize(),j=this.getStyle(h);if(j=="auto"&&!f){f=this.getDimensions();}j=g[h]=(j=="auto")?f[h]:j.toInt(); +e["total"+k]=j;i.each(function(m){var l=c(m,g);e["computed"+m.capitalize()]=l;e["total"+k]+=l;});},this);return Object.append(e,g);}});})();(function(b){var a=Element.Position={options:{relativeTo:document.body,position:{x:"center",y:"center"},offset:{x:0,y:0}},getOptions:function(d,c){c=Object.merge({},a.options,c); +a.setPositionOption(c);a.setEdgeOption(c);a.setOffsetOption(d,c);a.setDimensionsOption(d,c);return c;},setPositionOption:function(c){c.position=a.getCoordinateFromValue(c.position); +},setEdgeOption:function(d){var c=a.getCoordinateFromValue(d.edge);d.edge=c?c:(d.position.x=="center"&&d.position.y=="center")?{x:"center",y:"center"}:{x:"left",y:"top"}; +},setOffsetOption:function(f,d){var c={x:0,y:0};var e={x:0,y:0};var g=f.measure(function(){return document.id(this.getOffsetParent());});if(!g||g==f.getDocument().body){return; +}e=g.getScroll();c=g.measure(function(){var i=this.getPosition();if(this.getStyle("position")=="fixed"){var h=window.getScroll();i.x+=h.x;i.y+=h.y;}return i; +});d.offset={parentPositioned:g!=document.id(d.relativeTo),x:d.offset.x-c.x+e.x,y:d.offset.y-c.y+e.y};},setDimensionsOption:function(d,c){c.dimensions=d.getDimensions({computeSize:true,styles:["padding","border","margin"]}); +},getPosition:function(e,d){var c={};d=a.getOptions(e,d);var f=document.id(d.relativeTo)||document.body;a.setPositionCoordinates(d,c,f);if(d.edge){a.toEdge(c,d); +}var g=d.offset;c.left=((c.x>=0||g.parentPositioned||d.allowNegative)?c.x:0).toInt();c.top=((c.y>=0||g.parentPositioned||d.allowNegative)?c.y:0).toInt(); +a.toMinMax(c,d);if(d.relFixedPosition||f.getStyle("position")=="fixed"){a.toRelFixedPosition(f,c);}if(d.ignoreScroll){a.toIgnoreScroll(f,c);}if(d.ignoreMargins){a.toIgnoreMargins(c,d); +}c.left=Math.ceil(c.left);c.top=Math.ceil(c.top);delete c.x;delete c.y;return c;},setPositionCoordinates:function(k,g,d){var f=k.offset.y,h=k.offset.x,e=(d==document.body)?window.getScroll():d.getPosition(),j=e.y,c=e.x,i=window.getSize(); +switch(k.position.x){case"left":g.x=c+h;break;case"right":g.x=c+h+d.offsetWidth;break;default:g.x=c+((d==document.body?i.x:d.offsetWidth)/2)+h;break;}switch(k.position.y){case"top":g.y=j+f; +break;case"bottom":g.y=j+f+d.offsetHeight;break;default:g.y=j+((d==document.body?i.y:d.offsetHeight)/2)+f;break;}},toMinMax:function(c,d){var f={left:"x",top:"y"},e; +["minimum","maximum"].each(function(g){["left","top"].each(function(h){e=d[g]?d[g][f[h]]:null;if(e!=null&&((g=="minimum")?c[h]e)){c[h]=e;}});}); +},toRelFixedPosition:function(e,c){var d=window.getScroll();c.top+=d.y;c.left+=d.x;},toIgnoreScroll:function(e,d){var c=e.getScroll();d.top-=c.y;d.left-=c.x; +},toIgnoreMargins:function(c,d){c.left+=d.edge.x=="right"?d.dimensions["margin-right"]:(d.edge.x!="center"?-d.dimensions["margin-left"]:-d.dimensions["margin-left"]+((d.dimensions["margin-right"]+d.dimensions["margin-left"])/2)); +c.top+=d.edge.y=="bottom"?d.dimensions["margin-bottom"]:(d.edge.y!="center"?-d.dimensions["margin-top"]:-d.dimensions["margin-top"]+((d.dimensions["margin-bottom"]+d.dimensions["margin-top"])/2)); +},toEdge:function(c,d){var e={},g=d.dimensions,f=d.edge;switch(f.x){case"left":e.x=0;break;case"right":e.x=-g.x-g.computedRight-g.computedLeft;break;default:e.x=-(Math.round(g.totalWidth/2)); +break;}switch(f.y){case"top":e.y=0;break;case"bottom":e.y=-g.y-g.computedTop-g.computedBottom;break;default:e.y=-(Math.round(g.totalHeight/2));break;}c.x+=e.x; +c.y+=e.y;},getCoordinateFromValue:function(c){if(typeOf(c)!="string"){return c;}c=c.toLowerCase();return{x:c.test("left")?"left":(c.test("right")?"right":"center"),y:c.test(/upper|top/)?"top":(c.test("bottom")?"bottom":"center")}; +}};Element.implement({position:function(d){if(d&&(d.x!=null||d.y!=null)){return(b?b.apply(this,arguments):this);}var c=this.setStyle("position","absolute").calculatePosition(d); +return(d&&d.returnPos)?c:this.setStyles(c);},calculatePosition:function(c){return a.getPosition(this,c);}});})(Element.prototype.position);(function(){var a=false; +this.IframeShim=new Class({Implements:[Options,Events,Class.Occlude],options:{className:"iframeShim",src:'javascript:false;document.write("");',display:false,zIndex:null,margin:0,offset:{x:0,y:0},browsers:a},property:"IframeShim",initialize:function(c,b){this.element=document.id(c); +if(this.occlude()){return this.occluded;}this.setOptions(b);this.makeShim();return this;},makeShim:function(){if(this.options.browsers){var d=this.element.getStyle("zIndex").toInt(); +if(!d){d=1;var c=this.element.getStyle("position");if(c=="static"||!c){this.element.setStyle("position","relative");}this.element.setStyle("zIndex",d); +}d=((this.options.zIndex!=null||this.options.zIndex===0)&&d>this.options.zIndex)?this.options.zIndex:d-1;if(d<0){d=1;}this.shim=new Element("iframe",{src:this.options.src,scrolling:"no",frameborder:0,styles:{zIndex:d,position:"absolute",border:"none",filter:"progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"},"class":this.options.className}).store("IframeShim",this); +var b=(function(){this.shim.inject(this.element,"after");this[this.options.display?"show":"hide"]();this.fireEvent("inject");}).bind(this);if(!IframeShim.ready){window.addEvent("load",b); +}else{b();}}else{this.position=this.hide=this.show=this.dispose=Function.from(this);}},position:function(){if(!IframeShim.ready||!this.shim){return this; +}var b=this.element.measure(function(){return this.getSize();});if(this.options.margin!=undefined){b.x=b.x-(this.options.margin*2);b.y=b.y-(this.options.margin*2); +this.options.offset.x+=this.options.margin;this.options.offset.y+=this.options.margin;}this.shim.set({width:b.x,height:b.y}).position({relativeTo:this.element,offset:this.options.offset}); +return this;},hide:function(){if(this.shim){this.shim.setStyle("display","none");}return this;},show:function(){if(this.shim){this.shim.setStyle("display","block"); +}return this.position();},dispose:function(){if(this.shim){this.shim.dispose();}return this;},destroy:function(){if(this.shim){this.shim.destroy();}return this; +}});})();window.addEvent("load",function(){IframeShim.ready=true;});var Mask=new Class({Implements:[Options,Events],Binds:["position"],options:{style:{},"class":"mask",maskMargins:false,useIframeShim:true,iframeShimOptions:{}},initialize:function(b,a){this.target=document.id(b)||document.id(document.body); +this.target.store("mask",this);this.setOptions(a);this.render();this.inject();},render:function(){this.element=new Element("div",{"class":this.options["class"],id:this.options.id||"mask-"+String.uniqueID(),styles:Object.merge({},this.options.style,{display:"none"}),events:{click:function(a){this.fireEvent("click",a); +if(this.options.hideOnClick){this.hide();}}.bind(this)}});this.hidden=true;},toElement:function(){return this.element;},inject:function(b,a){a=a||(this.options.inject?this.options.inject.where:"")||(this.target==document.body?"inside":"after"); +b=b||(this.options.inject&&this.options.inject.target)||this.target;this.element.inject(b,a);if(this.options.useIframeShim){this.shim=new IframeShim(this.element,this.options.iframeShimOptions); +this.addEvents({show:this.shim.show.bind(this.shim),hide:this.shim.hide.bind(this.shim),destroy:this.shim.destroy.bind(this.shim)});}},position:function(){this.resize(this.options.width,this.options.height); +this.element.position({relativeTo:this.target,position:"topLeft",ignoreMargins:!this.options.maskMargins,ignoreScroll:this.target==document.body});return this; +},resize:function(a,e){var b={styles:["padding","border"]};if(this.options.maskMargins){b.styles.push("margin");}var d=this.target.getComputedSize(b);if(this.target==document.body){this.element.setStyles({width:0,height:0}); +var c=window.getScrollSize();if(d.totalHeight0&&b>0)?true:this.style.display!="none";},toggle:function(){return this[this.isDisplayed()?"hide":"show"](); +},hide:function(){var b;try{b=this.getStyle("display");}catch(a){}if(b=="none"){return this;}return this.store("element:_originalDisplay",b||"").setStyle("display","none"); +},show:function(a){if(!a&&this.isDisplayed()){return this;}a=a||this.retrieve("element:_originalDisplay")||"block";return this.setStyle("display",(a=="none")?"block":a); +},swapClass:function(a,b){return this.removeClass(a).addClass(b);}});Document.implement({clearSelection:function(){if(window.getSelection){var a=window.getSelection(); +if(a&&a.removeAllRanges){a.removeAllRanges();}}else{if(document.selection&&document.selection.empty){try{document.selection.empty();}catch(b){}}}}});(function(){var a=function(d){var b=d.options.hideInputs; +if(window.OverText){var c=[null];OverText.each(function(e){c.include("."+e.options.labelClass);});if(c){b+=c.join(", ");}}return(b)?d.element.getElements(b):null; +};Fx.Reveal=new Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:"opacity" in document.documentElement,mode:"vertical",display:function(){return this.element.get("tag")!="tr"?"block":"table-row"; +},opacity:1,hideInputs:!("opacity" in document.documentElement)?"select, input, textarea, object, embed":null},dissolve:function(){if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true; +this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); +if(this.options.transitionOpacity){d.opacity=this.options.opacity;}var c={};Object.each(d,function(f,e){c[e]=[f,0];});this.element.setStyles({display:Function.from(this.options.display).call(this),overflow:"hidden"}); +var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){if(this.hidden){this.hiding=false;this.element.style.cssText=this.cssText; +this.element.setStyle("display","none");if(b){b.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);this.callChain();}.bind(this));this.start(c); +}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this)); +}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();this.dissolve();}}}return this;},reveal:function(){if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"){this.hiding=false; +this.showing=true;this.hidden=false;this.cssText=this.element.style.cssText;var d;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); +}.bind(this));if(this.options.heightOverride!=null){d.height=this.options.heightOverride.toInt();}if(this.options.widthOverride!=null){d.width=this.options.widthOverride.toInt(); +}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=this.options.opacity;}var c={height:0,display:Function.from(this.options.display).call(this)}; +Object.each(d,function(f,e){c[e]=0;});c.overflow="hidden";this.element.setStyles(c);var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){this.element.style.cssText=this.cssText; +this.element.setStyle("display",Function.from(this.options.display).call(this));if(!this.hidden){this.showing=false;}if(b){b.setStyle("visibility","visible"); +}this.callChain();this.fireEvent("show",this.element);}.bind(this));this.start(d);}else{this.callChain();this.fireEvent("complete",this.element);this.fireEvent("show",this.element); +}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();this.reveal(); +}}}return this;},toggle:function(){if(this.element.getStyle("display")=="none"){this.reveal();}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments); +if(this.cssText!=null){this.element.style.cssText=this.cssText;}this.hiding=false;this.showing=false;return this;}});Element.Properties.reveal={set:function(b){this.get("reveal").cancel().setOptions(b); +return this;},get:function(){var b=this.retrieve("reveal");if(!b){b=new Fx.Reveal(this);this.store("reveal",b);}return b;}};Element.Properties.dissolve=Element.Properties.reveal; +Element.implement({reveal:function(b){this.get("reveal").setOptions(b).reveal();return this;},dissolve:function(b){this.get("reveal").setOptions(b).dissolve(); +return this;},nix:function(b){var c=Array.link(arguments,{destroy:Type.isBoolean,options:Type.isObject});this.get("reveal").setOptions(b).dissolve().chain(function(){this[c.destroy?"destroy":"dispose"](); +}.bind(this));return this;},wink:function(){var c=Array.link(arguments,{duration:Type.isNumber,options:Type.isObject});var b=this.get("reveal").setOptions(c.options); +b.reveal().chain(function(){(function(){b.dissolve();}).delay(c.duration||2000);});}});})();var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var b=Array.link(arguments,{options:Type.isObject,element:function(c){return c!=null; +}});this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var a=typeOf(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element; +this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection="selectstart" in document?"selectstart":"mousedown";if("ondragstart" in document&&!("FileReader" in window)&&!Drag.ondragstartFixed){document.ondragstart=Function.from(false); +Drag.ondragstartFixed=true;}this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:Function.from(false)}; +this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start); +return this;},start:function(a){var j=this.options;if(a.rightClick){return;}if(j.preventDefault){a.preventDefault();}if(j.stopPropagation){a.stopPropagation(); +}this.mouse.start=a.page;this.fireEvent("beforeStart",this.element);var c=j.limit;this.limit={x:[],y:[]};var e,g;for(e in j.modifiers){if(!j.modifiers[e]){continue; +}var b=this.element.getStyle(j.modifiers[e]);if(b&&!b.match(/px$/)){if(!g){g=this.element.getCoordinates(this.element.getOffsetParent());}b=g[j.modifiers[e]]; +}if(j.style){this.value.now[e]=(b||0).toInt();}else{this.value.now[e]=this.element[j.modifiers[e]];}if(j.invert){this.value.now[e]*=-1;}this.mouse.pos[e]=a.page[e]-this.value.now[e]; +if(c&&c[e]){var d=2;while(d--){var f=c[e][d];if(f||f===0){this.limit[e][d]=(typeof f=="function")?f():f;}}}}if(typeOf(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid}; +}var h={mousemove:this.bound.check,mouseup:this.bound.cancel};h[this.selection]=this.bound.eventStop;this.document.addEvents(h);},check:function(a){if(this.options.preventDefault){a.preventDefault(); +}var b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop}); +this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element);}},drag:function(b){var a=this.options;if(a.preventDefault){b.preventDefault(); +}this.mouse.now=b.page;for(var c in a.modifiers){if(!a.modifiers[c]){continue;}this.value.now[c]=this.mouse.now[c]-this.mouse.pos[c];if(a.invert){this.value.now[c]*=-1; +}if(a.limit&&this.limit[c]){if((this.limit[c][1]||this.limit[c][1]===0)&&(this.value.now[c]>this.limit[c][1])){this.value.now[c]=this.limit[c][1];}else{if((this.limit[c][0]||this.limit[c][0]===0)&&(this.value.now[c]d.left&&b.xd.top);},this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed]); +}if(a){this.fireEvent("enter",[this.element,a]);}this.overed=a;}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables(); +}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return this.parent(a);}});Element.implement({makeDraggable:function(a){var b=new Drag.Move(this,a); +this.store("dragger",b);return b;}});var Sortables=new Class({Implements:[Events,Options],options:{opacity:1,clone:false,revert:false,handle:false,dragOptions:{},unDraggableTags:["button","input","a","textarea","select","option"]},initialize:function(a,b){this.setOptions(b); +this.elements=[];this.lists=[];this.idle=true;this.addLists($$(document.id(a)||a));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new Fx.Morph(null,Object.merge({duration:250,link:"cancel"},this.options.revert)); +}},attach:function(){this.addLists(this.lists);return this;},detach:function(){this.lists=this.removeLists(this.lists);return this;},addItems:function(){Array.flatten(arguments).each(function(a){this.elements.push(a); +var b=a.retrieve("sortables:start",function(c){this.start.call(this,c,a);}.bind(this));(this.options.handle?a.getElement(this.options.handle)||a:a).addEvent("mousedown",b); +},this);return this;},addLists:function(){Array.flatten(arguments).each(function(a){this.lists.include(a);this.addItems(a.getChildren());},this);return this; +},removeItems:function(){return $$(Array.flatten(arguments).map(function(a){this.elements.erase(a);var b=a.retrieve("sortables:start");(this.options.handle?a.getElement(this.options.handle)||a:a).removeEvent("mousedown",b); +return a;},this));},removeLists:function(){return $$(Array.flatten(arguments).map(function(a){this.lists.erase(a);this.removeItems(a.getChildren());return a; +},this));},getDroppableCoordinates:function(c){var d=c.getOffsetParent();var b=c.getPosition(d);var a={w:window.getScroll(),offsetParent:d.getScroll()}; +b.x+=a.offsetParent.x;b.y+=a.offsetParent.y;if(d.getStyle("position")=="fixed"){b.x-=a.w.x;b.y-=a.w.y;}return b;},getClone:function(b,a){if(!this.options.clone){return new Element(a.tagName).inject(document.body); +}if(typeOf(this.options.clone)=="function"){return this.options.clone.call(this,b,a,this.list);}var c=a.clone(true).setStyles({margin:0,position:"absolute",visibility:"hidden",width:a.getStyle("width")}).addEvent("mousedown",function(d){a.fireEvent("mousedown",d); +});if(c.get("html").test("radio")){c.getElements("input[type=radio]").each(function(d,e){d.set("name","clone_"+e);if(d.get("checked")){a.getElements("input[type=radio]")[e].set("checked",true); +}});}return c.inject(this.list).setPosition(this.getDroppableCoordinates(this.element));},getDroppables:function(){var a=this.list.getChildren().erase(this.clone).erase(this.element); +if(!this.options.constrain){a.append(this.lists).erase(this.list);}return a;},insert:function(c,b){var a="inside";if(this.lists.contains(b)){this.list=b; +this.drag.droppables=this.getDroppables();}else{a=this.element.getAllPrevious().contains(b)?"before":"after";}this.element.inject(b,a);this.fireEvent("sort",[this.element,this.clone]); +},start:function(b,a){if(!this.idle||b.rightClick||(!this.options.handle&&this.options.unDraggableTags.contains(b.target.get("tag")))){return;}this.idle=false; +this.element=a;this.opacity=a.getStyle("opacity");this.list=a.getParent();this.clone=this.getClone(b,a);this.drag=new Drag.Move(this.clone,Object.merge({droppables:this.getDroppables()},this.options.dragOptions)).addEvents({onSnap:function(){b.stop(); +this.clone.setStyle("visibility","visible");this.element.setStyle("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]); +}.bind(this),onEnter:this.insert.bind(this),onCancel:this.end.bind(this),onComplete:this.end.bind(this)});this.clone.inject(this.element,"before");this.drag.start(b); +},end:function(){this.drag.detach();this.element.setStyle("opacity",this.opacity);var a=this;if(this.effect){var c=this.element.getStyles("width","height"),e=this.clone,d=e.computePosition(this.getDroppableCoordinates(e)); +var b=function(){this.removeEvent("cancel",b);e.destroy();a.reset();};this.effect.element=e;this.effect.start({top:d.top,left:d.left,width:c.width,height:c.height,opacity:0.25}).addEvent("cancel",b).chain(b); +}else{this.clone.destroy();a.reset();}},reset:function(){this.idle=true;this.fireEvent("complete",this.element);},serialize:function(){var c=Array.link(arguments,{modifier:Type.isFunction,index:function(d){return d!=null; +}});var b=this.lists.map(function(d){return d.getChildren().map(c.modifier||function(e){return e.get("id");},this);},this);var a=c.index;if(this.lists.length==1){a=0; +}return(a||a===0)&&a>=0&&a=3){d="rgb";c=Array.slice(arguments,0,3);}else{if(typeof c=="string"){if(c.match(/rgb/)){c=c.rgbToHex().hexToRgb(true); +}else{if(c.match(/hsb/)){c=c.hsbToRgb();}else{c=c.hexToRgb(true);}}}}d=d||"rgb";switch(d){case"hsb":var b=c;c=c.hsbToRgb();c.hsb=b;break;case"hex":c=c.hexToRgb(true); +break;}c.rgb=c.slice(0,3);c.hsb=c.hsb||c.rgbToHsb();c.hex=c.rgbToHex();return Object.append(c,this);});a.implement({mix:function(){var b=Array.slice(arguments); +var d=(typeOf(b.getLast())=="number")?b.pop():50;var c=this.slice();b.each(function(e){e=new a(e);for(var f=0;f<3;f++){c[f]=Math.round((c[f]/100*(100-d))+(e[f]/100*d)); +}});return new a(c,"rgb");},invert:function(){return new a(this.map(function(b){return 255-b;}));},setHue:function(b){return new a([b,this.hsb[1],this.hsb[2]],"hsb"); +},setSaturation:function(b){return new a([this.hsb[0],b,this.hsb[2]],"hsb");},setBrightness:function(b){return new a([this.hsb[0],this.hsb[1],b],"hsb"); +}});this.$RGB=function(e,d,c){return new a([e,d,c],"rgb");};this.$HSB=function(e,d,c){return new a([e,d,c],"hsb");};this.$HEX=function(b){return new a(b,"hex"); +};Array.implement({rgbToHsb:function(){var c=this[0],d=this[1],k=this[2],h=0;var j=Math.max(c,d,k),f=Math.min(c,d,k);var l=j-f;var i=j/255,g=(j!=0)?l/j:0; +if(g!=0){var e=(j-c)/l;var b=(j-d)/l;var m=(j-k)/l;if(c==j){h=m-b;}else{if(d==j){h=2+e-m;}else{h=4+b-e;}}h/=6;if(h<0){h++;}}return[Math.round(h*360),Math.round(g*100),Math.round(i*100)]; +},hsbToRgb:function(){var d=Math.round(this[2]/100*255);if(this[1]==0){return[d,d,d];}else{var b=this[0]%360;var g=b%60;var h=Math.round((this[2]*(100-this[1]))/10000*255); +var e=Math.round((this[2]*(6000-this[1]*g))/600000*255);var c=Math.round((this[2]*(6000-this[1]*(60-g)))/600000*255);switch(Math.floor(b/60)){case 0:return[d,c,h]; +case 1:return[e,d,h];case 2:return[h,d,c];case 3:return[h,e,d];case 4:return[c,h,d];case 5:return[d,h,e];}}return false;}});String.implement({rgbToHsb:function(){var b=this.match(/\d{1,3}/g); +return(b)?b.rgbToHsb():null;},hsbToRgb:function(){var b=this.match(/\d{1,3}/g);return(b)?b.hsbToRgb():null;}});})(); \ No newline at end of file diff --git a/pyload/webui/themes/default/js/static/purr.js b/pyload/webui/themes/default/js/static/purr.js new file mode 100644 index 000000000..9cbc503d9 --- /dev/null +++ b/pyload/webui/themes/default/js/static/purr.js @@ -0,0 +1,309 @@ +/* +--- +script: purr.js + +description: Class to create growl-style popup notifications. + +license: MIT-style + +authors: [atom smith] + +requires: +- core/1.3: [Core, Browser, Array, Function, Number, String, Hash, Event, Class.Extras, Element.Event, Element.Style, Element.Dimensions, Fx.CSS, FX.Tween, Fx.Morph] + +provides: [Purr, Element.alert] +... +*/ + + +var Purr = new Class({ + + 'options': { + 'mode': 'top', + 'position': 'left', + 'elementAlertClass': 'purr-element-alert', + 'elements': { + 'wrapper': 'div', + 'alert': 'div', + 'buttonWrapper': 'div', + 'button': 'button' + }, + 'elementOptions': { + 'wrapper': { + 'styles': { + 'position': 'fixed', + 'z-index': '9999' + }, + 'class': 'purr-wrapper' + }, + 'alert': { + 'class': 'purr-alert', + 'styles': { + 'opacity': '.85' + } + }, + 'buttonWrapper': { + 'class': 'purr-button-wrapper' + }, + 'button': { + 'class': 'purr-button' + } + }, + 'alert': { + 'buttons': [], + 'clickDismiss': true, + 'hoverWait': true, + 'hideAfter': 5000, + 'fx': { + 'duration': 500 + }, + 'highlight': false, + 'highlightRepeat': false, + 'highlight': { + 'start': '#FF0', + 'end': false + } + } + }, + + 'Implements': [Options, Events, Chain], + + 'initialize': function(options){ + this.setOptions(options); + this.createWrapper(); + return this; + }, + + 'bindAlert': function(){ + return this.alert.bind(this); + }, + + 'createWrapper': function(){ + this.wrapper = new Element(this.options.elements.wrapper, this.options.elementOptions.wrapper); + if(this.options.mode == 'top') + { + this.wrapper.setStyle('top', 0); + } + else + { + this.wrapper.setStyle('bottom', 0); + } + document.id(document.body).grab(this.wrapper); + this.positionWrapper(this.options.position); + }, + + 'positionWrapper': function(position){ + if(typeOf(position) == 'object') + { + + var wrapperCoords = this.getWrapperCoords(); + + this.wrapper.setStyles({ + 'bottom': '', + 'left': position.x, + 'top': position.y - wrapperCoords.height, + 'position': 'absolute' + }); + } + else if(position == 'left') + { + this.wrapper.setStyle('left', 0); + } + else if(position == 'right') + { + this.wrapper.setStyle('right', 0); + } + else + { + this.wrapper.setStyle('left', (window.innerWidth / 2) - (this.getWrapperCoords().width / 2)); + } + return this; + }, + + 'getWrapperCoords': function(){ + this.wrapper.setStyle('visibility', 'hidden'); + var measurer = this.alert('need something in here to measure'); + var coords = this.wrapper.getCoordinates(); + measurer.destroy(); + this.wrapper.setStyle('visibility',''); + return coords; + }, + + 'alert': function(msg, options){ + + options = Object.merge({}, this.options.alert, options || {}); + + var alert = new Element(this.options.elements.alert, this.options.elementOptions.alert); + + if(typeOf(msg) == 'string') + { + alert.set('html', msg); + } + else if(typeOf(msg) == 'element') + { + alert.grab(msg); + } + else if(typeOf(msg) == 'array') + { + var alerts = []; + msg.each(function(m){ + alerts.push(this.alert(m, options)); + }, this); + return alerts; + } + + alert.store('options', options); + + if(options.buttons.length > 0) + { + options.clickDismiss = false; + options.hideAfter = false; + options.hoverWait = false; + var buttonWrapper = new Element(this.options.elements.buttonWrapper, this.options.elementOptions.buttonWrapper); + alert.grab(buttonWrapper); + options.buttons.each(function(button){ + if(button.text != undefined) + { + var callbackButton = new Element(this.options.elements.button, this.options.elementOptions.button); + callbackButton.set('html', button.text); + if(button.callback != undefined) + { + callbackButton.addEvent('click', button.callback.pass(alert)); + } + if(button.dismiss != undefined && button.dismiss) + { + callbackButton.addEvent('click', this.dismiss.pass(alert, this)); + } + buttonWrapper.grab(callbackButton); + } + }, this); + } + if(options.className != undefined) + { + alert.addClass(options.className); + } + + this.wrapper.grab(alert, (this.options.mode == 'top') ? 'bottom' : 'top'); + + var fx = Object.merge(this.options.alert.fx, options.fx); + var alertFx = new Fx.Morph(alert, fx); + alert.store('fx', alertFx); + this.fadeIn(alert); + + if(options.highlight) + { + alertFx.addEvent('complete', function(){ + alert.highlight(options.highlight.start, options.highlight.end); + if(options.highlightRepeat) + { + alert.highlight.periodical(options.highlightRepeat, alert, [options.highlight.start, options.highlight.end]); + } + }); + } + if(options.hideAfter) + { + this.dismiss(alert); + } + + if(options.clickDismiss) + { + alert.addEvent('click', function(){ + this.holdUp = false; + this.dismiss(alert, true); + }.bind(this)); + } + + if(options.hoverWait) + { + alert.addEvents({ + 'mouseenter': function(){ + this.holdUp = true; + }.bind(this), + 'mouseleave': function(){ + this.holdUp = false; + }.bind(this) + }); + } + + return alert; + }, + + 'fadeIn': function(alert){ + var alertFx = alert.retrieve('fx'); + alertFx.set({ + 'opacity': 0 + }); + alertFx.start({ + 'opacity': [this.options.elementOptions.alert.styles.opacity, .9].pick(), + }); + }, + + 'dismiss': function(alert, now){ + now = now || false; + var options = alert.retrieve('options'); + if(now) + { + this.fadeOut(alert); + } + else + { + this.fadeOut.delay(options.hideAfter, this, alert); + } + }, + + 'fadeOut': function(alert){ + if(this.holdUp) + { + this.dismiss.delay(100, this, [alert, true]) + return null; + } + var alertFx = alert.retrieve('fx'); + if(!alertFx) + { + return null; + } + var to = { + 'opacity': 0 + } + if(this.options.mode == 'top') + { + to['margin-top'] = '-'+alert.offsetHeight+'px'; + } + else + { + to['margin-bottom'] = '-'+alert.offsetHeight+'px'; + } + alertFx.start(to); + alertFx.addEvent('complete', function(){ + alert.destroy(); + }); + } +}); + +Element.implement({ + + 'alert': function(msg, options){ + var alert = this.retrieve('alert'); + if(!alert) + { + options = options || { + 'mode':'top' + }; + alert = new Purr(options) + this.store('alert', alert); + } + + var coords = this.getCoordinates(); + + alert.alert(msg, options); + + alert.wrapper.setStyles({ + 'bottom': '', + 'left': (coords.left - (alert.wrapper.getWidth() / 2)) + (this.getWidth() / 2), + 'top': coords.top - (alert.wrapper.getHeight()), + 'position': 'absolute' + }); + + } + +}); \ No newline at end of file diff --git a/pyload/webui/themes/default/js/static/purr.min.js b/pyload/webui/themes/default/js/static/purr.min.js new file mode 100644 index 000000000..bf70e357d --- /dev/null +++ b/pyload/webui/themes/default/js/static/purr.min.js @@ -0,0 +1 @@ +var Purr=new Class({options:{mode:"top",position:"left",elementAlertClass:"purr-element-alert",elements:{wrapper:"div",alert:"div",buttonWrapper:"div",button:"button"},elementOptions:{wrapper:{styles:{position:"fixed","z-index":"9999"},"class":"purr-wrapper"},alert:{"class":"purr-alert",styles:{opacity:".85"}},buttonWrapper:{"class":"purr-button-wrapper"},button:{"class":"purr-button"}},alert:{buttons:[],clickDismiss:!0,hoverWait:!0,hideAfter:5e3,fx:{duration:500},highlight:!1,highlightRepeat:!1,highlight:{start:"#FF0",end:!1}}},Implements:[Options,Events,Chain],initialize:function(t){return this.setOptions(t),this.createWrapper(),this},bindAlert:function(){return this.alert.bind(this)},createWrapper:function(){this.wrapper=new Element(this.options.elements.wrapper,this.options.elementOptions.wrapper),"top"==this.options.mode?this.wrapper.setStyle("top",0):this.wrapper.setStyle("bottom",0),document.id(document.body).grab(this.wrapper),this.positionWrapper(this.options.position)},positionWrapper:function(t){if("object"==typeOf(t)){var e=this.getWrapperCoords();this.wrapper.setStyles({bottom:"",left:t.x,top:t.y-e.height,position:"absolute"})}else"left"==t?this.wrapper.setStyle("left",0):"right"==t?this.wrapper.setStyle("right",0):this.wrapper.setStyle("left",window.innerWidth/2-this.getWrapperCoords().width/2);return this},getWrapperCoords:function(){this.wrapper.setStyle("visibility","hidden");var t=this.alert("need something in here to measure"),e=this.wrapper.getCoordinates();return t.destroy(),this.wrapper.setStyle("visibility",""),e},alert:function(t,e){e=Object.merge({},this.options.alert,e||{});var i=new Element(this.options.elements.alert,this.options.elementOptions.alert);if("string"==typeOf(t))i.set("html",t);else if("element"==typeOf(t))i.grab(t);else if("array"==typeOf(t)){var s=[];return t.each(function(t){s.push(this.alert(t,e))},this),s}if(i.store("options",e),e.buttons.length>0){e.clickDismiss=!1,e.hideAfter=!1,e.hoverWait=!1;var r=new Element(this.options.elements.buttonWrapper,this.options.elementOptions.buttonWrapper);i.grab(r),e.buttons.each(function(t){if(void 0!=t.text){var e=new Element(this.options.elements.button,this.options.elementOptions.button);e.set("html",t.text),void 0!=t.callback&&e.addEvent("click",t.callback.pass(i)),void 0!=t.dismiss&&t.dismiss&&e.addEvent("click",this.dismiss.pass(i,this)),r.grab(e)}},this)}void 0!=e.className&&i.addClass(e.className),this.wrapper.grab(i,"top"==this.options.mode?"bottom":"top");var o=Object.merge(this.options.alert.fx,e.fx),n=new Fx.Morph(i,o);return i.store("fx",n),this.fadeIn(i),e.highlight&&n.addEvent("complete",function(){i.highlight(e.highlight.start,e.highlight.end),e.highlightRepeat&&i.highlight.periodical(e.highlightRepeat,i,[e.highlight.start,e.highlight.end])}),e.hideAfter&&this.dismiss(i),e.clickDismiss&&i.addEvent("click",function(){this.holdUp=!1,this.dismiss(i,!0)}.bind(this)),e.hoverWait&&i.addEvents({mouseenter:function(){this.holdUp=!0}.bind(this),mouseleave:function(){this.holdUp=!1}.bind(this)}),i},fadeIn:function(t){var e=t.retrieve("fx");e.set({opacity:0}),e.start({opacity:[this.options.elementOptions.alert.styles.opacity,.9].pick()})},dismiss:function(t,e){e=e||!1;var i=t.retrieve("options");e?this.fadeOut(t):this.fadeOut.delay(i.hideAfter,this,t)},fadeOut:function(t){if(this.holdUp)return this.dismiss.delay(100,this,[t,!0]),null;var e=t.retrieve("fx");if(!e)return null;var i={opacity:0};"top"==this.options.mode?i["margin-top"]="-"+t.offsetHeight+"px":i["margin-bottom"]="-"+t.offsetHeight+"px",e.start(i),e.addEvent("complete",function(){t.destroy()})}});Element.implement({alert:function(t,e){var i=this.retrieve("alert");i||(e=e||{mode:"top"},i=new Purr(e),this.store("alert",i));var s=this.getCoordinates();i.alert(t,e),i.wrapper.setStyles({bottom:"",left:s.left-i.wrapper.getWidth()/2+this.getWidth()/2,top:s.top-i.wrapper.getHeight(),position:"absolute"})}}); \ No newline at end of file diff --git a/pyload/webui/themes/default/js/static/tinytab.js b/pyload/webui/themes/default/js/static/tinytab.js new file mode 100644 index 000000000..de50279fc --- /dev/null +++ b/pyload/webui/themes/default/js/static/tinytab.js @@ -0,0 +1,43 @@ +/* +--- +description: TinyTab - Tiny and simple tab handler for Mootools. + +license: MIT-style + +authors: +- Danillo César de O. Melo + +requires: +- core/1.2.4: '*' + +provides: TinyTab + +... +*/ +(function($) { + this.TinyTab = new Class({ + Implements: Events, + initialize: function(tabs, contents, opt) { + this.tabs = tabs; + this.contents = contents; + if(!opt) opt = {}; + this.css = opt.selectedClass || 'selected'; + this.select(this.tabs[0]); + tabs.each(function(el){ + el.addEvent('click',function(e){ + this.select(el); + e.stop(); + }.bind(this)); + }.bind(this)); + }, + + select: function(el) { + this.tabs.removeClass(this.css); + el.addClass(this.css); + this.contents.setStyle('display','none'); + var content = this.contents[this.tabs.indexOf(el)]; + content.setStyle('display','block'); + this.fireEvent('change',[content,el]); + } + }); +})(document.id); \ No newline at end of file diff --git a/pyload/webui/themes/default/js/static/tinytab.min.js b/pyload/webui/themes/default/js/static/tinytab.min.js new file mode 100644 index 000000000..2f4fa0436 --- /dev/null +++ b/pyload/webui/themes/default/js/static/tinytab.min.js @@ -0,0 +1 @@ +!function(){this.TinyTab=new Class({Implements:Events,initialize:function(s,t,e){this.tabs=s,this.contents=t,e||(e={}),this.css=e.selectedClass||"selected",this.select(this.tabs[0]),s.each(function(s){s.addEvent("click",function(t){this.select(s),t.stop()}.bind(this))}.bind(this))},select:function(s){this.tabs.removeClass(this.css),s.addClass(this.css),this.contents.setStyle("display","none");var t=this.contents[this.tabs.indexOf(s)];t.setStyle("display","block"),this.fireEvent("change",[t,s])}})}(document.id); \ No newline at end of file diff --git a/pyload/webui/themes/default/tml/admin.html b/pyload/webui/themes/default/tml/admin.html new file mode 100644 index 000000000..ba94f7a74 --- /dev/null +++ b/pyload/webui/themes/default/tml/admin.html @@ -0,0 +1,98 @@ +{% extends '/default/tml/base.html' %} + +{% block head %} + +{% endblock %} + + +{% block title %}{{ _("Administrate") }} - {{ super() }} {% endblock %} +{% block subtitle %}{{ _("Administrate") }}{% endblock %} + +{% block content %} + + {{_("Quit pyLoad")}} | + {{_("Restart pyLoad")}} +
          +
          + + {{ _("To add user or change passwords use:") }} python pyload.py -u
          + {{ _("Important: Admin user have always all permissions!") }} + +
          + + + + + + + + + {% for name, data in users.iteritems() %} + + + + + + + {% endfor %} + + +
          + {{ _("Name") }} + + {{ _("Change Password") }} + + {{ _("Admin") }} + + {{ _("Permissions") }} +
          {{ name }}{{ _("change") }} + +
          + + +
          +{% endblock %} +{% block hidden %} +
          +
          +

          {{ _("Change Password") }}

          + +

          {{ _("Enter your current and desired Password.") }}

          + + + + + + + + + + + + + + + +
          + +
          + +
          +{% endblock %} diff --git a/pyload/webui/themes/default/tml/base.html b/pyload/webui/themes/default/tml/base.html new file mode 100644 index 000000000..e2a62a116 --- /dev/null +++ b/pyload/webui/themes/default/tml/base.html @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + +{% block title %}pyLoad {{_("Webinterface")}}{% endblock %} + +{% block head %} +{% endblock %} + + + + +
          + + +
          + {% block headpanel %} + + {% if user.is_authenticated %} + + +{% if update %} + +{{_("New pyLoad version %s available!") % update}} + +{% endif %} + + +{% if plugins %} + +{{_("Plugins updated, please restart!")}} + +{% endif %} + + +Captcha: +{{_("Captcha waiting")}} + + + User:{{user.name}} + +{% else %} + {{_("Please Login!")}} +{% endif %} + + {% endblock %} +
          + + + +
          + +
          + +
          +
          + +{% if perms.STATUS %} + +{% endif %} + +{% if perms.LIST %} + +{% endif %} + +{% block pageactions %} +{% endblock %} +
          + +
          + +
          + +

          {% block subtitle %}pyLoad - {{_("Webinterface")}}{% endblock %}

          + +{% block statusbar %} +{% endblock %} + + +
          + +
          +
          + + +{% for message in messages %} +

          {{message}}

          +{% endfor %} + +
          + + {{_("loading")}} +
          + +{% block content %} +{% endblock content %} + +
          + + +
          +
          + +
          + {% include '/default/tml/window.html' %} + {% include '/default/tml/captcha.html' %} + {% block hidden %} + {% endblock %} +
          + + diff --git a/pyload/webui/themes/default/tml/captcha.html b/pyload/webui/themes/default/tml/captcha.html new file mode 100644 index 000000000..56892593f --- /dev/null +++ b/pyload/webui/themes/default/tml/captcha.html @@ -0,0 +1,42 @@ + +
          + +
          + +

          {{_("Captcha reading")}}

          +

          {{_("Please read the text on the captcha.")}}

          + +
          + + + + + + + + + + + +
          + +
          + +
          + +
          + + + + +
          + +
          + +
          + +
          diff --git a/pyload/webui/themes/default/tml/downloads.html b/pyload/webui/themes/default/tml/downloads.html new file mode 100644 index 000000000..ba0f77c18 --- /dev/null +++ b/pyload/webui/themes/default/tml/downloads.html @@ -0,0 +1,29 @@ +{% extends '/default/tml/base.html' %} + +{% block title %}Downloads - {{super()}} {% endblock %} + +{% block subtitle %} +{{_("Downloads")}} +{% endblock %} + +{% block content %} + +
            + {% for folder in files.folder %} +
          • + {{ folder.name }} +
              + {% for file in folder.files %} +
            • {{file}}
            • + {% endfor %} +
            +
          • + {% endfor %} + + {% for file in files.files %} +
          • {{ file }}
          • + {% endfor %} + +
          + +{% endblock %} diff --git a/pyload/webui/themes/default/tml/filemanager.html b/pyload/webui/themes/default/tml/filemanager.html new file mode 100644 index 000000000..7a370d04c --- /dev/null +++ b/pyload/webui/themes/default/tml/filemanager.html @@ -0,0 +1,78 @@ +{% extends '/default/tml/base.html' %} + +{% block head %} + + + + +{% endblock %} + +{% block title %}Downloads - {{super()}} {% endblock %} + + +{% block subtitle %} +{{_("FileManager")}} +{% endblock %} + +{% macro display_file(file) %} +
        • + + + + {{ file.name }} + + +    + + + +
        • +{%- endmacro %} + +{% macro display_folder(fld, open = false) -%} +
        • + + + + {{ fld.name }} + + +    + +    + + + + {% if (fld.folders|length + fld.files|length) > 0 %} + {% if open %} +
            + {% else %} +
              + {% endif %} + {% for child in fld.folders %} + {{ display_folder(child) }} + {% endfor %} + {% for child in fld.files %} + {{ display_file(child) }} + {% endfor %} +
            + {% else %} +
            {{ _("Folder is empty") }}
            + {% endif %} + +{%- endmacro %} + +{% block content %} + +
            + +
              +{{ display_folder(root, true) }} +
            + +{% endblock %} diff --git a/pyload/webui/themes/default/tml/folder.html b/pyload/webui/themes/default/tml/folder.html new file mode 100644 index 000000000..227a46ba0 --- /dev/null +++ b/pyload/webui/themes/default/tml/folder.html @@ -0,0 +1,15 @@ +
          • + + + + {{ name }} + + +    + +    + + + +
            {{ _("Folder is empty") }}
            +
          • diff --git a/pyload/webui/themes/default/tml/home.html b/pyload/webui/themes/default/tml/home.html new file mode 100644 index 000000000..0fff703b5 --- /dev/null +++ b/pyload/webui/themes/default/tml/home.html @@ -0,0 +1,266 @@ +{% extends '/default/tml/base.html' %} +{% block head %} + + + +{% endblock %} + +{% block subtitle %} +{{_("Active Downloads")}} +{% endblock %} + +{% block menu %} +
          • + {{_("Home")}} +
          • +
          • + {{_("Queue")}} +
          • +
          • + {{_("Collector")}} +
          • +
          • + {{_("Downloads")}} +
          • +{#
          • #} +{# {{_("FileManager")}}#} +{#
          • #} +
          • + {{_("Logs")}} +
          • +
          • + {{_("Config")}} +
          • +{% endblock %} + +{% block content %} + + + + + + + + + + + + + {% for link in content %} + + + + + + + + + + + {% endfor %} + + +
            {{_("Name")}}{{_("Status")}}{{_("Information")}}{{_("Size")}}{{_("Progress")}}
            +{% endblock %} diff --git a/pyload/webui/themes/default/tml/info.html b/pyload/webui/themes/default/tml/info.html new file mode 100644 index 000000000..2deaa6dce --- /dev/null +++ b/pyload/webui/themes/default/tml/info.html @@ -0,0 +1,81 @@ +{% extends '/default/tml/base.html' %} + +{% block head %} + +{% endblock %} + +{% block title %}{{ _("Information") }} - {{ super() }} {% endblock %} +{% block subtitle %}{{ _("Information") }}{% endblock %} + +{% block content %} +

            {{ _("News") }}

            +
            + +

            {{ _("Support") }}

            + + + +

            {{ _("System") }}

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            {{ _("Python:") }}{{ python }}
            {{ _("OS:") }}{{ os }}
            {{ _("pyLoad version:") }}{{ version }}
            {{ _("Installation Folder:") }}{{ folder }}
            {{ _("Config Folder:") }}{{ config }}
            {{ _("Download Folder:") }}{{ download }}
            {{ _("Free Space:") }}{{ freespace }}
            {{ _("Language:") }}{{ language }}
            {{ _("Webinterface Port:") }}{{ webif }}
            {{ _("Remote Interface Port:") }}{{ remote }}
            + +{% endblock %} diff --git a/pyload/webui/themes/default/tml/login.html b/pyload/webui/themes/default/tml/login.html new file mode 100644 index 000000000..089275219 --- /dev/null +++ b/pyload/webui/themes/default/tml/login.html @@ -0,0 +1,36 @@ +{% extends '/default/tml/base.html' %} + +{% block title %}{{_("Login")}} - {{super()}} {% endblock %} + +{% block content %} + +
            +
            +
            + +
            + Login + +
            + +
            + +
            +
            +
            + +{% if errors %} +

            {{_("Your username and password didn't match. Please try again.")}}

            + {{ _("To reset your login data or add an user run:") }} python pyload.py -u +{% endif %} + +
            +
            + +{% endblock %} diff --git a/pyload/webui/themes/default/tml/logout.html b/pyload/webui/themes/default/tml/logout.html new file mode 100644 index 000000000..196676de5 --- /dev/null +++ b/pyload/webui/themes/default/tml/logout.html @@ -0,0 +1,9 @@ +{% extends '/default/tml/base.html' %} + +{% block head %} + +{% endblock %} + +{% block content %} +

            {{_("You were successfully logged out.")}}

            +{% endblock %} diff --git a/pyload/webui/themes/default/tml/logs.html b/pyload/webui/themes/default/tml/logs.html new file mode 100644 index 000000000..1706be8a6 --- /dev/null +++ b/pyload/webui/themes/default/tml/logs.html @@ -0,0 +1,41 @@ +{% extends '/default/tml/base.html' %} + +{% block title %}{{_("Logs")}} - {{super()}} {% endblock %} +{% block subtitle %}{{_("Logs")}}{% endblock %} +{% block head %} + +{% endblock %} + +{% block content %} +
            + + +
            +
            + +   + + +
            +
            +
            {{warning}}
            +
            +
            + + {% for line in log %} + + {% endfor %} +
            {{line.line}}{{line.date}}{{line.level}}{{line.message}}
            +
            +
            +
            + + +
            +
            +
             
            +{% endblock %} diff --git a/pyload/webui/themes/default/tml/pathchooser.html b/pyload/webui/themes/default/tml/pathchooser.html new file mode 100644 index 000000000..8ce9ab072 --- /dev/null +++ b/pyload/webui/themes/default/tml/pathchooser.html @@ -0,0 +1,76 @@ + + + + + + +
            +
            +
            + + +
            + + {% if type == 'folder' %} + {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} + {% else %} + {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} + {% endif %} +
            + + + + + + + + {% if parentdir %} + + + + {% endif %} +{% for file in files %} + + {% if type == 'folder' %} + + {% else %} + + {% endif %} + + + + + +{% endfor %} +
            {{_("name")}}{{_("size")}}{{_("type")}}{{_("last modified")}}
            + {{_("parent directory")}} +
            {% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{{ file.size|float|filesizeformat }}{% if file.type == 'dir' %}directory{% else %}{{ file.ext|default("file") }}{% endif %}{{ file.modified|date("d.m.Y - H:i:s") }}
            +
            + + diff --git a/pyload/webui/themes/default/tml/queue.html b/pyload/webui/themes/default/tml/queue.html new file mode 100644 index 000000000..035ee1808 --- /dev/null +++ b/pyload/webui/themes/default/tml/queue.html @@ -0,0 +1,104 @@ +{% extends '/default/tml/base.html' %} +{% block head %} + + + + +{% endblock %} + +{% if target %} + {% set name = _("Queue") %} +{% else %} + {% set name = _("Collector") %} +{% endif %} + +{% block title %}{{name}} - {{super()}} {% endblock %} +{% block subtitle %}{{name}}{% endblock %} + +{% block pageactions %} + +{% endblock %} + +{% block content %} +{% autoescape true %} + +
              +{% for package in content %} +
            • +
              + + +
              + + {{package.name}} +    + + +    + +    + +    + + +
              + {% set progress = (package.linksdone * 100) / package.linkstotal %} + +
              +
              + + +
              +
              + + +
              +
            • +{% endfor %} +
            +{% endautoescape %} +{% endblock %} + +{% block hidden %} +
            +
            +

            {{_("Edit Package")}}

            +

            {{_("Edit the package detais below.")}}

            + + + + + + + + + + + + +
            + +
            + +
            +{% endblock %} diff --git a/pyload/webui/themes/default/tml/settings.html b/pyload/webui/themes/default/tml/settings.html new file mode 100644 index 000000000..fddc6e35c --- /dev/null +++ b/pyload/webui/themes/default/tml/settings.html @@ -0,0 +1,204 @@ +{% extends '/default/tml/base.html' %} + +{% block title %}{{ _("Config") }} - {{ super() }} {% endblock %} +{% block subtitle %}{{ _("Config") }}{% endblock %} + +{% block head %} + + + + +{% endblock %} + +{% block content %} + + + +
            + +
            + + + + + + +
            + +
            +

               {{ _("Choose a section from the menu") }}

            +
            +
            + + +
            +
            + + + + + + +
            + + +
            +

               {{ _("Choose a section from the menu") }}

            +
            +
            + +
            + +
            + + + +
            + + + + + + + + + + + + + + + + + + + + {% for account in conf.accs %} + {% set plugin = account.type %} + + + + + + + + + + + + + + {% endfor %} +
            {{ _("Plugin") }}{{ _("Name") }}{{ _("Password") }}{{ _("Status") }}{{ _("Premium") }}{{ _("Valid until") }}{{ _("Traffic left") }}{{ _("Time") }}{{ _("Max Parallel") }}{{ _("Delete?") }}
            + {{ plugin }} + + + + {% if account.valid %} + + {{ _("valid") }} + {% else %} + + {{ _("not valid") }} + {% endif %} + + + {% if account.premium %} + + {{ _("yes") }} + {% else %} + + {{ _("no") }} + {% endif %} + + + + {{ account.validuntil }} + + + + {{ account.trafficleft }} + + + + + + + +
            + + + +
            +
            +
            +{% endblock %} +{% block hidden %} +
            +
            +

            {{_("Add Account")}}

            +

            {{_("Enter your account data to use premium features.")}}

            + + + + + + + + + + + +
            + +
            + +
            +{% endblock %} diff --git a/pyload/webui/themes/default/tml/settings_item.html b/pyload/webui/themes/default/tml/settings_item.html new file mode 100644 index 000000000..6642d34b4 --- /dev/null +++ b/pyload/webui/themes/default/tml/settings_item.html @@ -0,0 +1,48 @@ + + {% if section.outline %} + + {% endif %} + {% for okey, option in section.iteritems() %} + {% if okey not in ("desc", "outline") %} + + + + + {% endif %} + {% endfor %} +
            {{ section.outline }}
            + {% if option.type == "bool" %} + + {% elif ";" in option.type %} + + {% elif option.type == "folder" %} + + + {% elif option.type == "file" %} + + + {% elif option.type == "password" %} + + {% else %} + + {% endif %} +
            diff --git a/pyload/webui/themes/default/tml/window.html b/pyload/webui/themes/default/tml/window.html new file mode 100644 index 000000000..e73eba2bd --- /dev/null +++ b/pyload/webui/themes/default/tml/window.html @@ -0,0 +1,46 @@ + + +
            +
            +

            {{_("Add Package")}}

            +

            {{_("Paste your links or upload a container.")}}

            + + + + + + + + + + + + + + + {{_("Queue")}} + + {{_("Collector")}} + + + + + +
            + +
            + +
            diff --git a/pyload/webui/themes/flat/css/MooDialog.css b/pyload/webui/themes/flat/css/MooDialog.css new file mode 100644 index 000000000..3ba94cafd --- /dev/null +++ b/pyload/webui/themes/flat/css/MooDialog.css @@ -0,0 +1,84 @@ +/* Created by Arian Stolwijk */ + +.MooDialog { +/* position: fixed;*/ + margin: 0 auto 0 -350px; + width:600px; + padding:14px; + left:50%; + top: 100px; + + position: absolute; + left: 50%; + z-index: 50000; + + background: #CDCDCD; + color: black; +} + +.MooDialogTitle { + padding-top: 30px; +} + +.MooDialog .title { + position: absolute; + top: 0; + left: 0; + right: 0; + padding: 3px 20px; + background: #b7c4dc; + border-bottom: 1px solid #a1aec5; + font-weight: bold; + text-shadow: 1px 1px 0 #fff; + color: black; + border-radius: 7px; + -moz-border-radius: 7px; + -webkit-border-radius: 7px; +} + +.MooDialog .close { + background: url(../img/control_cancel.png) no-repeat; + width: 16px; + height: 16px; + display: block; + cursor: pointer; + top: -5px; + left: -5px; + position: absolute; +} + +.MooDialog .buttons { + text-align: right; + margin: 0; + padding: 0; + border: 0; + background: none; +} + +.MooDialog .iframe { + width: 100%; + height: 100%; +} + +.MooDialog .textInput { + width: 200px; + float: left; +} + +.MooDialog .MooDialogAlert, +.MooDialog .MooDialogConfirm, +.MooDialog .MooDialogPrompt, +.MooDialog .MooDialogError { + background: url(../img/MooDialog/dialog-warning.png) no-repeat; + padding-left: 40px; + min-height: 40px; +} + +.MooDialog .MooDialogConfirm, +.MooDialog .MooDialogPromt { + background: url(../img/MooDialog/dialog-question.png) no-repeat; +} + +.MooDialog .MooDialogError { + background: url(../img/MooDialog/dialog-error.png) no-repeat; +} diff --git a/pyload/webui/themes/flat/css/flat.css b/pyload/webui/themes/flat/css/flat.css new file mode 100644 index 000000000..1a542962f --- /dev/null +++ b/pyload/webui/themes/flat/css/flat.css @@ -0,0 +1,863 @@ +.hidden { + display:none; +} +.leftalign { + text-align:left; +} +.centeralign { + text-align:center; +} +.rightalign { + text-align:right; +} +.dokuwiki div.plugin_translation ul li a.wikilink1:link, .dokuwiki div.plugin_translation ul li a.wikilink1:hover, .dokuwiki div.plugin_translation ul li a.wikilink1:active, .dokuwiki div.plugin_translation ul li a.wikilink1:visited { + background-color:#000080; + border:none !important; + color:#FFFFFF !important; + margin:0.1em 0.2em; + padding:0 0.2em; + text-decoration:none; +} +.dokuwiki div.plugin_translation ul li a.wikilink2:link, .dokuwiki div.plugin_translation ul li a.wikilink2:hover, .dokuwiki div.plugin_translation ul li a.wikilink2:active, .dokuwiki div.plugin_translation ul li a.wikilink2:visited { + background-color:#808080; + border:none !important; + color:#FFFFFF !important; + margin:0.1em 0.2em; + padding:0 0.2em; + text-decoration:none; +} +.dokuwiki div.plugin_translation ul li a:hover img { + height:15px; + opacity:1; +} +body { + background-color:white; + color:black; + font-family:'Open Sans', sans-serif; + font-size:12px; + font-style:normal; + font-variant:normal; + font-weight:300; + line-height:normal; + margin:0; + padding:0; +} +hr { + border-bottom-color:#AAAAAA; + border-bottom-style:dotted; +} +img { + border:none; +} +form { + background-color:transparent; + border:none; + display:inline; + margin:0; + padding:0; +} +ul li { + margin:5px; +} +textarea { + font-family:monospace; +} +table { + border-collapse:collapse; + margin:0.5em 0; +} +td { + border:1pt solid #ADB9CC; + padding:0.25em; +} +a { + color:#3465A4; + text-decoration:none; +} +a:hover { + text-decoration:underline; +} +option { + border:0 none #FFFFFF; +} +strong.highlight { + background-color:#FFCC99; + padding:1pt; +} +#pagebottom { + clear:both; +} +hr { + background-color:#C0C0C0; + border:none; + color:#C0C0C0; + margin:0.2em 0; +} +.invisible { + border:0; + height:0; + margin:0; + padding:0; + visibility:hidden; +} +.left { + float:left !important; +} +.right { + float:right !important; +} +.center { + text-align:center; +} +div#body-wrapper { + font-size:127%; + padding:40px 40px 10px; +} +div#content { + color:black; + font-size:14px; + line-height:1.5em; + margin-top:-20px; + padding:0; +} +h1, h2, h3, h4, h5, h6 { + background-attachment:scroll; + background-color:transparent; + background-image:none; + background-position:0 0; + background-repeat:repeat repeat; + color:black; + font-family:'Open Sans', sans-serif; + font-weight:normal; + margin:0; + padding:0.5em 0 0.17em; +} +h1 { + font-family:'Open Sans', sans-serif; + font-weight:300; + line-height:1.2em; + margin-bottom:0.1em; + margin-left:-25px; + padding-bottom:0; + margin-left:-25px; +} +h2 { + font-size:150%; +} +h3, h4, h5, h6 { + border-bottom-style:none; + font-weight:bold; +} +h3 { + font-size:132%; +} +h4 { + font-size:116%; +} +h5 { + font-size:100%; +} +h6 { + font-size:80%; +} +ul#page-actions, ul#page-actions-more { + background-color:#ECECEC; + color:black; + float:right; + list-style-type:none; + margin:10px 10px 0; + padding:6px; + white-space:nowrap; +} +ul#user-actions { + background-color:#ECECEC; + color:black; + display:inline; + list-style-type:none; + margin:0; + padding:5px; +} +ul#page-actions li, ul#user-actions li, ul#page-actions-more li { + display:inline; +} +ul#page-actions a, ul#user-actions a, ul#page-actions-more a { + color:black; + display:inline; + margin:0 3px; + padding:2px 0 2px 18px; + text-decoration:none; +} +ul#page-actions a:hover, ul#page-actions a:focus, ul#user-actions a:hover, ul#user-actions a:focus { +} +ul#page-actions2 { + background-color:#ECECEC; + color:black; + float:left; + list-style-type:none; + margin:10px 10px 0; + padding:6px; +} +ul#user-actions2 { + background-color:#ECECEC; + border-bottom-left-radius:3px; + border-bottom-right-radius:3px; + border-top-left-radius:3px; + border-top-right-radius:3px; + color:black; + display:inline; + list-style-type:none; + margin:0; + padding:5px; +} +ul#page-actions2 li, ul#user-actions2 li { + display:inline; +} +ul#page-actions2 a, ul#user-actions2 a { + color:black; + display:inline; + margin:0 3px; + padding:2px 0 2px 18px; + text-decoration:none; +} +ul#page-actions2 a:hover, ul#page-actions2 a:focus, ul#user-actions2 a:hover, ul#user-actions2 a:focus, ul#page-actions-more a:hover, ul#page-actions-more a:focus { + color:#4E7BB4; +} +.hidden { + display:none; +} +a.logout { + background-color:transparent; + background-image:url(../img/user-actions-logout.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.info { + background-color:transparent; + background-image:url(../img/user-info.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.admin { + background-color:transparent; + background-image:url(../img/user-actions-admin.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.profile { + background-color:transparent; + background-image:url(../img/user-actions-profile.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.create, a.edit { + background-color:transparent; + background-image:url(../img/page-tools-edit.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.source, a.show { + background-color:transparent; + background-image:url(../img/page-tools-source.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.revisions { + background-color:transparent; + background-image:url(../img/page-tools-revisions.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.subscribe, a.unsubscribe { + background-color:transparent; + background-image:url(../img/page-tools-subscribe.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.backlink { + background-color:transparent; + background-image:url(../img/page-tools-backlinks.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.play { + background-color:transparent; + background-image:url(../img/control_play.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +.time { + background-color:transparent; + background-image:url(../img/status_None.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; + margin:0 3px; + padding:2px 0 2px 18px; +} +.reconnect { + background-color:transparent; + background-image:url(../img/reconnect.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; + margin:0 3px; + padding:2px 0 2px 18px; +} +a.play:hover { + background-color:transparent; + background-image:url(../img/control_play_blue.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.cancel { + background-color:transparent; + background-image:url(../img/control_cancel.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.cancel:hover { + background-color:transparent; + background-image:url(../img/control_cancel_blue.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.pause { + background-color:transparent; + background-image:url(../img/control_pause.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.pause:hover { + background-color:transparent; + background-image:url(../img/control_pause_blue.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; + font-weight:bold; +} +a.stop { + background-color:transparent; + background-image:url(../img/control_stop.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.stop:hover { + background-color:transparent; + background-image:url(../img/control_stop_blue.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.add { + background-color:transparent; + background-image:url(../img/control_add.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.add:hover { + background-color:transparent; + background-image:url(../img/control_add_blue.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +a.cog { + background-color:transparent; + background-image:url(../img/cog.png); + background-position:0 1px; + background-repeat:no-repeat no-repeat; +} +#head-panel { + background-color:#DDDDDD; + background-position:0 100%; + background-repeat:repeat no-repeat; +} +#head-panel h1 { + color:#EEEEEC; + display:none; + font-size:2.6em; + margin:0; + padding-left:3.3em; + padding-top:0.8em; + text-decoration:none; +} +#head-panel #head-logo { + float:left; + overflow:visible; + padding:11px 8px 0; +} +#head-menu { + float:left; + margin:0; + padding:1em 0 0; + width:100%; +} +#head-menu ul { + list-style:none; + margin:0 1em 0 2em; +} +#head-menu ul li { + float:left; + font-size:14px; + margin:0 0 4px 0.3em; +} +#head-menu ul li.selected, #head-menu ul li:hover { + margin-bottom:0; +} +#head-menu ul li a img { + height:22px; + padding-right:4px; + vertical-align:middle; + width:22px; +} +#head-menu ul li a, #head-menu ul li a:link { + background-color:#EAEAEA; + background-position:0 100%; + background-repeat:repeat no-repeat; + border-color:#CCCCCC #CCCCCC transparent; + color:#555555; + padding:7px 15px 8px; + text-decoration:none; +} +#head-menu ul li a:hover, #head-menu ul li a:focus { + border-bottom-color:transparent; + border-bottom-left-radius:0; + border-bottom-right-radius:0; + border-bottom-style:none; + border-bottom-width:0; + color:#111111; + outline:none; + padding-bottom:7px; +} +#head-menu ul li a:focus { + margin-bottom:-4px; +} +#head-menu ul li.selected a { + background-color:#FFFFFF; + border-bottom-color:transparent; + color:#3566A5; + padding:7px 15px 8px; +} +#head-menu ul li.selected a:hover, #head-menu ul li.selected a:focus { + color:#111111; +} +div#head-search-and-login { + color:white; + float:right; + margin:0 1em 0 0; + padding:7px 7px 5px 5px; + white-space:nowrap; +} +div#head-search-and-login form { + display:inline; + padding:0 3px; +} +div#head-search-and-login form input { + background-color:#EEEEEE; + border:2px solid #888888; + border-bottom-left-radius:3px; + border-bottom-right-radius:3px; + border-top-left-radius:3px; + border-top-right-radius:3px; + font-size:14px; + padding:2px; +} +div#head-search-and-login form input:focus { + background-color:#FFFFFF; +} +#head-search { + font-size:14px; +} +#head-username, #head-password { + font-size:14px; + width:80px; +} +#pageinfo { + clear:both; + color:#888888; + margin:0; + padding:0.6em 0; +} +#foot { + color:#888888; + font-style:normal; + text-align:center; +} +#foot a { + color:#AAAAFF; +} +#foot img { + vertical-align:middle; +} +div.toc { + background-color:#F0F0F0; + border:1px dotted #888888; + float:right; + font-size:95%; + margin:1em 0 1em 1em; +} +div.toc .tocheader { + font-weight:bold; + margin:0.5em 1em; +} +div.toc ol { + margin:1em 0.5em 1em 1em; + padding:0; +} +div.toc ol li { + margin:0 0 0 1em; + padding:0; +} +div.toc ol ol { + margin:0.5em 0.5em 0.5em 1em; + padding:0; +} +div.recentchanges table { + clear:both; +} +div#editor-help { + background-color:#F7F6F2; + border:1px dotted #888888; + font-size:90%; + padding:0 1ex 1ex; +} +div#preview { + margin-top:1em; +} +label.block { + display:block; + font-weight:bold; + text-align:right; +} +label.simple { + display:block; + font-weight:normal; + text-align:left; +} +label.block input.edit { + width:50%; +} +div.editor { + margin:0; +} +table { + border-collapse:collapse; + margin:0.5em 0; +} +td { + border:1pt solid #ADB9CC; + padding:0.25em; +} +td p { + margin:0; + padding:0; +} +.u { + text-decoration:underline; +} +.footnotes ul { + margin:0 0 1em; + padding:0 2em; +} +.footnotes li { + list-style:none; +} +.userpref table, .userpref td { + border:none; +} +#message { + background-color:#EEEEEE; + border-bottom-color:#CCCCCC; + border-bottom-style:solid; + border-bottom-width:2px; + clear:both; + padding:5px 10px; +} +#message p { + font-weight:bold; + margin:5px 0; + padding:0; +} +#message div.buttons { + font-weight:normal; +} +.diff { + width:99%; +} +.diff-title { + background-color:#C0C0C0; +} +.searchresult dd span { + font-weight:400; +} +.boxtext { + color:#000000; + float:none; + font-family:tahoma, arial, sans-serif; + font-size:11px; + padding:3px 0 0 10px; +} +.statusbutton { + cursor:pointer; + float:left; + height:32px; + margin-left:-32px; + margin-right:5px; + opacity:0; + width:32px; +} +.dlsize { + float:left; + padding-right:8px; +} +.dlspeed { + float:left; + padding-right:8px; +} +.package { + margin-bottom:10px; +} +.packagename { + font-weight:300; +} +.child { + margin-left:20px; +} +.child_status { + margin-right:10px; +} +.child_secrow { + font-size:10px; +} +.header, .header th { + background-color:#ECECEC; + font-weight:300; + text-align:left; +} +.progress_bar { + background-color:#00CC00; + height:5px; +} +.queue { + border:none; +} +.queue tr td { + border:none; +} +.header, .header th { + font-weight:normal; + text-align:left; +} +.clearer { + clear:both; + height:1px; +} +.left { + float:left; +} +.right { + float:right; +} +.setfield { + display:table-cell; +} +ul.tabs li a { + border:none; + border-bottom-left-radius:0; + border-bottom-right-radius:0; + border-top-left-radius:5px; + border-top-right-radius:5px; + font-weight:bold; + padding:5px 16px 4px 15px; +} +#tabs span { + display:none; +} +#tabs span.selected { + display:inline; +} +#tabsback { + background-color:#525252; + border-top-left-radius:3px; + border-top-right-radius:30px; + margin:2px 0 0; + padding:6px 4px 1px; +} +ul.tabs { + list-style-type:none; + margin:0; + padding:0 40px 0 0; +} +ul.tabs li { + display:inline; + margin-left:8px; +} +ul.tabs li a { + background-color:#EAEAEA; + border:1px none #C9C3BA; + border-bottom-left-radius:0; + border-bottom-right-radius:0; + border-top-left-radius:5px; + border-top-right-radius:5px; + color:#42454A; + font-weight:bold; + margin:0; + outline:0; + padding:5px 16px 4px 15px; + text-decoration:none; +} +ul.tabs li a.selected, ul.tabs li a:hover { + background-color:white; + border-bottom-left-radius:0; + border-bottom-right-radius:0; + color:#000000; +} +ul.tabs li a:hover { + background-color:#F1F4EE; +} +ul.tabs li a.selected { + background-color:#525252; + color:white; + font-weight:bold; + padding-bottom:5px; +} +#tabs-body { + overflow:hidden; + position:relative; +} +span.tabContent { + border:2px solid #525252; + margin:0; + padding:0 0 10px; +} +#tabs-body > span { + display:none; +} +#tabs-body > span.active { + display:block; +} +.hide { + display:none; +} +.settable { + border:none; + margin:20px; +} +.settable td { + border:none; + margin:0; + padding:5px; +} +.settable th { + padding-bottom:8px; +} +.settable.wide td, .settable.wide th { + padding-left:15px; + padding-right:15px; +} +ul.nav { + list-style:none; + margin:-30px 0 0; + padding:0; + position:absolute; +} +ul.nav li { + float:left; + padding:5px; + position:relative; +} +ul.nav > li a { + background-color:white; + border-left-color:#C9C3BA; + border-right-color:#C9C3BA; + border-style:solid solid none; + border-top-color:#C9C3BA; + border-width:1px 1px medium; + color:black; +} +ul.nav ul { + -webkit-box-shadow:#AAAAAA 1px 1px 5px; + background-color:#F1F1F1; + border:1px solid #AAAAAA; + box-shadow:#AAAAAA 1px 1px 5px; + cursor:pointer; + left:10px; + list-style:none; + margin:0; + padding:0; + position:absolute; + top:26px; +} +ul.nav .open { + display:block; +} +ul.nav .close { + display:none; +} +ul.nav ul li { + float:none; + padding:0; +} +ul.nav ul li a { + background-color:#F1F1F1; + display:block; + font-weight:normal; + padding:3px; + width:130px; +} +ul.nav ul li a:hover { + background-color:#CDCDCD; +} +ul.nav ul ul { + left:137px; + top:0; +} +.purr-wrapper { + margin:10px; +} +.purr-alert { + background-color:#000000; + border-bottom-left-radius:5px; + border-bottom-right-radius:5px; + border-top-left-radius:5px; + border-top-right-radius:5px; + color:#FFFFFF; + font-size:13px; + font-weight:bold; + margin-bottom:10px; + padding:10px; + width:300px; +} +.purr-alert.error { + background-color:#000000; + background-image:url(../img/error.png); + background-position:7px 10px; + background-repeat:no-repeat no-repeat; + color:#FF5555; + padding-left:30px; + width:280px; +} +.purr-alert.success { + background-color:#000000; + background-image:url(../img/success.png); + background-position:7px 10px; + background-repeat:no-repeat no-repeat; + color:#55FF55; + padding-left:30px; + width:280px; +} +.purr-alert.notice { + background-color:#000000; + background-image:url(../img/notice.png); + background-position:7px 10px; + background-repeat:no-repeat no-repeat; + color:#9999FF; + padding-left:30px; + width:280px; +} +table.system { + border:none; + margin-left:10px; +} +table.system td { + border:none; +} +table.system tr > td:first-child { + font-weight:bold; + padding-right:10px; +} \ No newline at end of file diff --git a/pyload/webui/themes/flat/css/log.css b/pyload/webui/themes/flat/css/log.css new file mode 100644 index 000000000..af2ea4fe8 --- /dev/null +++ b/pyload/webui/themes/flat/css/log.css @@ -0,0 +1,72 @@ + +html, body, #content +{ + height: 100%; +} +#body-wrapper +{ + height: 70%; +} +.logdiv +{ + height: 90%; + width: 100%; + overflow: auto; + border: 2px solid #CCC; + outline: 1px solid #666; + background-color: #FFE; + margin-right: auto; + margin-left: auto; +} +.logform +{ + display: table; + margin: 0 auto 0 auto; + padding-top: 5px; +} +.logtable +{ + + margin: 0px; +} +.logtable td +{ + border: none; + white-space: nowrap; + + + font-family: monospace; + font-size: 16px; + margin: 0px; + padding: 0px 10px 0px 10px; + line-height: 110%; +} +td.logline +{ + background-color: #EEE; + text-align:right; + padding: 0px 5px 0px 5px; +} +td.loglevel +{ + text-align:right; +} +.logperpage +{ + float: right; + padding-bottom: 8px; +} +.logpaginator +{ + float: left; + padding-top: 5px; +} +.logpaginator a +{ + padding: 0px 8px 0px 8px; +} +.logwarn +{ + text-align: center; + color: red; +} \ No newline at end of file diff --git a/pyload/webui/themes/flat/css/pathchooser.css b/pyload/webui/themes/flat/css/pathchooser.css new file mode 100644 index 000000000..894cc335e --- /dev/null +++ b/pyload/webui/themes/flat/css/pathchooser.css @@ -0,0 +1,68 @@ +table { + width: 90%; + border: 1px dotted #888888; + font-family: sans-serif; + font-size: 10pt; +} + +th { + background-color: #525252; + color: #E0E0E0; +} + +table, tr, td { + background-color: #F0F0F0; +} + +a, a:visited { + text-decoration: none; + font-weight: bold; +} + +#paths { + width: 90%; + text-align: left; +} + +.file_directory { + color: #c0c0c0; +} +.path_directory { + color: #3c3c3c; +} +.file_file { + color: #3c3c3c; +} +.path_file { + color: #c0c0c0; +} + +.parentdir { + color: #000000; + font-size: 10pt; +} +.name { + text-align: left; +} +.size { + text-align: right; +} +.type { + text-align: left; +} +.mtime { + text-align: center; +} + +.path_abs_rel { + color: #3c3c3c; + text-decoration: none; + font-weight: bold; + font-family: sans-serif; + font-size: 10pt; +} + +.path_abs_rel a { + color: #3c3c3c; + font-style: italic; +} diff --git a/pyload/webui/themes/flat/css/window.css b/pyload/webui/themes/flat/css/window.css new file mode 100644 index 000000000..12829868b --- /dev/null +++ b/pyload/webui/themes/flat/css/window.css @@ -0,0 +1,73 @@ +/* ----------- stylized ----------- */ +.window_box h1{ + font-size:14px; + font-weight:bold; + margin-bottom:8px; +} +.window_box p{ + font-size:11px; + color:#666666; + margin-bottom:20px; + border-bottom:solid 1px #b7ddf2; + padding-bottom:10px; +} +.window_box label{ + display:block; + font-weight:bold; + text-align:right; + width:240px; + float:left; +} +.window_box .small{ + color:#666666; + display:block; + font-size:11px; + font-weight:normal; + text-align:right; + width:240px; +} +.window_box select, .window_box input{ + float:left; + font-size:12px; + padding:4px 2px; + border:solid 1px #aacfe4; + width:300px; + margin:2px 0 20px 10px; +} +.window_box .cont{ + float:left; + font-size:12px; + padding: 0px 10px 15px 0px; + width:300px; + margin:0px 0px 0px 10px; +} +.window_box .cont input{ + float: none; + margin: 0px 15px 0px 1px; +} +.window_box textarea{ + float:left; + font-size:12px; + padding:4px 2px; + border:solid 1px #aacfe4; + width:300px; + margin:2px 0 20px 10px; +} +.window_box button, .styled_button{ + clear:both; + margin-left:150px; + width:125px; + height:31px; + background:#666666 url(../img/button.png) no-repeat; + text-align:center; + line-height:31px; + color:#FFFFFF; + font-size:11px; + font-weight:bold; + border: 0px; +} + +.styled_button { + margin-left: 15px; + cursor: pointer; +} diff --git a/pyload/webui/themes/flat/img/MooDialog/dialog-close.png b/pyload/webui/themes/flat/img/MooDialog/dialog-close.png new file mode 100644 index 000000000..81ebb88b2 Binary files /dev/null and b/pyload/webui/themes/flat/img/MooDialog/dialog-close.png differ diff --git a/pyload/webui/themes/flat/img/MooDialog/dialog-error.png b/pyload/webui/themes/flat/img/MooDialog/dialog-error.png new file mode 100644 index 000000000..d70328403 Binary files /dev/null and b/pyload/webui/themes/flat/img/MooDialog/dialog-error.png differ diff --git a/pyload/webui/themes/flat/img/MooDialog/dialog-question.png b/pyload/webui/themes/flat/img/MooDialog/dialog-question.png new file mode 100644 index 000000000..b0af3db5b Binary files /dev/null and b/pyload/webui/themes/flat/img/MooDialog/dialog-question.png differ diff --git a/pyload/webui/themes/flat/img/MooDialog/dialog-warning.png b/pyload/webui/themes/flat/img/MooDialog/dialog-warning.png new file mode 100644 index 000000000..aad64d4be Binary files /dev/null and b/pyload/webui/themes/flat/img/MooDialog/dialog-warning.png differ diff --git a/pyload/webui/themes/flat/img/arrow_refresh.png b/pyload/webui/themes/flat/img/arrow_refresh.png new file mode 100644 index 000000000..b1b6fa4dc Binary files /dev/null and b/pyload/webui/themes/flat/img/arrow_refresh.png differ diff --git a/pyload/webui/themes/flat/img/arrow_right.png b/pyload/webui/themes/flat/img/arrow_right.png new file mode 100644 index 000000000..68f379fc7 Binary files /dev/null and b/pyload/webui/themes/flat/img/arrow_right.png differ diff --git a/pyload/webui/themes/flat/img/button.png b/pyload/webui/themes/flat/img/button.png new file mode 100644 index 000000000..bb408a7d6 Binary files /dev/null and b/pyload/webui/themes/flat/img/button.png differ diff --git a/pyload/webui/themes/flat/img/cog.png b/pyload/webui/themes/flat/img/cog.png new file mode 100644 index 000000000..833f779ac Binary files /dev/null and b/pyload/webui/themes/flat/img/cog.png differ diff --git a/pyload/webui/themes/flat/img/control_add.png b/pyload/webui/themes/flat/img/control_add.png new file mode 100644 index 000000000..e3f29fab2 Binary files /dev/null and b/pyload/webui/themes/flat/img/control_add.png differ diff --git a/pyload/webui/themes/flat/img/control_add_blue.png b/pyload/webui/themes/flat/img/control_add_blue.png new file mode 100644 index 000000000..e3f29fab2 Binary files /dev/null and b/pyload/webui/themes/flat/img/control_add_blue.png differ diff --git a/pyload/webui/themes/flat/img/control_cancel.png b/pyload/webui/themes/flat/img/control_cancel.png new file mode 100644 index 000000000..07c9cad30 Binary files /dev/null and b/pyload/webui/themes/flat/img/control_cancel.png differ diff --git a/pyload/webui/themes/flat/img/control_cancel_blue.png b/pyload/webui/themes/flat/img/control_cancel_blue.png new file mode 100644 index 000000000..07c9cad30 Binary files /dev/null and b/pyload/webui/themes/flat/img/control_cancel_blue.png differ diff --git a/pyload/webui/themes/flat/img/control_pause.png b/pyload/webui/themes/flat/img/control_pause.png new file mode 100644 index 000000000..24e3705fa Binary files /dev/null and b/pyload/webui/themes/flat/img/control_pause.png differ diff --git a/pyload/webui/themes/flat/img/control_pause_blue.png b/pyload/webui/themes/flat/img/control_pause_blue.png new file mode 100644 index 000000000..24e3705fa Binary files /dev/null and b/pyload/webui/themes/flat/img/control_pause_blue.png differ diff --git a/pyload/webui/themes/flat/img/control_play.png b/pyload/webui/themes/flat/img/control_play.png new file mode 100644 index 000000000..15ced1e21 Binary files /dev/null and b/pyload/webui/themes/flat/img/control_play.png differ diff --git a/pyload/webui/themes/flat/img/control_play_blue.png b/pyload/webui/themes/flat/img/control_play_blue.png new file mode 100644 index 000000000..15ced1e21 Binary files /dev/null and b/pyload/webui/themes/flat/img/control_play_blue.png differ diff --git a/pyload/webui/themes/flat/img/control_stop.png b/pyload/webui/themes/flat/img/control_stop.png new file mode 100644 index 000000000..71215ef67 Binary files /dev/null and b/pyload/webui/themes/flat/img/control_stop.png differ diff --git a/pyload/webui/themes/flat/img/control_stop_blue.png b/pyload/webui/themes/flat/img/control_stop_blue.png new file mode 100644 index 000000000..71215ef67 Binary files /dev/null and b/pyload/webui/themes/flat/img/control_stop_blue.png differ diff --git a/pyload/webui/themes/flat/img/default/add_folder.png b/pyload/webui/themes/flat/img/default/add_folder.png new file mode 100644 index 000000000..8acbc411b Binary files /dev/null and b/pyload/webui/themes/flat/img/default/add_folder.png differ diff --git a/pyload/webui/themes/flat/img/default/ajax-loader.gif b/pyload/webui/themes/flat/img/default/ajax-loader.gif new file mode 100644 index 000000000..2fd8e0737 Binary files /dev/null and b/pyload/webui/themes/flat/img/default/ajax-loader.gif differ diff --git a/pyload/webui/themes/flat/img/default/big_button.gif b/pyload/webui/themes/flat/img/default/big_button.gif new file mode 100644 index 000000000..7680490ea Binary files /dev/null and b/pyload/webui/themes/flat/img/default/big_button.gif differ diff --git a/pyload/webui/themes/flat/img/default/big_button_over.gif b/pyload/webui/themes/flat/img/default/big_button_over.gif new file mode 100644 index 000000000..2e3ee10d2 Binary files /dev/null and b/pyload/webui/themes/flat/img/default/big_button_over.gif differ diff --git a/pyload/webui/themes/flat/img/default/body.png b/pyload/webui/themes/flat/img/default/body.png new file mode 100644 index 000000000..7ff1043e0 Binary files /dev/null and b/pyload/webui/themes/flat/img/default/body.png differ diff --git a/pyload/webui/themes/flat/img/default/closebtn.gif b/pyload/webui/themes/flat/img/default/closebtn.gif new file mode 100644 index 000000000..3e27e6030 Binary files /dev/null and b/pyload/webui/themes/flat/img/default/closebtn.gif differ diff --git a/pyload/webui/themes/flat/img/default/drag_corner.gif b/pyload/webui/themes/flat/img/default/drag_corner.gif new file mode 100644 index 000000000..befb1adf1 Binary files /dev/null and b/pyload/webui/themes/flat/img/default/drag_corner.gif differ diff --git a/pyload/webui/themes/flat/img/default/full.png b/pyload/webui/themes/flat/img/default/full.png new file mode 100644 index 000000000..fea52af76 Binary files /dev/null and b/pyload/webui/themes/flat/img/default/full.png differ diff --git a/pyload/webui/themes/flat/img/default/head-menu-recent.png b/pyload/webui/themes/flat/img/default/head-menu-recent.png new file mode 100644 index 000000000..fc9b0497f Binary files /dev/null and b/pyload/webui/themes/flat/img/default/head-menu-recent.png differ diff --git a/pyload/webui/themes/flat/img/default/head_bg1.png b/pyload/webui/themes/flat/img/default/head_bg1.png new file mode 100644 index 000000000..f2848c3cc Binary files /dev/null and b/pyload/webui/themes/flat/img/default/head_bg1.png differ diff --git a/pyload/webui/themes/flat/img/default/images.png b/pyload/webui/themes/flat/img/default/images.png new file mode 100644 index 000000000..184860d1e Binary files /dev/null and b/pyload/webui/themes/flat/img/default/images.png differ diff --git a/pyload/webui/themes/flat/img/default/parseUri.png b/pyload/webui/themes/flat/img/default/parseUri.png new file mode 100644 index 000000000..937bded9d Binary files /dev/null and b/pyload/webui/themes/flat/img/default/parseUri.png differ diff --git a/pyload/webui/themes/flat/img/default/pyload-logo.png b/pyload/webui/themes/flat/img/default/pyload-logo.png new file mode 100644 index 000000000..2443cd8b1 Binary files /dev/null and b/pyload/webui/themes/flat/img/default/pyload-logo.png differ diff --git a/pyload/webui/themes/flat/img/default/tab-background.png b/pyload/webui/themes/flat/img/default/tab-background.png new file mode 100644 index 000000000..29a5d1991 Binary files /dev/null and b/pyload/webui/themes/flat/img/default/tab-background.png differ diff --git a/pyload/webui/themes/flat/img/default/tabs-border-bottom.png b/pyload/webui/themes/flat/img/default/tabs-border-bottom.png new file mode 100644 index 000000000..02440f428 Binary files /dev/null and b/pyload/webui/themes/flat/img/default/tabs-border-bottom.png differ diff --git a/pyload/webui/themes/flat/img/delete.png b/pyload/webui/themes/flat/img/delete.png new file mode 100644 index 000000000..4539cff12 Binary files /dev/null and b/pyload/webui/themes/flat/img/delete.png differ diff --git a/pyload/webui/themes/flat/img/error.png b/pyload/webui/themes/flat/img/error.png new file mode 100644 index 000000000..6c565c99c Binary files /dev/null and b/pyload/webui/themes/flat/img/error.png differ diff --git a/pyload/webui/themes/flat/img/folder.png b/pyload/webui/themes/flat/img/folder.png new file mode 100644 index 000000000..0b067dd3c Binary files /dev/null and b/pyload/webui/themes/flat/img/folder.png differ diff --git a/pyload/webui/themes/flat/img/head-login.png b/pyload/webui/themes/flat/img/head-login.png new file mode 100644 index 000000000..6b57515bc Binary files /dev/null and b/pyload/webui/themes/flat/img/head-login.png differ diff --git a/pyload/webui/themes/flat/img/head-menu-collector.png b/pyload/webui/themes/flat/img/head-menu-collector.png new file mode 100644 index 000000000..bbcbe6406 Binary files /dev/null and b/pyload/webui/themes/flat/img/head-menu-collector.png differ diff --git a/pyload/webui/themes/flat/img/head-menu-config.png b/pyload/webui/themes/flat/img/head-menu-config.png new file mode 100644 index 000000000..93e8f83ac Binary files /dev/null and b/pyload/webui/themes/flat/img/head-menu-config.png differ diff --git a/pyload/webui/themes/flat/img/head-menu-development.png b/pyload/webui/themes/flat/img/head-menu-development.png new file mode 100644 index 000000000..33d8b062f Binary files /dev/null and b/pyload/webui/themes/flat/img/head-menu-development.png differ diff --git a/pyload/webui/themes/flat/img/head-menu-download.png b/pyload/webui/themes/flat/img/head-menu-download.png new file mode 100644 index 000000000..3691deebc Binary files /dev/null and b/pyload/webui/themes/flat/img/head-menu-download.png differ diff --git a/pyload/webui/themes/flat/img/head-menu-home.png b/pyload/webui/themes/flat/img/head-menu-home.png new file mode 100644 index 000000000..b77bef5eb Binary files /dev/null and b/pyload/webui/themes/flat/img/head-menu-home.png differ diff --git a/pyload/webui/themes/flat/img/head-menu-index.png b/pyload/webui/themes/flat/img/head-menu-index.png new file mode 100644 index 000000000..8bc6e9604 Binary files /dev/null and b/pyload/webui/themes/flat/img/head-menu-index.png differ diff --git a/pyload/webui/themes/flat/img/head-menu-news.png b/pyload/webui/themes/flat/img/head-menu-news.png new file mode 100644 index 000000000..44e79a9a9 Binary files /dev/null and b/pyload/webui/themes/flat/img/head-menu-news.png differ diff --git a/pyload/webui/themes/flat/img/head-menu-queue.png b/pyload/webui/themes/flat/img/head-menu-queue.png new file mode 100644 index 000000000..e4fa41ad8 Binary files /dev/null and b/pyload/webui/themes/flat/img/head-menu-queue.png differ diff --git a/pyload/webui/themes/flat/img/head-menu-wiki.png b/pyload/webui/themes/flat/img/head-menu-wiki.png new file mode 100644 index 000000000..61b0e54ea Binary files /dev/null and b/pyload/webui/themes/flat/img/head-menu-wiki.png differ diff --git a/pyload/webui/themes/flat/img/head-search-noshadow.png b/pyload/webui/themes/flat/img/head-search-noshadow.png new file mode 100644 index 000000000..16d39bd06 Binary files /dev/null and b/pyload/webui/themes/flat/img/head-search-noshadow.png differ diff --git a/pyload/webui/themes/flat/img/notice.png b/pyload/webui/themes/flat/img/notice.png new file mode 100644 index 000000000..a52b067cb Binary files /dev/null and b/pyload/webui/themes/flat/img/notice.png differ diff --git a/pyload/webui/themes/flat/img/package_go.png b/pyload/webui/themes/flat/img/package_go.png new file mode 100644 index 000000000..80b2c42ee Binary files /dev/null and b/pyload/webui/themes/flat/img/package_go.png differ diff --git a/pyload/webui/themes/flat/img/page-tools-backlinks.png b/pyload/webui/themes/flat/img/page-tools-backlinks.png new file mode 100644 index 000000000..fb8f55b38 Binary files /dev/null and b/pyload/webui/themes/flat/img/page-tools-backlinks.png differ diff --git a/pyload/webui/themes/flat/img/page-tools-edit.png b/pyload/webui/themes/flat/img/page-tools-edit.png new file mode 100644 index 000000000..67177cf89 Binary files /dev/null and b/pyload/webui/themes/flat/img/page-tools-edit.png differ diff --git a/pyload/webui/themes/flat/img/page-tools-revisions.png b/pyload/webui/themes/flat/img/page-tools-revisions.png new file mode 100644 index 000000000..088fe0087 Binary files /dev/null and b/pyload/webui/themes/flat/img/page-tools-revisions.png differ diff --git a/pyload/webui/themes/flat/img/pencil.png b/pyload/webui/themes/flat/img/pencil.png new file mode 100644 index 000000000..e39c93cd8 Binary files /dev/null and b/pyload/webui/themes/flat/img/pencil.png differ diff --git a/pyload/webui/themes/flat/img/reconnect.png b/pyload/webui/themes/flat/img/reconnect.png new file mode 100644 index 000000000..cd35c9325 Binary files /dev/null and b/pyload/webui/themes/flat/img/reconnect.png differ diff --git a/pyload/webui/themes/flat/img/status_None.png b/pyload/webui/themes/flat/img/status_None.png new file mode 100644 index 000000000..1400d3eb3 Binary files /dev/null and b/pyload/webui/themes/flat/img/status_None.png differ diff --git a/pyload/webui/themes/flat/img/status_downloading.png b/pyload/webui/themes/flat/img/status_downloading.png new file mode 100644 index 000000000..db8ad8cd6 Binary files /dev/null and b/pyload/webui/themes/flat/img/status_downloading.png differ diff --git a/pyload/webui/themes/flat/img/status_failed.png b/pyload/webui/themes/flat/img/status_failed.png new file mode 100644 index 000000000..6c565c99c Binary files /dev/null and b/pyload/webui/themes/flat/img/status_failed.png differ diff --git a/pyload/webui/themes/flat/img/status_finished.png b/pyload/webui/themes/flat/img/status_finished.png new file mode 100644 index 000000000..2c4aca40d Binary files /dev/null and b/pyload/webui/themes/flat/img/status_finished.png differ diff --git a/pyload/webui/themes/flat/img/status_offline.png b/pyload/webui/themes/flat/img/status_offline.png new file mode 100644 index 000000000..6c565c99c Binary files /dev/null and b/pyload/webui/themes/flat/img/status_offline.png differ diff --git a/pyload/webui/themes/flat/img/status_proc.png b/pyload/webui/themes/flat/img/status_proc.png new file mode 100644 index 000000000..833f779ac Binary files /dev/null and b/pyload/webui/themes/flat/img/status_proc.png differ diff --git a/pyload/webui/themes/flat/img/status_queue.png b/pyload/webui/themes/flat/img/status_queue.png new file mode 100644 index 000000000..1400d3eb3 Binary files /dev/null and b/pyload/webui/themes/flat/img/status_queue.png differ diff --git a/pyload/webui/themes/flat/img/status_waiting.png b/pyload/webui/themes/flat/img/status_waiting.png new file mode 100644 index 000000000..fd038175e Binary files /dev/null and b/pyload/webui/themes/flat/img/status_waiting.png differ diff --git a/pyload/webui/themes/flat/img/success.png b/pyload/webui/themes/flat/img/success.png new file mode 100644 index 000000000..2c4aca40d Binary files /dev/null and b/pyload/webui/themes/flat/img/success.png differ diff --git a/pyload/webui/themes/flat/img/user-actions-logout.png b/pyload/webui/themes/flat/img/user-actions-logout.png new file mode 100644 index 000000000..d4ef360e8 Binary files /dev/null and b/pyload/webui/themes/flat/img/user-actions-logout.png differ diff --git a/pyload/webui/themes/flat/img/user-actions-profile.png b/pyload/webui/themes/flat/img/user-actions-profile.png new file mode 100644 index 000000000..9ec410b13 Binary files /dev/null and b/pyload/webui/themes/flat/img/user-actions-profile.png differ diff --git a/pyload/webui/themes/flat/img/user-info.png b/pyload/webui/themes/flat/img/user-info.png new file mode 100644 index 000000000..345ed52e4 Binary files /dev/null and b/pyload/webui/themes/flat/img/user-info.png differ diff --git a/pyload/webui/themes/flat/js/render/admin.coffee b/pyload/webui/themes/flat/js/render/admin.coffee new file mode 100644 index 000000000..5afbcbb66 --- /dev/null +++ b/pyload/webui/themes/flat/js/render/admin.coffee @@ -0,0 +1,58 @@ +root = this + +window.addEvent "domready", -> + + root.passwordDialog = new MooDialog {destroyOnHide: false} + root.passwordDialog.setContent $ 'password_box' + + $("login_password_reset").addEvent "click", (e) -> root.passwordDialog.close() + $("login_password_button").addEvent "click", (e) -> + + newpw = $("login_new_password").get("value") + newpw2 = $("login_new_password2").get("value") + + if newpw is newpw2 + form = $("password_form") + form.set "send", { + onSuccess: (data) -> + root.notify.alert "Success", { + 'className': 'success' + } + onFailure: (data) -> + root.notify.alert "Error", { + 'className': 'error' + } + } + + form.send() + + root.passwordDialog.close() + else + alert '{{_("Passwords did not match.")}}' + + e.stop() + + for item in $$(".change_password") + id = item.get("id") + user = id.split("|")[1] + $("user_login").set("value", user) + item.addEvent "click", (e) -> root.passwordDialog.open() + + $('quit-pyload').addEvent "click", (e) -> + new MooDialog.Confirm "{{_('You are really sure you want to quit pyLoad?')}}", -> + new Request.JSON({ + url: '/api/kill' + method: 'get' + }).send() + , -> + e.stop() + + $('restart-pyload').addEvent "click", (e) -> + new MooDialog.Confirm "{{_('Are you sure you want to restart pyLoad?')}}", -> + new Request.JSON({ + url: '/api/restart' + method: 'get' + onSuccess: (data) -> alert "{{_('pyLoad restarted')}}" + }).send() + , -> + e.stop() diff --git a/pyload/webui/themes/flat/js/render/admin.min.js b/pyload/webui/themes/flat/js/render/admin.min.js new file mode 100644 index 000000000..94a5e494d --- /dev/null +++ b/pyload/webui/themes/flat/js/render/admin.min.js @@ -0,0 +1,3 @@ +{% autoescape true %} +var root;root=this;window.addEvent("domready",function(){var f,c,b,e,a,d;root.passwordDialog=new MooDialog({destroyOnHide:false});root.passwordDialog.setContent($("password_box"));$("login_password_reset").addEvent("click",function(g){return root.passwordDialog.close()});$("login_password_button").addEvent("click",function(j){var h,i,g;i=$("login_new_password").get("value");g=$("login_new_password2").get("value");if(i===g){h=$("password_form");h.set("send",{onSuccess:function(k){return root.notify.alert("Success",{className:"success"})},onFailure:function(k){return root.notify.alert("Error",{className:"error"})}});h.send();root.passwordDialog.close()}else{alert('{{_("Passwords did not match.")}}')}return j.stop()});d=$$(".change_password");for(e=0,a=d.length;e + filesizename = new Array("B", "KiB", "MiB", "GiB", "TiB", "PiB") + loga = Math.log(size) / Math.log(1024) + i = Math.floor(loga) + a = Math.pow(1024, i) + if size is 0 then "0 B" else (Math.round(size * 100 / a) / 100 + " " + filesizename[i]) + + +parseUri = () -> + oldString = $("add_links").value + regxp = new RegExp('(ht|f)tp(s?):\/\/[a-zA-Z0-9\-\.\/\?=_&%#]+[<| |\"|\'|\r|\n|\t]{1}', 'g') + resu = oldString.match regxp + return if resu == null + res = "" + + for part in resu + if part.indexOf(" ") != -1 + res = res + part.replace(" ", " \n") + else if part.indexOf("\t") != -1 + res = res + part.replace("\t", " \n") + else if part.indexOf("\r") != -1 + res = res + part.replace("\r", " \n") + else if part.indexOf("\"") != -1 + res = res + part.replace("\"", " \n") + else if part.indexOf("<") != -1 + res = res + part.replace("<", " \n") + else if part.indexOf("'") != -1 + res = res + part.replace("'", " \n") + else + res = res + part.replace("\n", " \n") + + $("add_links").value = res + + +Array::remove = (from, to) -> + rest = this.slice((to || from) + 1 || this.length) + this.length = from < 0 ? this.length + from : from + return [] if this.length == 0 + return this.push.apply(this, rest) + + +document.addEvent "domready", -> + + # global notification + root.notify = new Purr { + 'mode': 'top' + 'position': 'center' + } + + root.captchaBox = new MooDialog {destroyOnHide: false} + root.captchaBox.setContent $ 'cap_box' + + root.addBox = new MooDialog {destroyOnHide: false} + root.addBox.setContent $ 'add_box' + + $('add_form').onsubmit = -> + $('add_form').target = 'upload_target' + if $('add_name').value is "" and $('add_file').value is "" + alert '{{_("Please Enter a packagename.")}}' + return false + else + root.addBox.close() + return true + + $('add_reset').addEvent 'click', -> root.addBox.close() + + $('action_add').addEvent 'click', -> $("add_form").reset(); root.addBox.open() + $('action_play').addEvent 'click', -> new Request({method: 'get', url: '/api/unpauseServer'}).send() + $('action_cancel').addEvent 'click', -> new Request({method: 'get', url: '/api/stopAllDownloads'}).send() + $('action_stop').addEvent 'click', -> new Request({method: 'get', url: '/api/pauseServer'}).send() + + + # captcha events + + $('cap_info').addEvent 'click', -> + load_captcha "get", "" + root.captchaBox.open() + $('cap_reset').addEvent 'click', -> root.captchaBox.close() + $('cap_form').addEvent 'submit', (e) -> + submit_captcha() + e.stop() + + $('cap_positional').addEvent 'click', on_captcha_click + + new Request.JSON({ + url: "/json/status" + onSuccess: LoadJsonToContent + secure: false + async: true + initialDelay: 0 + delay: 4000 + limit: 3000 + }).startTimer() + + +LoadJsonToContent = (data) -> + $("speed").set 'text', humanFileSize(data.speed)+"/s" + $("aktiv").set 'text', data.active + $("aktiv_from").set 'text', data.queue + $("aktiv_total").set 'text', data.total + + if data.captcha + if $("cap_info").getStyle("display") != "inline" + $("cap_info").setStyle 'display', 'inline' + root.notify.alert '{{_("New Captcha Request")}}', { + 'className': 'notify' + } + else + $("cap_info").setStyle 'display', 'none' + + + if data.download + $("time").set 'text', ' {{_("on")}}' + $("time").setStyle 'background-color', "#8ffc25" + else + $("time").set 'text', ' {{_("off")}}' + $("time").setStyle 'background-color', "#fc6e26" + + if data.reconnect + $("reconnect").set 'text', ' {{_("on")}}' + $("reconnect").setStyle 'background-color', "#8ffc25" + else + $("reconnect").set 'text', ' {{_("off")}}' + $("reconnect").setStyle 'background-color', "#fc6e26" + + return null + + +set_captcha = (data) -> + $('cap_id').set 'value', data.id + if (data.result_type is 'textual') + $('cap_textual_img').set 'src', data.src + $('cap_title').set 'text', '{{_("Please read the text on the captcha.")}}' + $('cap_submit').setStyle 'display', 'inline' + $('cap_textual').setStyle 'display', 'block' + $('cap_positional').setStyle 'display', 'none' + + else if (data.result_type == 'positional') + $('cap_positional_img').set('src', data.src) + $('cap_title').set('text', '{{_("Please click on the right captcha position.")}}') + $('cap_submit').setStyle('display', 'none') + $('cap_textual').setStyle('display', 'none') + + +load_captcha = (method, post) -> + new Request.JSON({ + url: "/json/set_captcha" + onSuccess: (data) -> set_captcha(data) if data.captcha else clear_captcha() + secure: false + async: true + method: method + }).send(post) + + +clear_captcha = -> + $('cap_textual').setStyle 'display', 'none' + $('cap_textual_img').set 'src', '' + $('cap_positional').setStyle 'display', 'none' + $('cap_positional_img').set 'src', '' + $('cap_title').set 'text', '{{_("No Captchas to read.")}}' + + +submit_captcha = -> + load_captcha("post", "cap_id=" + $('cap_id').get('value') + "&cap_result=" + $('cap_result').get('value') ) + $('cap_result').set('value', '') + + +on_captcha_click = (e) -> + position = e.target.getPosition() + x = e.page.x - position.x + y = e.page.y - position.y + $('cap_result').value = x + "," + y + submit_captcha() diff --git a/pyload/webui/themes/flat/js/render/base.min.js b/pyload/webui/themes/flat/js/render/base.min.js new file mode 100644 index 000000000..1ba1d73f9 --- /dev/null +++ b/pyload/webui/themes/flat/js/render/base.min.js @@ -0,0 +1,3 @@ +{% autoescape true %} +var LoadJsonToContent,clear_captcha,humanFileSize,load_captcha,on_captcha_click,parseUri,root,set_captcha,submit_captcha;root=this;humanFileSize=function(f){var c,d,e,b;d=new Array("B","KiB","MiB","GiB","TiB","PiB");b=Math.log(f)/Math.log(1024);e=Math.floor(b);c=Math.pow(1024,e);if(f===0){return"0 B"}else{return Math.round(f*100/c)/100+" "+d[e]}};parseUri=function(){var b,c,g,e,d,f,a;b=$("add_links").value;g=new RegExp("(ht|f)tp(s?)://[a-zA-Z0-9-./?=_&%#]+[<| |\"|'|\r|\n|\t]{1}","g");d=b.match(g);if(d===null){return}e="";for(f=0,a=d.length;f 0) { + window.location.reload() + } else { + this.packages.each(function(pack) { + pack.close(); + }); + indicateSuccess(); + } + }.bind(this), + onFailure: indicateFail + }).send(); + }, + + restartFailed: function() { + indicateLoad(); + new Request.JSON({ + method: 'get', + url: '/api/restartFailed', + onSuccess: function(data) { + this.packages.each(function(pack) { + pack.close(); + }); + indicateSuccess(); + }.bind(this), + onFailure: indicateFail + }).send(); + }, + + startSort: function(ele, copy) { + }, + + saveSort: function(ele, copy) { + var order = []; + this.sorts.serialize(function(li, pos) { + if (li == ele && ele.retrieve("order") != pos) { + order.push(ele.retrieve("pid") + "|" + pos) + } + li.store("order", pos) + }); + if (order.length > 0) { + indicateLoad(); + new Request.JSON({ + method: 'get', + url: '/json/package_order/' + order[0], + onSuccess: indicateFinish, + onFailure: indicateFail + }).send(); + } + } + +}); + +var Package = new Class({ + initialize: function(ui, id, ele, data) { + this.ui = ui; + this.id = id; + this.linksLoaded = false; + + if (!ele) { + this.createElement(data); + } else { + this.ele = ele; + this.order = ele.getElements("div.order")[0].get("html"); + this.ele.store("order", this.order); + this.ele.store("pid", this.id); + this.parseElement(); + } + + var pname = this.ele.getElements(".packagename")[0]; + this.buttons = new Fx.Tween(this.ele.getElements(".buttons")[0], {link: "cancel"}); + this.buttons.set("opacity", 0); + + pname.addEvent("mouseenter", function(e) { + this.buttons.start("opacity", 1) + }.bind(this)); + + pname.addEvent("mouseleave", function(e) { + this.buttons.start("opacity", 0) + }.bind(this)); + + + }, + + createElement: function() { + alert("create") + }, + + parseElement: function() { + var imgs = this.ele.getElements('img'); + + this.name = this.ele.getElements('.name')[0]; + this.folder = this.ele.getElements('.folder')[0]; + this.password = this.ele.getElements('.password')[0]; + + imgs[1].addEvent('click', this.deletePackage.bind(this)); + imgs[2].addEvent('click', this.restartPackage.bind(this)); + imgs[3].addEvent('click', this.editPackage.bind(this)); + imgs[4].addEvent('click', this.movePackage.bind(this)); + + this.ele.getElement('.packagename').addEvent('click', this.toggle.bind(this)); + + }, + + loadLinks: function() { + indicateLoad(); + new Request.JSON({ + method: 'get', + url: '/json/package/' + this.id, + onSuccess: this.createLinks.bind(this), + onFailure: indicateFail + }).send(); + }, + + createLinks: function(data) { + var ul = $("sort_children_{id}".substitute({'id': this.id})); + ul.set("html", ""); + data.links.each(function(link) { + link.id = link.fid; + var li = new Element("li", { + 'style': { + 'margin-left': 0 + } + }); + + var html = "\n".substitute({'icon': link.icon}); + html += "{name}
            ".substitute({'url': link.url, 'name': link.name}); + html += "{statusmsg}{error} ".substitute({'statusmsg': link.statusmsg, 'error':link.error}); + html += "{format_size}".substitute({'format_size': link.format_size}); + html += "{plugin}  ".substitute({'plugin': link.plugin}); + html += "  "; + html += "
            "; + + var div = new Element("div", { + 'id': "file_" + link.id, + 'class': "child", + 'html': html + }); + + li.store("order", link.order); + li.store("lid", link.id); + + li.adopt(div); + ul.adopt(li); + }); + this.sorts = new Sortables(ul, { + constrain: false, + clone: true, + revert: true, + opacity: 0.4, + handle: ".sorthandle", + onComplete: this.saveSort.bind(this) + }); + this.registerLinkEvents(); + this.linksLoaded = true; + indicateFinish(); + this.toggle(); + }, + + registerLinkEvents: function() { + this.ele.getElements('.child').each(function(child) { + var lid = child.get('id').match(/[0-9]+/); + var imgs = child.getElements('.child_secrow img'); + imgs[0].addEvent('click', function(e) { + new Request({ + method: 'get', + url: '/api/deleteFiles/[' + this + "]", + onSuccess: function() { + $('file_' + this).nix() + }.bind(this), + onFailure: indicateFail + }).send(); + }.bind(lid)); + + imgs[1].addEvent('click', function(e) { + new Request({ + method: 'get', + url: '/api/restartFile/' + this, + onSuccess: function() { + var ele = $('file_' + this); + var imgs = ele.getElements("img"); + imgs[0].set("src", "../img/status_queue.png"); + var spans = ele.getElements(".child_status"); + spans[1].set("html", "queued"); + indicateSuccess(); + }.bind(this), + onFailure: indicateFail + }).send(); + }.bind(lid)); + }); + }, + + toggle: function() { + var child = this.ele.getElement('.children'); + if (child.getStyle('display') == "block") { + child.dissolve(); + } else { + if (!this.linksLoaded) { + this.loadLinks(); + } else { + child.reveal(); + } + } + }, + + + deletePackage: function(event) { + indicateLoad(); + new Request({ + method: 'get', + url: '/api/deletePackages/[' + this.id + "]", + onSuccess: function() { + this.ele.nix(); + indicateFinish(); + }.bind(this), + onFailure: indicateFail + }).send(); + //hide_pack(); + event.stop(); + }, + + restartPackage: function(event) { + indicateLoad(); + new Request({ + method: 'get', + url: '/api/restartPackage/' + this.id, + onSuccess: function() { + this.close(); + indicateSuccess(); + }.bind(this), + onFailure: indicateFail + }).send(); + event.stop(); + }, + + close: function() { + var child = this.ele.getElement('.children'); + if (child.getStyle('display') == "block") { + child.dissolve(); + } + var ul = $("sort_children_{id}".substitute({'id': this.id})); + ul.erase("html"); + this.linksLoaded = false; + }, + + movePackage: function(event) { + indicateLoad(); + new Request({ + method: 'get', + url: '/json/move_package/' + ((this.ui.type + 1) % 2) + "/" + this.id, + onSuccess: function() { + this.ele.nix(); + indicateFinish(); + }.bind(this), + onFailure: indicateFail + }).send(); + event.stop(); + }, + + editPackage: function(event) { + $("pack_form").removeEvents("submit"); + $("pack_form").addEvent("submit", this.savePackage.bind(this)); + + $("pack_id").set("value", this.id); + $("pack_name").set("value", this.name.get("text")); + $("pack_folder").set("value", this.folder.get("text")); + $("pack_pws").set("value", this.password.get("text")); + + root.packageBox.open(); + event.stop(); + }, + + savePackage: function(event) { + $("pack_form").send(); + this.name.set("text", $("pack_name").get("value")); + this.folder.set("text", $("pack_folder").get("value")); + this.password.set("text", $("pack_pws").get("value")); + root.packageBox.close(); + event.stop(); + }, + + saveSort: function(ele, copy) { + var order = []; + this.sorts.serialize(function(li, pos) { + if (li == ele && ele.retrieve("order") != pos) { + order.push(ele.retrieve("lid") + "|" + pos) + } + li.store("order", pos) + }); + if (order.length > 0) { + indicateLoad(); + new Request.JSON({ + method: 'get', + url: '/json/link_order/' + order[0], + onSuccess: indicateFinish, + onFailure: indicateFail + }).send(); + } + } + +}); diff --git a/pyload/webui/themes/flat/js/render/settings.coffee b/pyload/webui/themes/flat/js/render/settings.coffee new file mode 100644 index 000000000..d522741b9 --- /dev/null +++ b/pyload/webui/themes/flat/js/render/settings.coffee @@ -0,0 +1,107 @@ +root = this + +window.addEvent 'domready', -> + root.accountDialog = new MooDialog {destroyOnHide: false} + root.accountDialog.setContent $ 'account_box' + + new TinyTab $$('#toptabs li a'), $$('#tabs-body > span') + + $$('ul.nav').each (nav) -> + new MooDropMenu nav, { + onOpen: (el) -> el.fade 'in' + onClose: (el) -> el.fade 'out' + onInitialize: (el) -> el.fade('hide').set 'tween', {duration:500} + } + + new SettingsUI() + + +class SettingsUI + constructor: -> + @menu = $$ "#general-menu li" + @menu.append $$ "#plugin-menu li" + + @name = $ "tabsback" + @general = $ "general_form_content" + @plugin = $ "plugin_form_content" + + el.addEvent 'click', @menuClick.bind(this) for el in @menu + + $("general|submit").addEvent "click", @configSubmit.bind(this) + $("plugin|submit").addEvent "click", @configSubmit.bind(this) + + $("account_add").addEvent "click", (e) -> + root.accountDialog.open() + e.stop() + + $("account_reset").addEvent "click", (e) -> + root.accountDialog.close() + + $("account_add_button").addEvent "click", @addAccount.bind(this) + $("account_submit").addEvent "click", @submitAccounts.bind(this) + + + menuClick: (e) -> + [category, section] = e.target.get("id").split("|") + name = e.target.get "text" + + + target = if category is "general" then @general else @plugin + target.dissolve() + + new Request({ + "method" : "get" + "url" : "/json/load_config/#{category}/#{section}" + 'onSuccess': (data) => + target.set "html", data + target.reveal() + this.name.set "text", name + }).send() + + + configSubmit: (e) -> + category = e.target.get("id").split("|")[0] + form = $("#{category}_form") + + form.set "send", { + 'method': "post" + 'url': "/json/save_config/#{category}" + "onSuccess" : -> + root.notify.alert '{{ _("Settings saved.")}}', { + 'className': 'success' + } + 'onFailure': -> + root.notify.alert '{{ _("Error occured.")}}', { + 'className': 'error' + } + } + form.send() + e.stop() + + addAccount: (e) -> + form = $ "add_account_form" + form.set "send", { + 'method': "post" + "onSuccess" : -> window.location.reload() + 'onFailure': -> + root.notify.alert '{{_("Error occured.")}}', { + 'className': 'error' + } + } + + form.send() + e.stop() + + submitAccounts: (e) -> + form = $ "account_form" + form.set "send", { + 'method': "post", + "onSuccess" : -> window.location.reload() + 'onFailure': -> + root.notify.alert('{{ _("Error occured.") }}', { + 'className': 'error' + }) + } + + form.send() + e.stop() diff --git a/pyload/webui/themes/flat/js/render/settings.min.js b/pyload/webui/themes/flat/js/render/settings.min.js new file mode 100644 index 000000000..41d1cb25a --- /dev/null +++ b/pyload/webui/themes/flat/js/render/settings.min.js @@ -0,0 +1,3 @@ +{% autoescape true %} +var SettingsUI,root;var __bind=function(a,b){return function(){return a.apply(b,arguments)}};root=this;window.addEvent("domready",function(){root.accountDialog=new MooDialog({destroyOnHide:false});root.accountDialog.setContent($("account_box"));new TinyTab($$("#toptabs li a"),$$("#tabs-body > span"));$$("ul.nav").each(function(a){return new MooDropMenu(a,{onOpen:function(b){return b.fade("in")},onClose:function(b){return b.fade("out")},onInitialize:function(b){return b.fade("hide").set("tween",{duration:500})}})});return new SettingsUI()});SettingsUI=(function(){function a(){var c,e,b,d;this.menu=$$("#general-menu li");this.menu.append($$("#plugin-menu li"));this.name=$("tabsback");this.general=$("general_form_content");this.plugin=$("plugin_form_content");d=this.menu;for(e=0,b=d.length;e*/// IE 6 scroll + if ((options.scroll && Browser.ie6) || options.forceScroll){ + wrapper.setStyle('position', 'absolute'); + var position = wrapper.getPosition(options.inject); + window.addEvent('scroll', function(){ + var scroll = document.getScroll(); + wrapper.setPosition({ + x: position.x + scroll.x, + y: position.y + scroll.y + }); + }); + } + /**/ + + if (options.useEscKey){ + // Add event for the esc key + document.addEvent('keydown', function(e){ + if (e.key == 'esc') this.close(); + }.bind(this)); + } + + this.addEvent('hide', function(){ + if (options.destroyOnHide) this.destroy(); + }.bind(this)); + + this.fireEvent('initialize', wrapper); + }, + + setContent: function(){ + var content = Array.from(arguments); + if (content.length == 1) content = content[0]; + + this.content.empty(); + + var type = typeOf(content); + if (['string', 'number'].contains(type)) this.content.set('text', content); + else this.content.adopt(content); + + this.fireEvent('contentChange', this.content); + + return this; + }, + + open: function(){ + this.fireEvent('beforeOpen', this.wrapper).fireEvent('open'); + this.opened = true; + return this; + }, + + close: function(){ + this.fireEvent('beforeClose', this.wrapper).fireEvent('close'); + this.opened = false; + return this; + }, + + destroy: function(){ + this.wrapper.destroy(); + }, + + toElement: function(){ + return this.wrapper; + } + +}); + + +Element.implement({ + + MooDialog: function(options){ + this.store('MooDialog', + new MooDialog(options).setContent(this).open() + ); + return this; + } + +}); diff --git a/pyload/webui/themes/flat/js/static/MooDialog.min.js b/pyload/webui/themes/flat/js/static/MooDialog.min.js new file mode 100644 index 000000000..90b3ae100 --- /dev/null +++ b/pyload/webui/themes/flat/js/static/MooDialog.min.js @@ -0,0 +1 @@ +var MooDialog=new Class({Implements:[Options,Events],options:{"class":"MooDialog",title:null,scroll:!0,forceScroll:!1,useEscKey:!0,destroyOnHide:!0,autoOpen:!0,closeButton:!0,onInitialize:function(){this.wrapper.setStyle("display","none")},onBeforeOpen:function(){this.wrapper.setStyle("display","block"),this.fireEvent("show")},onBeforeClose:function(){this.wrapper.setStyle("display","none"),this.fireEvent("hide")}},initialize:function(t){this.setOptions(t),this.options.inject=this.options.inject||document.body,t=this.options;var e=this.wrapper=new Element("div."+t["class"].replace(" ",".")).inject(t.inject);if(this.content=new Element("div.content").inject(e),t.title&&(this.title=new Element("div.title").set("text",t.title).inject(e),e.addClass("MooDialogTitle")),t.closeButton&&(this.closeButton=new Element("a.close",{events:{click:this.close.bind(this)}}).inject(e)),t.scroll&&Browser.ie6||t.forceScroll){e.setStyle("position","absolute");var n=e.getPosition(t.inject);window.addEvent("scroll",function(){var t=document.getScroll();e.setPosition({x:n.x+t.x,y:n.y+t.y})})}t.useEscKey&&document.addEvent("keydown",function(t){"esc"==t.key&&this.close()}.bind(this)),this.addEvent("hide",function(){t.destroyOnHide&&this.destroy()}.bind(this)),this.fireEvent("initialize",e)},setContent:function(){var t=Array.from(arguments);1==t.length&&(t=t[0]),this.content.empty();var e=typeOf(t);return["string","number"].contains(e)?this.content.set("text",t):this.content.adopt(t),this.fireEvent("contentChange",this.content),this},open:function(){return this.fireEvent("beforeOpen",this.wrapper).fireEvent("open"),this.opened=!0,this},close:function(){return this.fireEvent("beforeClose",this.wrapper).fireEvent("close"),this.opened=!1,this},destroy:function(){this.wrapper.destroy()},toElement:function(){return this.wrapper}});Element.implement({MooDialog:function(t){return this.store("MooDialog",new MooDialog(t).setContent(this).open()),this}}); \ No newline at end of file diff --git a/pyload/webui/themes/flat/js/static/MooDropMenu.js b/pyload/webui/themes/flat/js/static/MooDropMenu.js new file mode 100644 index 000000000..ac0fa1874 --- /dev/null +++ b/pyload/webui/themes/flat/js/static/MooDropMenu.js @@ -0,0 +1,86 @@ +/* +--- +description: This provides a simple Drop Down menu with infinit levels + +license: MIT-style + +authors: +- Arian Stolwijk + +requires: + - Core/Class.Extras + - Core/Element.Event + - Core/Selectors + +provides: [MooDropMenu, Element.MooDropMenu] + +... +*/ + +var MooDropMenu = new Class({ + + Implements: [Options, Events], + + options: { + onOpen: function(el){ + el.removeClass('close').addClass('open'); + }, + onClose: function(el){ + el.removeClass('open').addClass('close'); + }, + onInitialize: function(el){ + el.removeClass('open').addClass('close'); + }, + mouseoutDelay: 200, + mouseoverDelay: 0, + listSelector: 'ul', + itemSelector: 'li', + openEvent: 'mouseenter', + closeEvent: 'mouseleave' + }, + + initialize: function(menu, options, level){ + this.setOptions(options); + options = this.options; + + var menu = this.menu = document.id(menu); + + menu.getElements(options.itemSelector + ' > ' + options.listSelector).each(function(el){ + + this.fireEvent('initialize', el); + + var parent = el.getParent(options.itemSelector), + timer; + + parent.addEvent(options.openEvent, function(){ + parent.store('DropDownOpen', true); + + clearTimeout(timer); + if (options.mouseoverDelay) timer = this.fireEvent.delay(options.mouseoverDelay, this, ['open', el]); + else this.fireEvent('open', el); + + }.bind(this)).addEvent(options.closeEvent, function(){ + parent.store('DropDownOpen', false); + + clearTimeout(timer); + timer = (function(){ + if (!parent.retrieve('DropDownOpen')) this.fireEvent('close', el); + }).delay(options.mouseoutDelay, this); + + }.bind(this)); + + }, this); + }, + + toElement: function(){ + return this.menu + } + +}); + +/* So you can do like this $('nav').MooDropMenu(); or even $('nav').MooDropMenu().setStyle('border',1); */ +Element.implement({ + MooDropMenu: function(options){ + return this.store('MooDropMenu', new MooDropMenu(this, options)); + } +}); diff --git a/pyload/webui/themes/flat/js/static/MooDropMenu.min.js b/pyload/webui/themes/flat/js/static/MooDropMenu.min.js new file mode 100644 index 000000000..552ae247a --- /dev/null +++ b/pyload/webui/themes/flat/js/static/MooDropMenu.min.js @@ -0,0 +1 @@ +var MooDropMenu=new Class({Implements:[Options,Events],options:{onOpen:function(e){e.removeClass("close").addClass("open")},onClose:function(e){e.removeClass("open").addClass("close")},onInitialize:function(e){e.removeClass("open").addClass("close")},mouseoutDelay:200,mouseoverDelay:0,listSelector:"ul",itemSelector:"li",openEvent:"mouseenter",closeEvent:"mouseleave"},initialize:function(e,o){this.setOptions(o),o=this.options;var e=this.menu=document.id(e);e.getElements(o.itemSelector+" > "+o.listSelector).each(function(e){this.fireEvent("initialize",e);var n,t=e.getParent(o.itemSelector);t.addEvent(o.openEvent,function(){t.store("DropDownOpen",!0),clearTimeout(n),o.mouseoverDelay?n=this.fireEvent.delay(o.mouseoverDelay,this,["open",e]):this.fireEvent("open",e)}.bind(this)).addEvent(o.closeEvent,function(){t.store("DropDownOpen",!1),clearTimeout(n),n=function(){t.retrieve("DropDownOpen")||this.fireEvent("close",e)}.delay(o.mouseoutDelay,this)}.bind(this))},this)},toElement:function(){return this.menu}});Element.implement({MooDropMenu:function(e){return this.store("MooDropMenu",new MooDropMenu(this,e))}}); \ No newline at end of file diff --git a/pyload/webui/themes/flat/js/static/mootools-core.js b/pyload/webui/themes/flat/js/static/mootools-core.js new file mode 100644 index 000000000..db83850fd --- /dev/null +++ b/pyload/webui/themes/flat/js/static/mootools-core.js @@ -0,0 +1,5977 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/core/8423c12ffd6a6bfcde9ea22554aec795 + +packager build: + - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady + +... +*/ + +/* +--- + +name: Core + +description: The heart of MooTools. + +license: MIT-style license. + +copyright: Copyright (c) 2006-2014 [Valerio Proietti](http://mad4milk.net/). + +authors: The MooTools production team (http://mootools.net/developers/) + +inspiration: + - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php) + - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php) + +provides: [Core, MooTools, Type, typeOf, instanceOf, Native] + +... +*/ + +(function(){ + +this.MooTools = { + version: '1.5.0', + build: '0f7b690afee9349b15909f33016a25d2e4d9f4e3' +}; + +// typeOf, instanceOf + +var typeOf = this.typeOf = function(item){ + if (item == null) return 'null'; + if (item.$family != null) return item.$family(); + + if (item.nodeName){ + if (item.nodeType == 1) return 'element'; + if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace'; + } else if (typeof item.length == 'number'){ + if ('callee' in item) return 'arguments'; + if ('item' in item) return 'collection'; + } + + return typeof item; +}; + +var instanceOf = this.instanceOf = function(item, object){ + if (item == null) return false; + var constructor = item.$constructor || item.constructor; + while (constructor){ + if (constructor === object) return true; + constructor = constructor.parent; + } + /**/ + if (!item.hasOwnProperty) return false; + /**/ + return item instanceof object; +}; + +// Function overloading + +var Function = this.Function; + +var enumerables = true; +for (var i in {toString: 1}) enumerables = null; +if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor']; + +Function.prototype.overloadSetter = function(usePlural){ + var self = this; + return function(a, b){ + if (a == null) return this; + if (usePlural || typeof a != 'string'){ + for (var k in a) self.call(this, k, a[k]); + if (enumerables) for (var i = enumerables.length; i--;){ + k = enumerables[i]; + if (a.hasOwnProperty(k)) self.call(this, k, a[k]); + } + } else { + self.call(this, a, b); + } + return this; + }; +}; + +Function.prototype.overloadGetter = function(usePlural){ + var self = this; + return function(a){ + var args, result; + if (typeof a != 'string') args = a; + else if (arguments.length > 1) args = arguments; + else if (usePlural) args = [a]; + if (args){ + result = {}; + for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]); + } else { + result = self.call(this, a); + } + return result; + }; +}; + +Function.prototype.extend = function(key, value){ + this[key] = value; +}.overloadSetter(); + +Function.prototype.implement = function(key, value){ + this.prototype[key] = value; +}.overloadSetter(); + +// From + +var slice = Array.prototype.slice; + +Function.from = function(item){ + return (typeOf(item) == 'function') ? item : function(){ + return item; + }; +}; + +Array.from = function(item){ + if (item == null) return []; + return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item]; +}; + +Number.from = function(item){ + var number = parseFloat(item); + return isFinite(number) ? number : null; +}; + +String.from = function(item){ + return item + ''; +}; + +// hide, protect + +Function.implement({ + + hide: function(){ + this.$hidden = true; + return this; + }, + + protect: function(){ + this.$protected = true; + return this; + } + +}); + +// Type + +var Type = this.Type = function(name, object){ + if (name){ + var lower = name.toLowerCase(); + var typeCheck = function(item){ + return (typeOf(item) == lower); + }; + + Type['is' + name] = typeCheck; + if (object != null){ + object.prototype.$family = (function(){ + return lower; + }).hide(); + + } + } + + if (object == null) return null; + + object.extend(this); + object.$constructor = Type; + object.prototype.$constructor = object; + + return object; +}; + +var toString = Object.prototype.toString; + +Type.isEnumerable = function(item){ + return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' ); +}; + +var hooks = {}; + +var hooksOf = function(object){ + var type = typeOf(object.prototype); + return hooks[type] || (hooks[type] = []); +}; + +var implement = function(name, method){ + if (method && method.$hidden) return; + + var hooks = hooksOf(this); + + for (var i = 0; i < hooks.length; i++){ + var hook = hooks[i]; + if (typeOf(hook) == 'type') implement.call(hook, name, method); + else hook.call(this, name, method); + } + + var previous = this.prototype[name]; + if (previous == null || !previous.$protected) this.prototype[name] = method; + + if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){ + return method.apply(item, slice.call(arguments, 1)); + }); +}; + +var extend = function(name, method){ + if (method && method.$hidden) return; + var previous = this[name]; + if (previous == null || !previous.$protected) this[name] = method; +}; + +Type.implement({ + + implement: implement.overloadSetter(), + + extend: extend.overloadSetter(), + + alias: function(name, existing){ + implement.call(this, name, this.prototype[existing]); + }.overloadSetter(), + + mirror: function(hook){ + hooksOf(this).push(hook); + return this; + } + +}); + +new Type('Type', Type); + +// Default Types + +var force = function(name, object, methods){ + var isType = (object != Object), + prototype = object.prototype; + + if (isType) object = new Type(name, object); + + for (var i = 0, l = methods.length; i < l; i++){ + var key = methods[i], + generic = object[key], + proto = prototype[key]; + + if (generic) generic.protect(); + if (isType && proto) object.implement(key, proto.protect()); + } + + if (isType){ + var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]); + object.forEachMethod = function(fn){ + if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){ + fn.call(prototype, prototype[methods[i]], methods[i]); + } + for (var key in prototype) fn.call(prototype, prototype[key], key); + }; + } + + return force; +}; + +force('String', String, [ + 'charAt', 'charCodeAt', 'concat', 'contains', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search', + 'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase' +])('Array', Array, [ + 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', + 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight' +])('Number', Number, [ + 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision' +])('Function', Function, [ + 'apply', 'call', 'bind' +])('RegExp', RegExp, [ + 'exec', 'test' +])('Object', Object, [ + 'create', 'defineProperty', 'defineProperties', 'keys', + 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames', + 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen' +])('Date', Date, ['now']); + +Object.extend = extend.overloadSetter(); + +Date.extend('now', function(){ + return +(new Date); +}); + +new Type('Boolean', Boolean); + +// fixes NaN returning as Number + +Number.prototype.$family = function(){ + return isFinite(this) ? 'number' : 'null'; +}.hide(); + +// Number.random + +Number.extend('random', function(min, max){ + return Math.floor(Math.random() * (max - min + 1) + min); +}); + +// forEach, each + +var hasOwnProperty = Object.prototype.hasOwnProperty; +Object.extend('forEach', function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object); + } +}); + +Object.each = Object.forEach; + +Array.implement({ + + /**/ + forEach: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (i in this) fn.call(bind, this[i], i, this); + } + }, + /**/ + + each: function(fn, bind){ + Array.forEach(this, fn, bind); + return this; + } + +}); + +// Array & Object cloning, Object merging and appending + +var cloneOf = function(item){ + switch (typeOf(item)){ + case 'array': return item.clone(); + case 'object': return Object.clone(item); + default: return item; + } +}; + +Array.implement('clone', function(){ + var i = this.length, clone = new Array(i); + while (i--) clone[i] = cloneOf(this[i]); + return clone; +}); + +var mergeOne = function(source, key, current){ + switch (typeOf(current)){ + case 'object': + if (typeOf(source[key]) == 'object') Object.merge(source[key], current); + else source[key] = Object.clone(current); + break; + case 'array': source[key] = current.clone(); break; + default: source[key] = current; + } + return source; +}; + +Object.extend({ + + merge: function(source, k, v){ + if (typeOf(k) == 'string') return mergeOne(source, k, v); + for (var i = 1, l = arguments.length; i < l; i++){ + var object = arguments[i]; + for (var key in object) mergeOne(source, key, object[key]); + } + return source; + }, + + clone: function(object){ + var clone = {}; + for (var key in object) clone[key] = cloneOf(object[key]); + return clone; + }, + + append: function(original){ + for (var i = 1, l = arguments.length; i < l; i++){ + var extended = arguments[i] || {}; + for (var key in extended) original[key] = extended[key]; + } + return original; + } + +}); + +// Object-less types + +['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){ + new Type(name); +}); + +// Unique ID + +var UID = Date.now(); + +String.extend('uniqueID', function(){ + return (UID++).toString(36); +}); + + + +})(); + + +/* +--- + +name: Array + +description: Contains Array Prototypes like each, contains, and erase. + +license: MIT-style license. + +requires: [Type] + +provides: Array + +... +*/ + +Array.implement({ + + /**/ + every: function(fn, bind){ + for (var i = 0, l = this.length >>> 0; i < l; i++){ + if ((i in this) && !fn.call(bind, this[i], i, this)) return false; + } + return true; + }, + + filter: function(fn, bind){ + var results = []; + for (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){ + value = this[i]; + if (fn.call(bind, value, i, this)) results.push(value); + } + return results; + }, + + indexOf: function(item, from){ + var length = this.length >>> 0; + for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){ + if (this[i] === item) return i; + } + return -1; + }, + + map: function(fn, bind){ + var length = this.length >>> 0, results = Array(length); + for (var i = 0; i < length; i++){ + if (i in this) results[i] = fn.call(bind, this[i], i, this); + } + return results; + }, + + some: function(fn, bind){ + for (var i = 0, l = this.length >>> 0; i < l; i++){ + if ((i in this) && fn.call(bind, this[i], i, this)) return true; + } + return false; + }, + /**/ + + clean: function(){ + return this.filter(function(item){ + return item != null; + }); + }, + + invoke: function(methodName){ + var args = Array.slice(arguments, 1); + return this.map(function(item){ + return item[methodName].apply(item, args); + }); + }, + + associate: function(keys){ + var obj = {}, length = Math.min(this.length, keys.length); + for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; + return obj; + }, + + link: function(object){ + var result = {}; + for (var i = 0, l = this.length; i < l; i++){ + for (var key in object){ + if (object[key](this[i])){ + result[key] = this[i]; + delete object[key]; + break; + } + } + } + return result; + }, + + contains: function(item, from){ + return this.indexOf(item, from) != -1; + }, + + append: function(array){ + this.push.apply(this, array); + return this; + }, + + getLast: function(){ + return (this.length) ? this[this.length - 1] : null; + }, + + getRandom: function(){ + return (this.length) ? this[Number.random(0, this.length - 1)] : null; + }, + + include: function(item){ + if (!this.contains(item)) this.push(item); + return this; + }, + + combine: function(array){ + for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); + return this; + }, + + erase: function(item){ + for (var i = this.length; i--;){ + if (this[i] === item) this.splice(i, 1); + } + return this; + }, + + empty: function(){ + this.length = 0; + return this; + }, + + flatten: function(){ + var array = []; + for (var i = 0, l = this.length; i < l; i++){ + var type = typeOf(this[i]); + if (type == 'null') continue; + array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]); + } + return array; + }, + + pick: function(){ + for (var i = 0, l = this.length; i < l; i++){ + if (this[i] != null) return this[i]; + } + return null; + }, + + hexToRgb: function(array){ + if (this.length != 3) return null; + var rgb = this.map(function(value){ + if (value.length == 1) value += value; + return parseInt(value, 16); + }); + return (array) ? rgb : 'rgb(' + rgb + ')'; + }, + + rgbToHex: function(array){ + if (this.length < 3) return null; + if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; + var hex = []; + for (var i = 0; i < 3; i++){ + var bit = (this[i] - 0).toString(16); + hex.push((bit.length == 1) ? '0' + bit : bit); + } + return (array) ? hex : '#' + hex.join(''); + } + +}); + + + + +/* +--- + +name: String + +description: Contains String Prototypes like camelCase, capitalize, test, and toInt. + +license: MIT-style license. + +requires: [Type, Array] + +provides: String + +... +*/ + +String.implement({ + + // + contains: function(string, index){ + return (index ? String(this).slice(index) : String(this)).indexOf(string) > -1; + }, + // + + test: function(regex, params){ + return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this); + }, + + trim: function(){ + return String(this).replace(/^\s+|\s+$/g, ''); + }, + + clean: function(){ + return String(this).replace(/\s+/g, ' ').trim(); + }, + + camelCase: function(){ + return String(this).replace(/-\D/g, function(match){ + return match.charAt(1).toUpperCase(); + }); + }, + + hyphenate: function(){ + return String(this).replace(/[A-Z]/g, function(match){ + return ('-' + match.charAt(0).toLowerCase()); + }); + }, + + capitalize: function(){ + return String(this).replace(/\b[a-z]/g, function(match){ + return match.toUpperCase(); + }); + }, + + escapeRegExp: function(){ + return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + hexToRgb: function(array){ + var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); + return (hex) ? hex.slice(1).hexToRgb(array) : null; + }, + + rgbToHex: function(array){ + var rgb = String(this).match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHex(array) : null; + }, + + substitute: function(object, regexp){ + return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ + if (match.charAt(0) == '\\') return match.slice(1); + return (object[name] != null) ? object[name] : ''; + }); + } + +}); + + + + +/* +--- + +name: Number + +description: Contains Number Prototypes like limit, round, times, and ceil. + +license: MIT-style license. + +requires: Type + +provides: Number + +... +*/ + +Number.implement({ + + limit: function(min, max){ + return Math.min(max, Math.max(min, this)); + }, + + round: function(precision){ + precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0); + return Math.round(this * precision) / precision; + }, + + times: function(fn, bind){ + for (var i = 0; i < this; i++) fn.call(bind, i, this); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + } + +}); + +Number.alias('each', 'times'); + +(function(math){ + var methods = {}; + math.each(function(name){ + if (!Number[name]) methods[name] = function(){ + return Math[name].apply(null, [this].concat(Array.from(arguments))); + }; + }); + Number.implement(methods); +})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); + + +/* +--- + +name: Function + +description: Contains Function Prototypes like create, bind, pass, and delay. + +license: MIT-style license. + +requires: Type + +provides: Function + +... +*/ + +Function.extend({ + + attempt: function(){ + for (var i = 0, l = arguments.length; i < l; i++){ + try { + return arguments[i](); + } catch (e){} + } + return null; + } + +}); + +Function.implement({ + + attempt: function(args, bind){ + try { + return this.apply(bind, Array.from(args)); + } catch (e){} + + return null; + }, + + /**/ + bind: function(that){ + var self = this, + args = arguments.length > 1 ? Array.slice(arguments, 1) : null, + F = function(){}; + + var bound = function(){ + var context = that, length = arguments.length; + if (this instanceof bound){ + F.prototype = self.prototype; + context = new F; + } + var result = (!args && !length) + ? self.call(context) + : self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments); + return context == that ? result : context; + }; + return bound; + }, + /**/ + + pass: function(args, bind){ + var self = this; + if (args != null) args = Array.from(args); + return function(){ + return self.apply(bind, args || arguments); + }; + }, + + delay: function(delay, bind, args){ + return setTimeout(this.pass((args == null ? [] : args), bind), delay); + }, + + periodical: function(periodical, bind, args){ + return setInterval(this.pass((args == null ? [] : args), bind), periodical); + } + +}); + + + + +/* +--- + +name: Object + +description: Object generic methods + +license: MIT-style license. + +requires: Type + +provides: [Object, Hash] + +... +*/ + +(function(){ + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +Object.extend({ + + subset: function(object, keys){ + var results = {}; + for (var i = 0, l = keys.length; i < l; i++){ + var k = keys[i]; + if (k in object) results[k] = object[k]; + } + return results; + }, + + map: function(object, fn, bind){ + var results = {}; + for (var key in object){ + if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object); + } + return results; + }, + + filter: function(object, fn, bind){ + var results = {}; + for (var key in object){ + var value = object[key]; + if (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value; + } + return results; + }, + + every: function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false; + } + return true; + }, + + some: function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true; + } + return false; + }, + + keys: function(object){ + var keys = []; + for (var key in object){ + if (hasOwnProperty.call(object, key)) keys.push(key); + } + return keys; + }, + + values: function(object){ + var values = []; + for (var key in object){ + if (hasOwnProperty.call(object, key)) values.push(object[key]); + } + return values; + }, + + getLength: function(object){ + return Object.keys(object).length; + }, + + keyOf: function(object, value){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && object[key] === value) return key; + } + return null; + }, + + contains: function(object, value){ + return Object.keyOf(object, value) != null; + }, + + toQueryString: function(object, base){ + var queryString = []; + + Object.each(object, function(value, key){ + if (base) key = base + '[' + key + ']'; + var result; + switch (typeOf(value)){ + case 'object': result = Object.toQueryString(value, key); break; + case 'array': + var qs = {}; + value.each(function(val, i){ + qs[i] = val; + }); + result = Object.toQueryString(qs, key); + break; + default: result = key + '=' + encodeURIComponent(value); + } + if (value != null) queryString.push(result); + }); + + return queryString.join('&'); + } + +}); + +})(); + + + + +/* +--- + +name: Browser + +description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash. + +license: MIT-style license. + +requires: [Array, Function, Number, String] + +provides: [Browser, Window, Document] + +... +*/ + +(function(){ + +var document = this.document; +var window = document.window = this; + +var parse = function(ua, platform){ + ua = ua.toLowerCase(); + platform = (platform ? platform.toLowerCase() : ''); + + var UA = ua.match(/(opera|ie|firefox|chrome|trident|crios|version)[\s\/:]([\w\d\.]+)?.*?(safari|(?:rv[\s\/:]|version[\s\/:])([\w\d\.]+)|$)/) || [null, 'unknown', 0]; + + if (UA[1] == 'trident'){ + UA[1] = 'ie'; + if (UA[4]) UA[2] = UA[4]; + } else if (UA[1] == 'crios') { + UA[1] = 'chrome'; + } + + var platform = ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]; + if (platform == 'win') platform = 'windows'; + + return { + extend: Function.prototype.extend, + name: (UA[1] == 'version') ? UA[3] : UA[1], + version: parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]), + platform: platform + }; +}; + +var Browser = this.Browser = parse(navigator.userAgent, navigator.platform); + +if (Browser.ie){ + Browser.version = document.documentMode; +} + +Browser.extend({ + Features: { + xpath: !!(document.evaluate), + air: !!(window.runtime), + query: !!(document.querySelector), + json: !!(window.JSON) + }, + parseUA: parse +}); + + + +// Request + +Browser.Request = (function(){ + + var XMLHTTP = function(){ + return new XMLHttpRequest(); + }; + + var MSXML2 = function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }; + + var MSXML = function(){ + return new ActiveXObject('Microsoft.XMLHTTP'); + }; + + return Function.attempt(function(){ + XMLHTTP(); + return XMLHTTP; + }, function(){ + MSXML2(); + return MSXML2; + }, function(){ + MSXML(); + return MSXML; + }); + +})(); + +Browser.Features.xhr = !!(Browser.Request); + + + +// String scripts + +Browser.exec = function(text){ + if (!text) return text; + if (window.execScript){ + window.execScript(text); + } else { + var script = document.createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.text = text; + document.head.appendChild(script); + document.head.removeChild(script); + } + return text; +}; + +String.implement('stripScripts', function(exec){ + var scripts = ''; + var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(all, code){ + scripts += code + '\n'; + return ''; + }); + if (exec === true) Browser.exec(scripts); + else if (typeOf(exec) == 'function') exec(scripts, text); + return text; +}); + +// Window, Document + +Browser.extend({ + Document: this.Document, + Window: this.Window, + Element: this.Element, + Event: this.Event +}); + +this.Window = this.$constructor = new Type('Window', function(){}); + +this.$family = Function.from('window').hide(); + +Window.mirror(function(name, method){ + window[name] = method; +}); + +this.Document = document.$constructor = new Type('Document', function(){}); + +document.$family = Function.from('document').hide(); + +Document.mirror(function(name, method){ + document[name] = method; +}); + +document.html = document.documentElement; +if (!document.head) document.head = document.getElementsByTagName('head')[0]; + +if (document.execCommand) try { + document.execCommand("BackgroundImageCache", false, true); +} catch (e){} + +/**/ +if (this.attachEvent && !this.addEventListener){ + var unloadEvent = function(){ + this.detachEvent('onunload', unloadEvent); + document.head = document.html = document.window = null; + }; + this.attachEvent('onunload', unloadEvent); +} + +// IE fails on collections and ) +var arrayFrom = Array.from; +try { + arrayFrom(document.html.childNodes); +} catch(e){ + Array.from = function(item){ + if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){ + var i = item.length, array = new Array(i); + while (i--) array[i] = item[i]; + return array; + } + return arrayFrom(item); + }; + + var prototype = Array.prototype, + slice = prototype.slice; + ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){ + var method = prototype[name]; + Array[name] = function(item){ + return method.apply(Array.from(item), slice.call(arguments, 1)); + }; + }); +} +/**/ + + + +})(); + + +/* +--- + +name: Event + +description: Contains the Event Type, to make the event object cross-browser. + +license: MIT-style license. + +requires: [Window, Document, Array, Function, String, Object] + +provides: Event + +... +*/ + +(function() { + +var _keys = {}; + +var DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){ + if (!win) win = window; + event = event || win.event; + if (event.$extended) return event; + this.event = event; + this.$extended = true; + this.shift = event.shiftKey; + this.control = event.ctrlKey; + this.alt = event.altKey; + this.meta = event.metaKey; + var type = this.type = event.type; + var target = event.target || event.srcElement; + while (target && target.nodeType == 3) target = target.parentNode; + this.target = document.id(target); + + if (type.indexOf('key') == 0){ + var code = this.code = (event.which || event.keyCode); + this.key = _keys[code]; + if (type == 'keydown' || type == 'keyup'){ + if (code > 111 && code < 124) this.key = 'f' + (code - 111); + else if (code > 95 && code < 106) this.key = code - 96; + } + if (this.key == null) this.key = String.fromCharCode(code).toLowerCase(); + } else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){ + var doc = win.document; + doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; + this.page = { + x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft, + y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop + }; + this.client = { + x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX, + y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY + }; + if (type == 'DOMMouseScroll' || type == 'mousewheel') + this.wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; + + this.rightClick = (event.which == 3 || event.button == 2); + if (type == 'mouseover' || type == 'mouseout'){ + var related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']; + while (related && related.nodeType == 3) related = related.parentNode; + this.relatedTarget = document.id(related); + } + } else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){ + this.rotation = event.rotation; + this.scale = event.scale; + this.targetTouches = event.targetTouches; + this.changedTouches = event.changedTouches; + var touches = this.touches = event.touches; + if (touches && touches[0]){ + var touch = touches[0]; + this.page = {x: touch.pageX, y: touch.pageY}; + this.client = {x: touch.clientX, y: touch.clientY}; + } + } + + if (!this.client) this.client = {}; + if (!this.page) this.page = {}; +}); + +DOMEvent.implement({ + + stop: function(){ + return this.preventDefault().stopPropagation(); + }, + + stopPropagation: function(){ + if (this.event.stopPropagation) this.event.stopPropagation(); + else this.event.cancelBubble = true; + return this; + }, + + preventDefault: function(){ + if (this.event.preventDefault) this.event.preventDefault(); + else this.event.returnValue = false; + return this; + } + +}); + +DOMEvent.defineKey = function(code, key){ + _keys[code] = key; + return this; +}; + +DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true); + +DOMEvent.defineKeys({ + '38': 'up', '40': 'down', '37': 'left', '39': 'right', + '27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab', + '46': 'delete', '13': 'enter' +}); + +})(); + + + + + + +/* +--- + +name: Class + +description: Contains the Class Function for easily creating, extending, and implementing reusable Classes. + +license: MIT-style license. + +requires: [Array, String, Function, Number] + +provides: Class + +... +*/ + +(function(){ + +var Class = this.Class = new Type('Class', function(params){ + if (instanceOf(params, Function)) params = {initialize: params}; + + var newClass = function(){ + reset(this); + if (newClass.$prototyping) return this; + this.$caller = null; + var value = (this.initialize) ? this.initialize.apply(this, arguments) : this; + this.$caller = this.caller = null; + return value; + }.extend(this).implement(params); + + newClass.$constructor = Class; + newClass.prototype.$constructor = newClass; + newClass.prototype.parent = parent; + + return newClass; +}); + +var parent = function(){ + if (!this.$caller) throw new Error('The method "parent" cannot be called.'); + var name = this.$caller.$name, + parent = this.$caller.$owner.parent, + previous = (parent) ? parent.prototype[name] : null; + if (!previous) throw new Error('The method "' + name + '" has no parent.'); + return previous.apply(this, arguments); +}; + +var reset = function(object){ + for (var key in object){ + var value = object[key]; + switch (typeOf(value)){ + case 'object': + var F = function(){}; + F.prototype = value; + object[key] = reset(new F); + break; + case 'array': object[key] = value.clone(); break; + } + } + return object; +}; + +var wrap = function(self, key, method){ + if (method.$origin) method = method.$origin; + var wrapper = function(){ + if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.'); + var caller = this.caller, current = this.$caller; + this.caller = current; this.$caller = wrapper; + var result = method.apply(this, arguments); + this.$caller = current; this.caller = caller; + return result; + }.extend({$owner: self, $origin: method, $name: key}); + return wrapper; +}; + +var implement = function(key, value, retain){ + if (Class.Mutators.hasOwnProperty(key)){ + value = Class.Mutators[key].call(this, value); + if (value == null) return this; + } + + if (typeOf(value) == 'function'){ + if (value.$hidden) return this; + this.prototype[key] = (retain) ? value : wrap(this, key, value); + } else { + Object.merge(this.prototype, key, value); + } + + return this; +}; + +var getInstance = function(klass){ + klass.$prototyping = true; + var proto = new klass; + delete klass.$prototyping; + return proto; +}; + +Class.implement('implement', implement.overloadSetter()); + +Class.Mutators = { + + Extends: function(parent){ + this.parent = parent; + this.prototype = getInstance(parent); + }, + + Implements: function(items){ + Array.from(items).each(function(item){ + var instance = new item; + for (var key in instance) implement.call(this, key, instance[key], true); + }, this); + } +}; + +})(); + + +/* +--- + +name: Class.Extras + +description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. + +license: MIT-style license. + +requires: Class + +provides: [Class.Extras, Chain, Events, Options] + +... +*/ + +(function(){ + +this.Chain = new Class({ + + $chain: [], + + chain: function(){ + this.$chain.append(Array.flatten(arguments)); + return this; + }, + + callChain: function(){ + return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; + }, + + clearChain: function(){ + this.$chain.empty(); + return this; + } + +}); + +var removeOn = function(string){ + return string.replace(/^on([A-Z])/, function(full, first){ + return first.toLowerCase(); + }); +}; + +this.Events = new Class({ + + $events: {}, + + addEvent: function(type, fn, internal){ + type = removeOn(type); + + + + this.$events[type] = (this.$events[type] || []).include(fn); + if (internal) fn.internal = true; + return this; + }, + + addEvents: function(events){ + for (var type in events) this.addEvent(type, events[type]); + return this; + }, + + fireEvent: function(type, args, delay){ + type = removeOn(type); + var events = this.$events[type]; + if (!events) return this; + args = Array.from(args); + events.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + removeEvent: function(type, fn){ + type = removeOn(type); + var events = this.$events[type]; + if (events && !fn.internal){ + var index = events.indexOf(fn); + if (index != -1) delete events[index]; + } + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + if (events) events = removeOn(events); + for (type in this.$events){ + if (events && events != type) continue; + var fns = this.$events[type]; + for (var i = fns.length; i--;) if (i in fns){ + this.removeEvent(type, fns[i]); + } + } + return this; + } + +}); + +this.Options = new Class({ + + setOptions: function(){ + var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments)); + if (this.addEvent) for (var option in options){ + if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; + this.addEvent(option, options[option]); + delete options[option]; + } + return this; + } + +}); + +})(); + + +/* +--- +name: Slick.Parser +description: Standalone CSS3 Selector parser +provides: Slick.Parser +... +*/ + +;(function(){ + +var parsed, + separatorIndex, + combinatorIndex, + reversed, + cache = {}, + reverseCache = {}, + reUnescape = /\\/g; + +var parse = function(expression, isReversed){ + if (expression == null) return null; + if (expression.Slick === true) return expression; + expression = ('' + expression).replace(/^\s+|\s+$/g, ''); + reversed = !!isReversed; + var currentCache = (reversed) ? reverseCache : cache; + if (currentCache[expression]) return currentCache[expression]; + parsed = { + Slick: true, + expressions: [], + raw: expression, + reverse: function(){ + return parse(this.raw, true); + } + }; + separatorIndex = -1; + while (expression != (expression = expression.replace(regexp, parser))); + parsed.length = parsed.expressions.length; + return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed; +}; + +var reverseCombinator = function(combinator){ + if (combinator === '!') return ' '; + else if (combinator === ' ') return '!'; + else if ((/^!/).test(combinator)) return combinator.replace(/^!/, ''); + else return '!' + combinator; +}; + +var reverse = function(expression){ + var expressions = expression.expressions; + for (var i = 0; i < expressions.length; i++){ + var exp = expressions[i]; + var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)}; + + for (var j = 0; j < exp.length; j++){ + var cexp = exp[j]; + if (!cexp.reverseCombinator) cexp.reverseCombinator = ' '; + cexp.combinator = cexp.reverseCombinator; + delete cexp.reverseCombinator; + } + + exp.reverse().push(last); + } + return expression; +}; + +var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan MIT License + return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){ + return '\\' + match; + }); +}; + +var regexp = new RegExp( +/* +#!/usr/bin/env ruby +puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'') +__END__ + "(?x)^(?:\ + \\s* ( , ) \\s* # Separator \n\ + | \\s* ( + ) \\s* # Combinator \n\ + | ( \\s+ ) # CombinatorChildren \n\ + | ( + | \\* ) # Tag \n\ + | \\# ( + ) # ID \n\ + | \\. ( + ) # ClassName \n\ + | # Attribute \n\ + \\[ \ + \\s* (+) (?: \ + \\s* ([*^$!~|]?=) (?: \ + \\s* (?:\ + ([\"']?)(.*?)\\9 \ + )\ + ) \ + )? \\s* \ + \\](?!\\]) \n\ + | :+ ( + )(?:\ + \\( (?:\ + (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\ + ) \\)\ + )?\ + )" +*/ + "^(?:\\s*(,)\\s*|\\s*(+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)" + .replace(//, '[' + escapeRegExp(">+~`!@$%^&={}\\;/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') + .replace(//g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') +); + +function parser( + rawMatch, + + separator, + combinator, + combinatorChildren, + + tagName, + id, + className, + + attributeKey, + attributeOperator, + attributeQuote, + attributeValue, + + pseudoMarker, + pseudoClass, + pseudoQuote, + pseudoClassQuotedValue, + pseudoClassValue +){ + if (separator || separatorIndex === -1){ + parsed.expressions[++separatorIndex] = []; + combinatorIndex = -1; + if (separator) return ''; + } + + if (combinator || combinatorChildren || combinatorIndex === -1){ + combinator = combinator || ' '; + var currentSeparator = parsed.expressions[separatorIndex]; + if (reversed && currentSeparator[combinatorIndex]) + currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator); + currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'}; + } + + var currentParsed = parsed.expressions[separatorIndex][combinatorIndex]; + + if (tagName){ + currentParsed.tag = tagName.replace(reUnescape, ''); + + } else if (id){ + currentParsed.id = id.replace(reUnescape, ''); + + } else if (className){ + className = className.replace(reUnescape, ''); + + if (!currentParsed.classList) currentParsed.classList = []; + if (!currentParsed.classes) currentParsed.classes = []; + currentParsed.classList.push(className); + currentParsed.classes.push({ + value: className, + regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)') + }); + + } else if (pseudoClass){ + pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue; + pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null; + + if (!currentParsed.pseudos) currentParsed.pseudos = []; + currentParsed.pseudos.push({ + key: pseudoClass.replace(reUnescape, ''), + value: pseudoClassValue, + type: pseudoMarker.length == 1 ? 'class' : 'element' + }); + + } else if (attributeKey){ + attributeKey = attributeKey.replace(reUnescape, ''); + attributeValue = (attributeValue || '').replace(reUnescape, ''); + + var test, regexp; + + switch (attributeOperator){ + case '^=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) ); break; + case '$=' : regexp = new RegExp( escapeRegExp(attributeValue) +'$' ); break; + case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break; + case '|=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) +'(-|$)' ); break; + case '=' : test = function(value){ + return attributeValue == value; + }; break; + case '*=' : test = function(value){ + return value && value.indexOf(attributeValue) > -1; + }; break; + case '!=' : test = function(value){ + return attributeValue != value; + }; break; + default : test = function(value){ + return !!value; + }; + } + + if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){ + return false; + }; + + if (!test) test = function(value){ + return value && regexp.test(value); + }; + + if (!currentParsed.attributes) currentParsed.attributes = []; + currentParsed.attributes.push({ + key: attributeKey, + operator: attributeOperator, + value: attributeValue, + test: test + }); + + } + + return ''; +}; + +// Slick NS + +var Slick = (this.Slick || {}); + +Slick.parse = function(expression){ + return parse(expression); +}; + +Slick.escapeRegExp = escapeRegExp; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- +name: Slick.Finder +description: The new, superfast css selector engine. +provides: Slick.Finder +requires: Slick.Parser +... +*/ + +;(function(){ + +var local = {}, + featuresCache = {}, + toString = Object.prototype.toString; + +// Feature / Bug detection + +local.isNativeCode = function(fn){ + return (/\{\s*\[native code\]\s*\}/).test('' + fn); +}; + +local.isXML = function(document){ + return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') || + (document.nodeType == 9 && document.documentElement.nodeName != 'HTML'); +}; + +local.setDocument = function(document){ + + // convert elements / window arguments to document. if document cannot be extrapolated, the function returns. + var nodeType = document.nodeType; + if (nodeType == 9); // document + else if (nodeType) document = document.ownerDocument; // node + else if (document.navigator) document = document.document; // window + else return; + + // check if it's the old document + + if (this.document === document) return; + this.document = document; + + // check if we have done feature detection on this document before + + var root = document.documentElement, + rootUid = this.getUIDXML(root), + features = featuresCache[rootUid], + feature; + + if (features){ + for (feature in features){ + this[feature] = features[feature]; + } + return; + } + + features = featuresCache[rootUid] = {}; + + features.root = root; + features.isXMLDocument = this.isXML(document); + + features.brokenStarGEBTN + = features.starSelectsClosedQSA + = features.idGetsName + = features.brokenMixedCaseQSA + = features.brokenGEBCN + = features.brokenCheckedQSA + = features.brokenEmptyAttributeQSA + = features.isHTMLDocument + = features.nativeMatchesSelector + = false; + + var starSelectsClosed, starSelectsComments, + brokenSecondClassNameGEBCN, cachedGetElementsByClassName, + brokenFormAttributeGetter; + + var selected, id = 'slick_uniqueid'; + var testNode = document.createElement('div'); + + var testRoot = document.body || document.getElementsByTagName('body')[0] || root; + testRoot.appendChild(testNode); + + // on non-HTML documents innerHTML and getElementsById doesnt work properly + try { + testNode.innerHTML = ''; + features.isHTMLDocument = !!document.getElementById(id); + } catch(e){}; + + if (features.isHTMLDocument){ + + testNode.style.display = 'none'; + + // IE returns comment nodes for getElementsByTagName('*') for some documents + testNode.appendChild(document.createComment('')); + starSelectsComments = (testNode.getElementsByTagName('*').length > 1); + + // IE returns closed nodes (EG:"") for getElementsByTagName('*') for some documents + try { + testNode.innerHTML = 'foo'; + selected = testNode.getElementsByTagName('*'); + starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + features.brokenStarGEBTN = starSelectsComments || starSelectsClosed; + + // IE returns elements with the name instead of just id for getElementsById for some documents + try { + testNode.innerHTML = ''; + features.idGetsName = document.getElementById(id) === testNode.firstChild; + } catch(e){}; + + if (testNode.getElementsByClassName){ + + // Safari 3.2 getElementsByClassName caches results + try { + testNode.innerHTML = ''; + testNode.getElementsByClassName('b').length; + testNode.firstChild.className = 'b'; + cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2); + } catch(e){}; + + // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one + try { + testNode.innerHTML = ''; + brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2); + } catch(e){}; + + features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN; + } + + if (testNode.querySelectorAll){ + // IE 8 returns closed nodes (EG:"") for querySelectorAll('*') for some documents + try { + testNode.innerHTML = 'foo'; + selected = testNode.querySelectorAll('*'); + features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode + try { + testNode.innerHTML = ''; + features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length; + } catch(e){}; + + // Webkit and Opera dont return selected options on querySelectorAll + try { + testNode.innerHTML = ''; + features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0); + } catch(e){}; + + // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll + try { + testNode.innerHTML = ''; + features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0); + } catch(e){}; + + } + + // IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input + try { + testNode.innerHTML = '
            '; + brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's'); + } catch(e){}; + + // native matchesSelector function + + features.nativeMatchesSelector = root.matches || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector; + if (features.nativeMatchesSelector) try { + // if matchesSelector trows errors on incorrect sintaxes we can use it + features.nativeMatchesSelector.call(root, ':slick'); + features.nativeMatchesSelector = null; + } catch(e){}; + + } + + try { + root.slick_expando = 1; + delete root.slick_expando; + features.getUID = this.getUIDHTML; + } catch(e) { + features.getUID = this.getUIDXML; + } + + testRoot.removeChild(testNode); + testNode = selected = testRoot = null; + + // getAttribute + + features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){ + var method = this.attributeGetters[name]; + if (method) return method.call(node); + var attributeNode = node.getAttributeNode(name); + return (attributeNode) ? attributeNode.nodeValue : null; + } : function(node, name){ + var method = this.attributeGetters[name]; + return (method) ? method.call(node) : node.getAttribute(name); + }; + + // hasAttribute + + features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) { + return node.hasAttribute(attribute); + } : function(node, attribute) { + node = node.getAttributeNode(attribute); + return !!(node && (node.specified || node.nodeValue)); + }; + + // contains + // FIXME: Add specs: local.contains should be different for xml and html documents? + var nativeRootContains = root && this.isNativeCode(root.contains), + nativeDocumentContains = document && this.isNativeCode(document.contains); + + features.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){ + return context.contains(node); + } : (nativeRootContains && !nativeDocumentContains) ? function(context, node){ + // IE8 does not have .contains on document. + return context === node || ((context === document) ? document.documentElement : context).contains(node); + } : (root && root.compareDocumentPosition) ? function(context, node){ + return context === node || !!(context.compareDocumentPosition(node) & 16); + } : function(context, node){ + if (node) do { + if (node === context) return true; + } while ((node = node.parentNode)); + return false; + }; + + // document order sorting + // credits to Sizzle (http://sizzlejs.com/) + + features.documentSorter = (root.compareDocumentPosition) ? function(a, b){ + if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0; + return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + } : ('sourceIndex' in root) ? function(a, b){ + if (!a.sourceIndex || !b.sourceIndex) return 0; + return a.sourceIndex - b.sourceIndex; + } : (document.createRange) ? function(a, b){ + if (!a.ownerDocument || !b.ownerDocument) return 0; + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + return aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + } : null ; + + root = null; + + for (feature in features){ + this[feature] = features[feature]; + } +}; + +// Main Method + +var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/, + reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/, + qsaFailExpCache = {}; + +local.search = function(context, expression, append, first){ + + var found = this.found = (first) ? null : (append || []); + + if (!context) return found; + else if (context.navigator) context = context.document; // Convert the node from a window to a document + else if (!context.nodeType) return found; + + // setup + + var parsed, i, + uniques = this.uniques = {}, + hasOthers = !!(append && append.length), + contextIsDocument = (context.nodeType == 9); + + if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context); + + // avoid duplicating items already in the append array + if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true; + + // expression checks + + if (typeof expression == 'string'){ // expression is a string + + /**/ + var simpleSelector = expression.match(reSimpleSelector); + simpleSelectors: if (simpleSelector) { + + var symbol = simpleSelector[1], + name = simpleSelector[2], + node, nodes; + + if (!symbol){ + + if (name == '*' && this.brokenStarGEBTN) break simpleSelectors; + nodes = context.getElementsByTagName(name); + if (first) return nodes[0] || null; + for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + + } else if (symbol == '#'){ + + if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors; + node = context.getElementById(name); + if (!node) return found; + if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors; + if (first) return node || null; + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + + } else if (symbol == '.'){ + + if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors; + if (context.getElementsByClassName && !this.brokenGEBCN){ + nodes = context.getElementsByClassName(name); + if (first) return nodes[0] || null; + for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + } else { + var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)'); + nodes = context.getElementsByTagName('*'); + for (i = 0; node = nodes[i++];){ + className = node.className; + if (!(className && matchClass.test(className))) continue; + if (first) return node; + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + } + + } + + if (hasOthers) this.sort(found); + return (first) ? null : found; + + } + /**/ + + /**/ + querySelector: if (context.querySelectorAll) { + + if (!this.isHTMLDocument + || qsaFailExpCache[expression] + //TODO: only skip when expression is actually mixed case + || this.brokenMixedCaseQSA + || (this.brokenCheckedQSA && expression.indexOf(':checked') > -1) + || (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) + || (!contextIsDocument //Abort when !contextIsDocument and... + // there are multiple expressions in the selector + // since we currently only fix non-document rooted QSA for single expression selectors + && expression.indexOf(',') > -1 + ) + || Slick.disableQSA + ) break querySelector; + + var _expression = expression, _context = context; + if (!contextIsDocument){ + // non-document rooted QSA + // credits to Andrew Dupont + var currentId = _context.getAttribute('id'), slickid = 'slickid__'; + _context.setAttribute('id', slickid); + _expression = '#' + slickid + ' ' + _expression; + context = _context.parentNode; + } + + try { + if (first) return context.querySelector(_expression) || null; + else nodes = context.querySelectorAll(_expression); + } catch(e) { + qsaFailExpCache[expression] = 1; + break querySelector; + } finally { + if (!contextIsDocument){ + if (currentId) _context.setAttribute('id', currentId); + else _context.removeAttribute('id'); + context = _context; + } + } + + if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){ + if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node); + } else for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + + if (hasOthers) this.sort(found); + return found; + + } + /**/ + + parsed = this.Slick.parse(expression); + if (!parsed.length) return found; + } else if (expression == null){ // there is no expression + return found; + } else if (expression.Slick){ // expression is a parsed Slick object + parsed = expression; + } else if (this.contains(context.documentElement || context, expression)){ // expression is a node + (found) ? found.push(expression) : found = expression; + return found; + } else { // other junk + return found; + } + + /**//**/ + + // cache elements for the nth selectors + + this.posNTH = {}; + this.posNTHLast = {}; + this.posNTHType = {}; + this.posNTHTypeLast = {}; + + /**//**/ + + // if append is null and there is only a single selector with one expression use pushArray, else use pushUID + this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID; + + if (found == null) found = []; + + // default engine + + var j, m, n; + var combinator, tag, id, classList, classes, attributes, pseudos; + var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions; + + search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){ + + combinator = 'combinator:' + currentBit.combinator; + if (!this[combinator]) continue search; + + tag = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase(); + id = currentBit.id; + classList = currentBit.classList; + classes = currentBit.classes; + attributes = currentBit.attributes; + pseudos = currentBit.pseudos; + lastBit = (j === (currentExpression.length - 1)); + + this.bitUniques = {}; + + if (lastBit){ + this.uniques = uniques; + this.found = found; + } else { + this.uniques = {}; + this.found = []; + } + + if (j === 0){ + this[combinator](context, tag, id, classes, attributes, pseudos, classList); + if (first && lastBit && found.length) break search; + } else { + if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){ + this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + if (found.length) break search; + } else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + } + + currentItems = this.found; + } + + // should sort if there are nodes in append and if you pass multiple expressions. + if (hasOthers || (parsed.expressions.length > 1)) this.sort(found); + + return (first) ? (found[0] || null) : found; +}; + +// Utils + +local.uidx = 1; +local.uidk = 'slick-uniqueid'; + +local.getUIDXML = function(node){ + var uid = node.getAttribute(this.uidk); + if (!uid){ + uid = this.uidx++; + node.setAttribute(this.uidk, uid); + } + return uid; +}; + +local.getUIDHTML = function(node){ + return node.uniqueNumber || (node.uniqueNumber = this.uidx++); +}; + +// sort based on the setDocument documentSorter method. + +local.sort = function(results){ + if (!this.documentSorter) return results; + results.sort(this.documentSorter); + return results; +}; + +/**//**/ + +local.cacheNTH = {}; + +local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/; + +local.parseNTHArgument = function(argument){ + var parsed = argument.match(this.matchNTH); + if (!parsed) return false; + var special = parsed[2] || false; + var a = parsed[1] || 1; + if (a == '-') a = -1; + var b = +parsed[3] || 0; + parsed = + (special == 'n') ? {a: a, b: b} : + (special == 'odd') ? {a: 2, b: 1} : + (special == 'even') ? {a: 2, b: 0} : {a: 0, b: a}; + + return (this.cacheNTH[argument] = parsed); +}; + +local.createNTHPseudo = function(child, sibling, positions, ofType){ + return function(node, argument){ + var uid = this.getUID(node); + if (!this[positions][uid]){ + var parent = node.parentNode; + if (!parent) return false; + var el = parent[child], count = 1; + if (ofType){ + var nodeName = node.nodeName; + do { + if (el.nodeName != nodeName) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } else { + do { + if (el.nodeType != 1) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } + } + argument = argument || 'n'; + var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument); + if (!parsed) return false; + var a = parsed.a, b = parsed.b, pos = this[positions][uid]; + if (a == 0) return b == pos; + if (a > 0){ + if (pos < b) return false; + } else { + if (b < pos) return false; + } + return ((pos - b) % a) == 0; + }; +}; + +/**//**/ + +local.pushArray = function(node, tag, id, classes, attributes, pseudos){ + if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node); +}; + +local.pushUID = function(node, tag, id, classes, attributes, pseudos){ + var uid = this.getUID(node); + if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){ + this.uniques[uid] = true; + this.found.push(node); + } +}; + +local.matchNode = function(node, selector){ + if (this.isHTMLDocument && this.nativeMatchesSelector){ + try { + return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]')); + } catch(matchError) {} + } + + var parsed = this.Slick.parse(selector); + if (!parsed) return true; + + // simple (single) selectors + var expressions = parsed.expressions, simpleExpCounter = 0, i; + for (i = 0; (currentExpression = expressions[i]); i++){ + if (currentExpression.length == 1){ + var exp = currentExpression[0]; + if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true; + simpleExpCounter++; + } + } + + if (simpleExpCounter == parsed.length) return false; + + var nodes = this.search(this.document, parsed), item; + for (i = 0; item = nodes[i++];){ + if (item === node) return true; + } + return false; +}; + +local.matchPseudo = function(node, name, argument){ + var pseudoName = 'pseudo:' + name; + if (this[pseudoName]) return this[pseudoName](node, argument); + var attribute = this.getAttribute(node, name); + return (argument) ? argument == attribute : !!attribute; +}; + +local.matchSelector = function(node, tag, id, classes, attributes, pseudos){ + if (tag){ + var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase(); + if (tag == '*'){ + if (nodeName < '@') return false; // Fix for comment nodes and closed nodes + } else { + if (nodeName != tag) return false; + } + } + + if (id && node.getAttribute('id') != id) return false; + + var i, part, cls; + if (classes) for (i = classes.length; i--;){ + cls = this.getAttribute(node, 'class'); + if (!(cls && classes[i].regexp.test(cls))) return false; + } + if (attributes) for (i = attributes.length; i--;){ + part = attributes[i]; + if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false; + } + if (pseudos) for (i = pseudos.length; i--;){ + part = pseudos[i]; + if (!this.matchPseudo(node, part.key, part.value)) return false; + } + return true; +}; + +var combinators = { + + ' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level + + var i, item, children; + + if (this.isHTMLDocument){ + getById: if (id){ + item = this.document.getElementById(id); + if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){ + // all[id] returns all the elements with that name or id inside node + // if theres just one it will return the element, else it will be a collection + children = node.all[id]; + if (!children) return; + if (!children[0]) children = [children]; + for (i = 0; item = children[i++];){ + var idNode = item.getAttributeNode('id'); + if (idNode && idNode.nodeValue == id){ + this.push(item, tag, null, classes, attributes, pseudos); + break; + } + } + return; + } + if (!item){ + // if the context is in the dom we return, else we will try GEBTN, breaking the getById label + if (this.contains(this.root, node)) return; + else break getById; + } else if (this.document !== node && !this.contains(node, item)) return; + this.push(item, tag, null, classes, attributes, pseudos); + return; + } + getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){ + children = node.getElementsByClassName(classList.join(' ')); + if (!(children && children.length)) break getByClass; + for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos); + return; + } + } + getByTag: { + children = node.getElementsByTagName(tag); + if (!(children && children.length)) break getByTag; + if (!this.brokenStarGEBTN) tag = null; + for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos); + } + }, + + '>': function(node, tag, id, classes, attributes, pseudos){ // direct children + if ((node = node.firstChild)) do { + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + } while ((node = node.nextSibling)); + }, + + '+': function(node, tag, id, classes, attributes, pseudos){ // next sibling + while ((node = node.nextSibling)) if (node.nodeType == 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '^': function(node, tag, id, classes, attributes, pseudos){ // first child + node = node.firstChild; + if (node){ + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '~': function(node, tag, id, classes, attributes, pseudos){ // next siblings + while ((node = node.nextSibling)){ + if (node.nodeType != 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + }, + + '++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling + this['combinator:+'](node, tag, id, classes, attributes, pseudos); + this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + }, + + '~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings + this['combinator:~'](node, tag, id, classes, attributes, pseudos); + this['combinator:!~'](node, tag, id, classes, attributes, pseudos); + }, + + '!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document + while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level) + node = node.parentNode; + if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling + while ((node = node.previousSibling)) if (node.nodeType == 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '!^': function(node, tag, id, classes, attributes, pseudos){ // last child + node = node.lastChild; + if (node){ + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings + while ((node = node.previousSibling)){ + if (node.nodeType != 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + } + +}; + +for (var c in combinators) local['combinator:' + c] = combinators[c]; + +var pseudos = { + + /**/ + + 'empty': function(node){ + var child = node.firstChild; + return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length; + }, + + 'not': function(node, expression){ + return !this.matchNode(node, expression); + }, + + 'contains': function(node, text){ + return (node.innerText || node.textContent || '').indexOf(text) > -1; + }, + + 'first-child': function(node){ + while ((node = node.previousSibling)) if (node.nodeType == 1) return false; + return true; + }, + + 'last-child': function(node){ + while ((node = node.nextSibling)) if (node.nodeType == 1) return false; + return true; + }, + + 'only-child': function(node){ + var prev = node; + while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeType == 1) return false; + return true; + }, + + /**/ + + 'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'), + + 'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'), + + 'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true), + + 'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true), + + 'index': function(node, index){ + return this['pseudo:nth-child'](node, '' + (index + 1)); + }, + + 'even': function(node){ + return this['pseudo:nth-child'](node, '2n'); + }, + + 'odd': function(node){ + return this['pseudo:nth-child'](node, '2n+1'); + }, + + /**/ + + /**/ + + 'first-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false; + return true; + }, + + 'last-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false; + return true; + }, + + 'only-of-type': function(node){ + var prev = node, nodeName = node.nodeName; + while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false; + return true; + }, + + /**/ + + // custom pseudos + + 'enabled': function(node){ + return !node.disabled; + }, + + 'disabled': function(node){ + return node.disabled; + }, + + 'checked': function(node){ + return node.checked || node.selected; + }, + + 'focus': function(node){ + return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex')); + }, + + 'root': function(node){ + return (node === this.root); + }, + + 'selected': function(node){ + return node.selected; + } + + /**/ +}; + +for (var p in pseudos) local['pseudo:' + p] = pseudos[p]; + +// attributes methods + +var attributeGetters = local.attributeGetters = { + + 'for': function(){ + return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for'); + }, + + 'href': function(){ + return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href'); + }, + + 'style': function(){ + return (this.style) ? this.style.cssText : this.getAttribute('style'); + }, + + 'tabindex': function(){ + var attributeNode = this.getAttributeNode('tabindex'); + return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; + }, + + 'type': function(){ + return this.getAttribute('type'); + }, + + 'maxlength': function(){ + var attributeNode = this.getAttributeNode('maxLength'); + return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; + } + +}; + +attributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength; + +// Slick + +var Slick = local.Slick = (this.Slick || {}); + +Slick.version = '1.1.7'; + +// Slick finder + +Slick.search = function(context, expression, append){ + return local.search(context, expression, append); +}; + +Slick.find = function(context, expression){ + return local.search(context, expression, null, true); +}; + +// Slick containment checker + +Slick.contains = function(container, node){ + local.setDocument(container); + return local.contains(container, node); +}; + +// Slick attribute getter + +Slick.getAttribute = function(node, name){ + local.setDocument(node); + return local.getAttribute(node, name); +}; + +Slick.hasAttribute = function(node, name){ + local.setDocument(node); + return local.hasAttribute(node, name); +}; + +// Slick matcher + +Slick.match = function(node, selector){ + if (!(node && selector)) return false; + if (!selector || selector === node) return true; + local.setDocument(node); + return local.matchNode(node, selector); +}; + +// Slick attribute accessor + +Slick.defineAttributeGetter = function(name, fn){ + local.attributeGetters[name] = fn; + return this; +}; + +Slick.lookupAttributeGetter = function(name){ + return local.attributeGetters[name]; +}; + +// Slick pseudo accessor + +Slick.definePseudo = function(name, fn){ + local['pseudo:' + name] = function(node, argument){ + return fn.call(node, argument); + }; + return this; +}; + +Slick.lookupPseudo = function(name){ + var pseudo = local['pseudo:' + name]; + if (pseudo) return function(argument){ + return pseudo.call(this, argument); + }; + return null; +}; + +// Slick overrides accessor + +Slick.override = function(regexp, fn){ + local.override(regexp, fn); + return this; +}; + +Slick.isXML = local.isXML; + +Slick.uidOf = function(node){ + return local.getUIDHTML(node); +}; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- + +name: Element + +description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements. + +license: MIT-style license. + +requires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder] + +provides: [Element, Elements, $, $$, IFrame, Selectors] + +... +*/ + +var Element = this.Element = function(tag, props){ + var konstructor = Element.Constructors[tag]; + if (konstructor) return konstructor(props); + if (typeof tag != 'string') return document.id(tag).set(props); + + if (!props) props = {}; + + if (!(/^[\w-]+$/).test(tag)){ + var parsed = Slick.parse(tag).expressions[0][0]; + tag = (parsed.tag == '*') ? 'div' : parsed.tag; + if (parsed.id && props.id == null) props.id = parsed.id; + + var attributes = parsed.attributes; + if (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){ + attr = attributes[i]; + if (props[attr.key] != null) continue; + + if (attr.value != null && attr.operator == '=') props[attr.key] = attr.value; + else if (!attr.value && !attr.operator) props[attr.key] = true; + } + + if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' '); + } + + return document.newElement(tag, props); +}; + + +if (Browser.Element){ + Element.prototype = Browser.Element.prototype; + // IE8 and IE9 require the wrapping. + Element.prototype._fireEvent = (function(fireEvent){ + return function(type, event){ + return fireEvent.call(this, type, event); + }; + })(Element.prototype.fireEvent); +} + +new Type('Element', Element).mirror(function(name){ + if (Array.prototype[name]) return; + + var obj = {}; + obj[name] = function(){ + var results = [], args = arguments, elements = true; + for (var i = 0, l = this.length; i < l; i++){ + var element = this[i], result = results[i] = element[name].apply(element, args); + elements = (elements && typeOf(result) == 'element'); + } + return (elements) ? new Elements(results) : results; + }; + + Elements.implement(obj); +}); + +if (!Browser.Element){ + Element.parent = Object; + + Element.Prototype = { + '$constructor': Element, + '$family': Function.from('element').hide() + }; + + Element.mirror(function(name, method){ + Element.Prototype[name] = method; + }); +} + +Element.Constructors = {}; + + + +var IFrame = new Type('IFrame', function(){ + var params = Array.link(arguments, { + properties: Type.isObject, + iframe: function(obj){ + return (obj != null); + } + }); + + var props = params.properties || {}, iframe; + if (params.iframe) iframe = document.id(params.iframe); + var onload = props.onload || function(){}; + delete props.onload; + props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick(); + iframe = new Element(iframe || 'iframe', props); + + var onLoad = function(){ + onload.call(iframe.contentWindow); + }; + + if (window.frames[props.id]) onLoad(); + else iframe.addListener('load', onLoad); + return iframe; +}); + +var Elements = this.Elements = function(nodes){ + if (nodes && nodes.length){ + var uniques = {}, node; + for (var i = 0; node = nodes[i++];){ + var uid = Slick.uidOf(node); + if (!uniques[uid]){ + uniques[uid] = true; + this.push(node); + } + } + } +}; + +Elements.prototype = {length: 0}; +Elements.parent = Array; + +new Type('Elements', Elements).implement({ + + filter: function(filter, bind){ + if (!filter) return this; + return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){ + return item.match(filter); + } : filter, bind)); + }.protect(), + + push: function(){ + var length = this.length; + for (var i = 0, l = arguments.length; i < l; i++){ + var item = document.id(arguments[i]); + if (item) this[length++] = item; + } + return (this.length = length); + }.protect(), + + unshift: function(){ + var items = []; + for (var i = 0, l = arguments.length; i < l; i++){ + var item = document.id(arguments[i]); + if (item) items.push(item); + } + return Array.prototype.unshift.apply(this, items); + }.protect(), + + concat: function(){ + var newElements = new Elements(this); + for (var i = 0, l = arguments.length; i < l; i++){ + var item = arguments[i]; + if (Type.isEnumerable(item)) newElements.append(item); + else newElements.push(item); + } + return newElements; + }.protect(), + + append: function(collection){ + for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]); + return this; + }.protect(), + + empty: function(){ + while (this.length) delete this[--this.length]; + return this; + }.protect() + +}); + + + +(function(){ + +// FF, IE +var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2}; + +splice.call(object, 1, 1); +if (object[1] == 1) Elements.implement('splice', function(){ + var length = this.length; + var result = splice.apply(this, arguments); + while (length >= this.length) delete this[length--]; + return result; +}.protect()); + +Array.forEachMethod(function(method, name){ + Elements.implement(name, method); +}); + +Array.mirror(Elements); + +/**/ +var createElementAcceptsHTML; +try { + createElementAcceptsHTML = (document.createElement('').name == 'x'); +} catch (e){} + +var escapeQuotes = function(html){ + return ('' + html).replace(/&/g, '&').replace(/"/g, '"'); +}; +/**/ + +Document.implement({ + + newElement: function(tag, props){ + if (props && props.checked != null) props.defaultChecked = props.checked; + /**/// Fix for readonly name and type properties in IE < 8 + if (createElementAcceptsHTML && props){ + tag = '<' + tag; + if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"'; + if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"'; + tag += '>'; + delete props.name; + delete props.type; + } + /**/ + return this.id(this.createElement(tag)).set(props); + } + +}); + +})(); + +(function(){ + +Slick.uidOf(window); +Slick.uidOf(document); + +Document.implement({ + + newTextNode: function(text){ + return this.createTextNode(text); + }, + + getDocument: function(){ + return this; + }, + + getWindow: function(){ + return this.window; + }, + + id: (function(){ + + var types = { + + string: function(id, nocash, doc){ + id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1')); + return (id) ? types.element(id, nocash) : null; + }, + + element: function(el, nocash){ + Slick.uidOf(el); + if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){ + var fireEvent = el.fireEvent; + // wrapping needed in IE7, or else crash + el._fireEvent = function(type, event){ + return fireEvent(type, event); + }; + Object.append(el, Element.Prototype); + } + return el; + }, + + object: function(obj, nocash, doc){ + if (obj.toElement) return types.element(obj.toElement(doc), nocash); + return null; + } + + }; + + types.textnode = types.whitespace = types.window = types.document = function(zero){ + return zero; + }; + + return function(el, nocash, doc){ + if (el && el.$family && el.uniqueNumber) return el; + var type = typeOf(el); + return (types[type]) ? types[type](el, nocash, doc || document) : null; + }; + + })() + +}); + +if (window.$ == null) Window.implement('$', function(el, nc){ + return document.id(el, nc, this.document); +}); + +Window.implement({ + + getDocument: function(){ + return this.document; + }, + + getWindow: function(){ + return this; + } + +}); + +[Document, Element].invoke('implement', { + + getElements: function(expression){ + return Slick.search(this, expression, new Elements); + }, + + getElement: function(expression){ + return document.id(Slick.find(this, expression)); + } + +}); + +var contains = {contains: function(element){ + return Slick.contains(this, element); +}}; + +if (!document.contains) Document.implement(contains); +if (!document.createElement('div').contains) Element.implement(contains); + + + +// tree walking + +var injectCombinator = function(expression, combinator){ + if (!expression) return combinator; + + expression = Object.clone(Slick.parse(expression)); + + var expressions = expression.expressions; + for (var i = expressions.length; i--;) + expressions[i][0].combinator = combinator; + + return expression; +}; + +Object.forEach({ + getNext: '~', + getPrevious: '!~', + getParent: '!' +}, function(combinator, method){ + Element.implement(method, function(expression){ + return this.getElement(injectCombinator(expression, combinator)); + }); +}); + +Object.forEach({ + getAllNext: '~', + getAllPrevious: '!~', + getSiblings: '~~', + getChildren: '>', + getParents: '!' +}, function(combinator, method){ + Element.implement(method, function(expression){ + return this.getElements(injectCombinator(expression, combinator)); + }); +}); + +Element.implement({ + + getFirst: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]); + }, + + getLast: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast()); + }, + + getWindow: function(){ + return this.ownerDocument.window; + }, + + getDocument: function(){ + return this.ownerDocument; + }, + + getElementById: function(id){ + return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1'))); + }, + + match: function(expression){ + return !expression || Slick.match(this, expression); + } + +}); + + + +if (window.$$ == null) Window.implement('$$', function(selector){ + if (arguments.length == 1){ + if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements); + else if (Type.isEnumerable(selector)) return new Elements(selector); + } + return new Elements(arguments); +}); + +// Inserters + +var inserters = { + + before: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element); + }, + + after: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element.nextSibling); + }, + + bottom: function(context, element){ + element.appendChild(context); + }, + + top: function(context, element){ + element.insertBefore(context, element.firstChild); + } + +}; + +inserters.inside = inserters.bottom; + + + +// getProperty / setProperty + +var propertyGetters = {}, propertySetters = {}; + +// properties + +var properties = {}; +Array.forEach([ + 'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', + 'frameBorder', 'rowSpan', 'tabIndex', 'useMap' +], function(property){ + properties[property.toLowerCase()] = property; +}); + +properties.html = 'innerHTML'; +properties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent'; + +Object.forEach(properties, function(real, key){ + propertySetters[key] = function(node, value){ + node[real] = value; + }; + propertyGetters[key] = function(node){ + return node[real]; + }; +}); + +// Booleans + +var bools = [ + 'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', + 'disabled', 'readOnly', 'multiple', 'selected', 'noresize', + 'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay', + 'loop' +]; + +var booleans = {}; +Array.forEach(bools, function(bool){ + var lower = bool.toLowerCase(); + booleans[lower] = bool; + propertySetters[lower] = function(node, value){ + node[bool] = !!value; + }; + propertyGetters[lower] = function(node){ + return !!node[bool]; + }; +}); + +// Special cases + +Object.append(propertySetters, { + + 'class': function(node, value){ + ('className' in node) ? node.className = (value || '') : node.setAttribute('class', value); + }, + + 'for': function(node, value){ + ('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value); + }, + + 'style': function(node, value){ + (node.style) ? node.style.cssText = value : node.setAttribute('style', value); + }, + + 'value': function(node, value){ + node.value = (value != null) ? value : ''; + } + +}); + +propertyGetters['class'] = function(node){ + return ('className' in node) ? node.className || null : node.getAttribute('class'); +}; + +/* */ +var el = document.createElement('button'); +// IE sets type as readonly and throws +try { el.type = 'button'; } catch(e){} +if (el.type != 'button') propertySetters.type = function(node, value){ + node.setAttribute('type', value); +}; +el = null; +/* */ + +/**/ +var input = document.createElement('input'); +input.value = 't'; +input.type = 'submit'; +if (input.value != 't') propertySetters.type = function(node, type){ + var value = node.value; + node.type = type; + node.value = value; +}; +input = null; +/**/ + +/* getProperty, setProperty */ + +/* */ +var pollutesGetAttribute = (function(div){ + div.random = 'attribute'; + return (div.getAttribute('random') == 'attribute'); +})(document.createElement('div')); + +var hasCloneBug = (function(test){ + test.innerHTML = ''; + return test.cloneNode(true).firstChild.childNodes.length != 1; +})(document.createElement('div')); +/* */ + +var hasClassList = !!document.createElement('div').classList; + +var classes = function(className){ + var classNames = (className || '').clean().split(" "), uniques = {}; + return classNames.filter(function(className){ + if (className !== "" && !uniques[className]) return uniques[className] = className; + }); +}; + +var addToClassList = function(name){ + this.classList.add(name); +}; + +var removeFromClassList = function(name){ + this.classList.remove(name); +}; + +Element.implement({ + + setProperty: function(name, value){ + var setter = propertySetters[name.toLowerCase()]; + if (setter){ + setter(this, value); + } else { + /* */ + var attributeWhiteList; + if (pollutesGetAttribute) attributeWhiteList = this.retrieve('$attributeWhiteList', {}); + /* */ + + if (value == null){ + this.removeAttribute(name); + /* */ + if (pollutesGetAttribute) delete attributeWhiteList[name]; + /* */ + } else { + this.setAttribute(name, '' + value); + /* */ + if (pollutesGetAttribute) attributeWhiteList[name] = true; + /* */ + } + } + return this; + }, + + setProperties: function(attributes){ + for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); + return this; + }, + + getProperty: function(name){ + var getter = propertyGetters[name.toLowerCase()]; + if (getter) return getter(this); + /* */ + if (pollutesGetAttribute){ + var attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {}); + if (!attr) return null; + if (attr.expando && !attributeWhiteList[name]){ + var outer = this.outerHTML; + // segment by the opening tag and find mention of attribute name + if (outer.substr(0, outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name) < 0) return null; + attributeWhiteList[name] = true; + } + } + /* */ + var result = Slick.getAttribute(this, name); + return (!result && !Slick.hasAttribute(this, name)) ? null : result; + }, + + getProperties: function(){ + var args = Array.from(arguments); + return args.map(this.getProperty, this).associate(args); + }, + + removeProperty: function(name){ + return this.setProperty(name, null); + }, + + removeProperties: function(){ + Array.each(arguments, this.removeProperty, this); + return this; + }, + + set: function(prop, value){ + var property = Element.Properties[prop]; + (property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value); + }.overloadSetter(), + + get: function(prop){ + var property = Element.Properties[prop]; + return (property && property.get) ? property.get.apply(this) : this.getProperty(prop); + }.overloadGetter(), + + erase: function(prop){ + var property = Element.Properties[prop]; + (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); + return this; + }, + + hasClass: hasClassList ? function(className){ + return this.classList.contains(className); + } : function(className){ + return this.className.clean().contains(className, ' '); + }, + + addClass: hasClassList ? function(className){ + classes(className).forEach(addToClassList, this); + return this; + } : function(className){ + this.className = classes(className + ' ' + this.className).join(' '); + return this; + }, + + removeClass: hasClassList ? function(className){ + classes(className).forEach(removeFromClassList, this); + return this; + } : function(className){ + var classNames = classes(this.className); + classes(className).forEach(classNames.erase, classNames); + this.className = classNames.join(' '); + return this; + }, + + toggleClass: function(className, force){ + if (force == null) force = !this.hasClass(className); + return (force) ? this.addClass(className) : this.removeClass(className); + }, + + adopt: function(){ + var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length; + if (length > 1) parent = fragment = document.createDocumentFragment(); + + for (var i = 0; i < length; i++){ + var element = document.id(elements[i], true); + if (element) parent.appendChild(element); + } + + if (fragment) this.appendChild(fragment); + + return this; + }, + + appendText: function(text, where){ + return this.grab(this.getDocument().newTextNode(text), where); + }, + + grab: function(el, where){ + inserters[where || 'bottom'](document.id(el, true), this); + return this; + }, + + inject: function(el, where){ + inserters[where || 'bottom'](this, document.id(el, true)); + return this; + }, + + replaces: function(el){ + el = document.id(el, true); + el.parentNode.replaceChild(this, el); + return this; + }, + + wraps: function(el, where){ + el = document.id(el, true); + return this.replaces(el).grab(el, where); + }, + + getSelected: function(){ + this.selectedIndex; // Safari 3.2.1 + return new Elements(Array.from(this.options).filter(function(option){ + return option.selected; + })); + }, + + toQueryString: function(){ + var queryString = []; + this.getElements('input, select, textarea').each(function(el){ + var type = el.type; + if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return; + + var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){ + // IE + return document.id(opt).get('value'); + }) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value'); + + Array.from(value).each(function(val){ + if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val)); + }); + }); + return queryString.join('&'); + } + +}); + + +// appendHTML + +var appendInserters = { + before: 'beforeBegin', + after: 'afterEnd', + bottom: 'beforeEnd', + top: 'afterBegin', + inside: 'beforeEnd' +}; + +Element.implement('appendHTML', ('insertAdjacentHTML' in document.createElement('div')) ? function(html, where){ + this.insertAdjacentHTML(appendInserters[where || 'bottom'], html); + return this; +} : function(html, where){ + var temp = new Element('div', {html: html}), + children = temp.childNodes, + fragment = temp.firstChild; + + if (!fragment) return this; + if (children.length > 1){ + fragment = document.createDocumentFragment(); + for (var i = 0, l = children.length; i < l; i++){ + fragment.appendChild(children[i]); + } + } + + inserters[where || 'bottom'](fragment, this); + return this; +}); + +var collected = {}, storage = {}; + +var get = function(uid){ + return (storage[uid] || (storage[uid] = {})); +}; + +var clean = function(item){ + var uid = item.uniqueNumber; + if (item.removeEvents) item.removeEvents(); + if (item.clearAttributes) item.clearAttributes(); + if (uid != null){ + delete collected[uid]; + delete storage[uid]; + } + return item; +}; + +var formProps = {input: 'checked', option: 'selected', textarea: 'value'}; + +Element.implement({ + + destroy: function(){ + var children = clean(this).getElementsByTagName('*'); + Array.each(children, clean); + Element.dispose(this); + return null; + }, + + empty: function(){ + Array.from(this.childNodes).each(Element.dispose); + return this; + }, + + dispose: function(){ + return (this.parentNode) ? this.parentNode.removeChild(this) : this; + }, + + clone: function(contents, keepid){ + contents = contents !== false; + var clone = this.cloneNode(contents), ce = [clone], te = [this], i; + + if (contents){ + ce.append(Array.from(clone.getElementsByTagName('*'))); + te.append(Array.from(this.getElementsByTagName('*'))); + } + + for (i = ce.length; i--;){ + var node = ce[i], element = te[i]; + if (!keepid) node.removeAttribute('id'); + /**/ + if (node.clearAttributes){ + node.clearAttributes(); + node.mergeAttributes(element); + node.removeAttribute('uniqueNumber'); + if (node.options){ + var no = node.options, eo = element.options; + for (var j = no.length; j--;) no[j].selected = eo[j].selected; + } + } + /**/ + var prop = formProps[element.tagName.toLowerCase()]; + if (prop && element[prop]) node[prop] = element[prop]; + } + + /**/ + if (hasCloneBug){ + var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object'); + for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML; + } + /**/ + return document.id(clone); + } + +}); + +[Element, Window, Document].invoke('implement', { + + addListener: function(type, fn){ + if (window.attachEvent && !window.addEventListener){ + collected[Slick.uidOf(this)] = this; + } + if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]); + else this.attachEvent('on' + type, fn); + return this; + }, + + removeListener: function(type, fn){ + if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]); + else this.detachEvent('on' + type, fn); + return this; + }, + + retrieve: function(property, dflt){ + var storage = get(Slick.uidOf(this)), prop = storage[property]; + if (dflt != null && prop == null) prop = storage[property] = dflt; + return prop != null ? prop : null; + }, + + store: function(property, value){ + var storage = get(Slick.uidOf(this)); + storage[property] = value; + return this; + }, + + eliminate: function(property){ + var storage = get(Slick.uidOf(this)); + delete storage[property]; + return this; + } + +}); + +/**/ +if (window.attachEvent && !window.addEventListener){ + var gc = function(){ + Object.each(collected, clean); + if (window.CollectGarbage) CollectGarbage(); + window.removeListener('unload', gc); + } + window.addListener('unload', gc); +} +/**/ + +Element.Properties = {}; + + + +Element.Properties.style = { + + set: function(style){ + this.style.cssText = style; + }, + + get: function(){ + return this.style.cssText; + }, + + erase: function(){ + this.style.cssText = ''; + } + +}; + +Element.Properties.tag = { + + get: function(){ + return this.tagName.toLowerCase(); + } + +}; + +Element.Properties.html = { + + set: function(html){ + if (html == null) html = ''; + else if (typeOf(html) == 'array') html = html.join(''); + this.innerHTML = html; + }, + + erase: function(){ + this.innerHTML = ''; + } + +}; + +var supportsHTML5Elements = true, supportsTableInnerHTML = true, supportsTRInnerHTML = true; + +/**/ +// technique by jdbarlett - http://jdbartlett.com/innershiv/ +var div = document.createElement('div'); +div.innerHTML = ''; +supportsHTML5Elements = (div.childNodes.length == 1); +if (!supportsHTML5Elements){ + var tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '), + fragment = document.createDocumentFragment(), l = tags.length; + while (l--) fragment.createElement(tags[l]); +} +div = null; +/**/ + +/**/ +supportsTableInnerHTML = Function.attempt(function(){ + var table = document.createElement('table'); + table.innerHTML = ''; + return true; +}); + +/**/ +var tr = document.createElement('tr'), html = ''; +tr.innerHTML = html; +supportsTRInnerHTML = (tr.innerHTML == html); +tr = null; +/**/ + +if (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){ + + Element.Properties.html.set = (function(set){ + + var translations = { + table: [1, '', '
            '], + select: [1, ''], + tbody: [2, '', '
            '], + tr: [3, '', '
            '] + }; + + translations.thead = translations.tfoot = translations.tbody; + + return function(html){ + var wrap = translations[this.get('tag')]; + if (!wrap && !supportsHTML5Elements) wrap = [0, '', '']; + if (!wrap) return set.call(this, html); + + var level = wrap[0], wrapper = document.createElement('div'), target = wrapper; + if (!supportsHTML5Elements) fragment.appendChild(wrapper); + wrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join(''); + while (level--) target = target.firstChild; + this.empty().adopt(target.childNodes); + if (!supportsHTML5Elements) fragment.removeChild(wrapper); + wrapper = null; + }; + + })(Element.Properties.html.set); +} +/*
            */ + +/**/ +var testForm = document.createElement('form'); +testForm.innerHTML = ''; + +if (testForm.firstChild.value != 's') Element.Properties.value = { + + set: function(value){ + var tag = this.get('tag'); + if (tag != 'select') return this.setProperty('value', value); + var options = this.getElements('option'); + value = String(value); + for (var i = 0; i < options.length; i++){ + var option = options[i], + attr = option.getAttributeNode('value'), + optionValue = (attr && attr.specified) ? option.value : option.get('text'); + if (optionValue === value) return option.selected = true; + } + }, + + get: function(){ + var option = this, tag = option.get('tag'); + + if (tag != 'select' && tag != 'option') return this.getProperty('value'); + + if (tag == 'select' && !(option = option.getSelected()[0])) return ''; + + var attr = option.getAttributeNode('value'); + return (attr && attr.specified) ? option.value : option.get('text'); + } + +}; +testForm = null; +/**/ + +/**/ +if (document.createElement('div').getAttributeNode('id')) Element.Properties.id = { + set: function(id){ + this.id = this.getAttributeNode('id').value = id; + }, + get: function(){ + return this.id || null; + }, + erase: function(){ + this.id = this.getAttributeNode('id').value = ''; + } +}; +/**/ + +})(); + + +/* +--- + +name: Element.Style + +description: Contains methods for interacting with the styles of Elements in a fashionable way. + +license: MIT-style license. + +requires: Element + +provides: Element.Style + +... +*/ + +(function(){ + +var html = document.html, el; + +// +// Check for oldIE, which does not remove styles when they're set to null +el = document.createElement('div'); +el.style.color = 'red'; +el.style.color = null; +var doesNotRemoveStyles = el.style.color == 'red'; + +// check for oldIE, which returns border* shorthand styles in the wrong order (color-width-style instead of width-style-color) +var border = '1px solid #123abc'; +el.style.border = border; +var returnsBordersInWrongOrder = el.style.border != border; +el = null; +// + +var hasGetComputedStyle = !!window.getComputedStyle; + +Element.Properties.styles = {set: function(styles){ + this.setStyles(styles); +}}; + +var hasOpacity = (html.style.opacity != null), + hasFilter = (html.style.filter != null), + reAlpha = /alpha\(opacity=([\d.]+)\)/i; + +var setVisibility = function(element, opacity){ + element.store('$opacity', opacity); + element.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden'; +}; + +// +var setFilter = function(element, regexp, value){ + var style = element.style, + filter = style.filter || element.getComputedStyle('filter') || ''; + style.filter = (regexp.test(filter) ? filter.replace(regexp, value) : filter + ' ' + value).trim(); + if (!style.filter) style.removeAttribute('filter'); +}; +// + +var setOpacity = (hasOpacity ? function(element, opacity){ + element.style.opacity = opacity; +} : (hasFilter ? function(element, opacity){ + if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1; + if (opacity == null || opacity == 1){ + setFilter(element, reAlpha, ''); + if (opacity == 1 && getOpacity(element) != 1) setFilter(element, reAlpha, 'alpha(opacity=100)'); + } else { + setFilter(element, reAlpha, 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')'); + } +} : setVisibility)); + +var getOpacity = (hasOpacity ? function(element){ + var opacity = element.style.opacity || element.getComputedStyle('opacity'); + return (opacity == '') ? 1 : opacity.toFloat(); +} : (hasFilter ? function(element){ + var filter = (element.style.filter || element.getComputedStyle('filter')), + opacity; + if (filter) opacity = filter.match(reAlpha); + return (opacity == null || filter == null) ? 1 : (opacity[1] / 100); +} : function(element){ + var opacity = element.retrieve('$opacity'); + if (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1); + return opacity; +})); + +var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat', + namedPositions = {left: '0%', top: '0%', center: '50%', right: '100%', bottom: '100%'}, + hasBackgroundPositionXY = (html.style.backgroundPositionX != null); + +// +var removeStyle = function(style, property){ + if (property == 'backgroundPosition'){ + style.removeAttribute(property + 'X'); + property += 'Y'; + } + style.removeAttribute(property); +}; +// + +Element.implement({ + + getComputedStyle: function(property){ + if (!hasGetComputedStyle && this.currentStyle) return this.currentStyle[property.camelCase()]; + var defaultView = Element.getDocument(this).defaultView, + computed = defaultView ? defaultView.getComputedStyle(this, null) : null; + return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : ''; + }, + + setStyle: function(property, value){ + if (property == 'opacity'){ + if (value != null) value = parseFloat(value); + setOpacity(this, value); + return this; + } + property = (property == 'float' ? floatName : property).camelCase(); + if (typeOf(value) != 'string'){ + var map = (Element.Styles[property] || '@').split(' '); + value = Array.from(value).map(function(val, i){ + if (!map[i]) return ''; + return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; + }).join(' '); + } else if (value == String(Number(value))){ + value = Math.round(value); + } + this.style[property] = value; + // + if ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){ + removeStyle(this.style, property); + } + // + return this; + }, + + getStyle: function(property){ + if (property == 'opacity') return getOpacity(this); + property = (property == 'float' ? floatName : property).camelCase(); + var result = this.style[property]; + if (!result || property == 'zIndex'){ + if (Element.ShortStyles.hasOwnProperty(property)){ + result = []; + for (var s in Element.ShortStyles[property]) result.push(this.getStyle(s)); + return result.join(' '); + } + result = this.getComputedStyle(property); + } + if (hasBackgroundPositionXY && /^backgroundPosition[XY]?$/.test(property)){ + return result.replace(/(top|right|bottom|left)/g, function(position){ + return namedPositions[position]; + }) || '0px'; + } + if (!result && property == 'backgroundPosition') return '0px 0px'; + if (result){ + result = String(result); + var color = result.match(/rgba?\([\d\s,]+\)/); + if (color) result = result.replace(color[0], color[0].rgbToHex()); + } + if (!hasGetComputedStyle && !this.style[property]){ + if ((/^(height|width)$/).test(property) && !(/px$/.test(result))){ + var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; + values.each(function(value){ + size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); + }, this); + return this['offset' + property.capitalize()] - size + 'px'; + } + if ((/^border(.+)Width|margin|padding/).test(property) && isNaN(parseFloat(result))){ + return '0px'; + } + } + // + if (returnsBordersInWrongOrder && /^border(Top|Right|Bottom|Left)?$/.test(property) && /^#/.test(result)){ + return result.replace(/^(.+)\s(.+)\s(.+)$/, '$2 $3 $1'); + } + // + return result; + }, + + setStyles: function(styles){ + for (var style in styles) this.setStyle(style, styles[style]); + return this; + }, + + getStyles: function(){ + var result = {}; + Array.flatten(arguments).each(function(key){ + result[key] = this.getStyle(key); + }, this); + return result; + } + +}); + +Element.Styles = { + left: '@px', top: '@px', bottom: '@px', right: '@px', + width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px', + backgroundColor: 'rgb(@, @, @)', backgroundSize: '@px', backgroundPosition: '@px @px', color: 'rgb(@, @, @)', + fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)', + margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)', + borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)', + zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@' +}; + + + + + +Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; + +['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ + var Short = Element.ShortStyles; + var All = Element.Styles; + ['margin', 'padding'].each(function(style){ + var sd = style + direction; + Short[style][sd] = All[sd] = '@px'; + }); + var bd = 'border' + direction; + Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; + var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; + Short[bd] = {}; + Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; + Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; + Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; +}); + +if (hasBackgroundPositionXY) Element.ShortStyles.backgroundPosition = {backgroundPositionX: '@', backgroundPositionY: '@'}; +})(); + + +/* +--- + +name: Element.Event + +description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary. + +license: MIT-style license. + +requires: [Element, Event] + +provides: Element.Event + +... +*/ + +(function(){ + +Element.Properties.events = {set: function(events){ + this.addEvents(events); +}}; + +[Element, Window, Document].invoke('implement', { + + addEvent: function(type, fn){ + var events = this.retrieve('events', {}); + if (!events[type]) events[type] = {keys: [], values: []}; + if (events[type].keys.contains(fn)) return this; + events[type].keys.push(fn); + var realType = type, + custom = Element.Events[type], + condition = fn, + self = this; + if (custom){ + if (custom.onAdd) custom.onAdd.call(this, fn, type); + if (custom.condition){ + condition = function(event){ + if (custom.condition.call(this, event, type)) return fn.call(this, event); + return true; + }; + } + if (custom.base) realType = Function.from(custom.base).call(this, type); + } + var defn = function(){ + return fn.call(self); + }; + var nativeEvent = Element.NativeEvents[realType]; + if (nativeEvent){ + if (nativeEvent == 2){ + defn = function(event){ + event = new DOMEvent(event, self.getWindow()); + if (condition.call(self, event) === false) event.stop(); + }; + } + this.addListener(realType, defn, arguments[2]); + } + events[type].values.push(defn); + return this; + }, + + removeEvent: function(type, fn){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + var list = events[type]; + var index = list.keys.indexOf(fn); + if (index == -1) return this; + var value = list.values[index]; + delete list.keys[index]; + delete list.values[index]; + var custom = Element.Events[type]; + if (custom){ + if (custom.onRemove) custom.onRemove.call(this, fn, type); + if (custom.base) type = Function.from(custom.base).call(this, type); + } + return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this; + }, + + addEvents: function(events){ + for (var event in events) this.addEvent(event, events[event]); + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + var attached = this.retrieve('events'); + if (!attached) return this; + if (!events){ + for (type in attached) this.removeEvents(type); + this.eliminate('events'); + } else if (attached[events]){ + attached[events].keys.each(function(fn){ + this.removeEvent(events, fn); + }, this); + delete attached[events]; + } + return this; + }, + + fireEvent: function(type, args, delay){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + args = Array.from(args); + + events[type].keys.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + cloneEvents: function(from, type){ + from = document.id(from); + var events = from.retrieve('events'); + if (!events) return this; + if (!type){ + for (var eventType in events) this.cloneEvents(from, eventType); + } else if (events[type]){ + events[type].keys.each(function(fn){ + this.addEvent(type, fn); + }, this); + } + return this; + } + +}); + +Element.NativeEvents = { + click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons + mousewheel: 2, DOMMouseScroll: 2, //mouse wheel + mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement + keydown: 2, keypress: 2, keyup: 2, //keyboard + orientationchange: 2, // mobile + touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch + gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture + focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements + load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window + hashchange: 1, popstate: 2, // history + error: 1, abort: 1, scroll: 1 //misc +}; + +Element.Events = { + mousewheel: { + base: 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll' + } +}; + +var check = function(event){ + var related = event.relatedTarget; + if (related == null) return true; + if (!related) return false; + return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related)); +}; + +if ('onmouseenter' in document.documentElement){ + Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2; + Element.MouseenterCheck = check; +} else { + Element.Events.mouseenter = { + base: 'mouseover', + condition: check + }; + + Element.Events.mouseleave = { + base: 'mouseout', + condition: check + }; +} + +/**/ +if (!window.addEventListener){ + Element.NativeEvents.propertychange = 2; + Element.Events.change = { + base: function(){ + var type = this.type; + return (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change'; + }, + condition: function(event){ + return event.type != 'propertychange' || event.event.propertyName == 'checked'; + } + }; +} +/**/ + + + +})(); + + +/* +--- + +name: Element.Delegation + +description: Extends the Element native object to include the delegate method for more efficient event management. + +license: MIT-style license. + +requires: [Element.Event] + +provides: [Element.Delegation] + +... +*/ + +(function(){ + +var eventListenerSupport = !!window.addEventListener; + +Element.NativeEvents.focusin = Element.NativeEvents.focusout = 2; + +var bubbleUp = function(self, match, fn, event, target){ + while (target && target != self){ + if (match(target, event)) return fn.call(target, event, target); + target = document.id(target.parentNode); + } +}; + +var map = { + mouseenter: { + base: 'mouseover', + condition: Element.MouseenterCheck + }, + mouseleave: { + base: 'mouseout', + condition: Element.MouseenterCheck + }, + focus: { + base: 'focus' + (eventListenerSupport ? '' : 'in'), + capture: true + }, + blur: { + base: eventListenerSupport ? 'blur' : 'focusout', + capture: true + } +}; + +/**/ +var _key = '$delegation:'; +var formObserver = function(type){ + + return { + + base: 'focusin', + + remove: function(self, uid){ + var list = self.retrieve(_key + type + 'listeners', {})[uid]; + if (list && list.forms) for (var i = list.forms.length; i--;){ + list.forms[i].removeEvent(type, list.fns[i]); + } + }, + + listen: function(self, match, fn, event, target, uid){ + var form = (target.get('tag') == 'form') ? target : event.target.getParent('form'); + if (!form) return; + + var listeners = self.retrieve(_key + type + 'listeners', {}), + listener = listeners[uid] || {forms: [], fns: []}, + forms = listener.forms, fns = listener.fns; + + if (forms.indexOf(form) != -1) return; + forms.push(form); + + var _fn = function(event){ + bubbleUp(self, match, fn, event, target); + }; + form.addEvent(type, _fn); + fns.push(_fn); + + listeners[uid] = listener; + self.store(_key + type + 'listeners', listeners); + } + }; +}; + +var inputObserver = function(type){ + return { + base: 'focusin', + listen: function(self, match, fn, event, target){ + var events = {blur: function(){ + this.removeEvents(events); + }}; + events[type] = function(event){ + bubbleUp(self, match, fn, event, target); + }; + event.target.addEvents(events); + } + }; +}; + +if (!eventListenerSupport) Object.append(map, { + submit: formObserver('submit'), + reset: formObserver('reset'), + change: inputObserver('change'), + select: inputObserver('select') +}); +/**/ + +var proto = Element.prototype, + addEvent = proto.addEvent, + removeEvent = proto.removeEvent; + +var relay = function(old, method){ + return function(type, fn, useCapture){ + if (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture); + var parsed = Slick.parse(type).expressions[0][0]; + if (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture); + var newType = parsed.tag; + parsed.pseudos.slice(1).each(function(pseudo){ + newType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : ''); + }); + old.call(this, type, fn); + return method.call(this, newType, parsed.pseudos[0].value, fn); + }; +}; + +var delegation = { + + addEvent: function(type, match, fn){ + var storage = this.retrieve('$delegates', {}), stored = storage[type]; + if (stored) for (var _uid in stored){ + if (stored[_uid].fn == fn && stored[_uid].match == match) return this; + } + + var _type = type, _match = match, _fn = fn, _map = map[type] || {}; + type = _map.base || _type; + + match = function(target){ + return Slick.match(target, _match); + }; + + var elementEvent = Element.Events[_type]; + if (_map.condition || elementEvent && elementEvent.condition){ + var __match = match, condition = _map.condition || elementEvent.condition; + match = function(target, event){ + return __match(target, event) && condition.call(target, event, type); + }; + } + + var self = this, uid = String.uniqueID(); + var delegator = _map.listen ? function(event, target){ + if (!target && event && event.target) target = event.target; + if (target) _map.listen(self, match, fn, event, target, uid); + } : function(event, target){ + if (!target && event && event.target) target = event.target; + if (target) bubbleUp(self, match, fn, event, target); + }; + + if (!stored) stored = {}; + stored[uid] = { + match: _match, + fn: _fn, + delegator: delegator + }; + storage[_type] = stored; + return addEvent.call(this, type, delegator, _map.capture); + }, + + removeEvent: function(type, match, fn, _uid){ + var storage = this.retrieve('$delegates', {}), stored = storage[type]; + if (!stored) return this; + + if (_uid){ + var _type = type, delegator = stored[_uid].delegator, _map = map[type] || {}; + type = _map.base || _type; + if (_map.remove) _map.remove(this, _uid); + delete stored[_uid]; + storage[_type] = stored; + return removeEvent.call(this, type, delegator, _map.capture); + } + + var __uid, s; + if (fn) for (__uid in stored){ + s = stored[__uid]; + if (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid); + } else for (__uid in stored){ + s = stored[__uid]; + if (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid); + } + return this; + } + +}; + +[Element, Window, Document].invoke('implement', { + addEvent: relay(addEvent, delegation.addEvent), + removeEvent: relay(removeEvent, delegation.removeEvent) +}); + +})(); + + +/* +--- + +name: Element.Dimensions + +description: Contains methods to work with size, scroll, or positioning of Elements and the window object. + +license: MIT-style license. + +credits: + - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). + - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). + +requires: [Element, Element.Style] + +provides: [Element.Dimensions] + +... +*/ + +(function(){ + +var element = document.createElement('div'), + child = document.createElement('div'); +element.style.height = '0'; +element.appendChild(child); +var brokenOffsetParent = (child.offsetParent === element); +element = child = null; + +var isOffset = function(el){ + return styleString(el, 'position') != 'static' || isBody(el); +}; + +var isOffsetStatic = function(el){ + return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName); +}; + +Element.implement({ + + scrollTo: function(x, y){ + if (isBody(this)){ + this.getWindow().scrollTo(x, y); + } else { + this.scrollLeft = x; + this.scrollTop = y; + } + return this; + }, + + getSize: function(){ + if (isBody(this)) return this.getWindow().getSize(); + return {x: this.offsetWidth, y: this.offsetHeight}; + }, + + getScrollSize: function(){ + if (isBody(this)) return this.getWindow().getScrollSize(); + return {x: this.scrollWidth, y: this.scrollHeight}; + }, + + getScroll: function(){ + if (isBody(this)) return this.getWindow().getScroll(); + return {x: this.scrollLeft, y: this.scrollTop}; + }, + + getScrolls: function(){ + var element = this.parentNode, position = {x: 0, y: 0}; + while (element && !isBody(element)){ + position.x += element.scrollLeft; + position.y += element.scrollTop; + element = element.parentNode; + } + return position; + }, + + getOffsetParent: brokenOffsetParent ? function(){ + var element = this; + if (isBody(element) || styleString(element, 'position') == 'fixed') return null; + + var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset; + while ((element = element.parentNode)){ + if (isOffsetCheck(element)) return element; + } + return null; + } : function(){ + var element = this; + if (isBody(element) || styleString(element, 'position') == 'fixed') return null; + + try { + return element.offsetParent; + } catch(e) {} + return null; + }, + + getOffsets: function(){ + var hasGetBoundingClientRect = this.getBoundingClientRect; + + if (hasGetBoundingClientRect){ + var bound = this.getBoundingClientRect(), + html = document.id(this.getDocument().documentElement), + htmlScroll = html.getScroll(), + elemScrolls = this.getScrolls(), + isFixed = (styleString(this, 'position') == 'fixed'); + + return { + x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, + y: bound.top.toInt() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop + }; + } + + var element = this, position = {x: 0, y: 0}; + if (isBody(this)) return position; + + while (element && !isBody(element)){ + position.x += element.offsetLeft; + position.y += element.offsetTop; + + element = element.offsetParent; + } + + return position; + }, + + getPosition: function(relative){ + var offset = this.getOffsets(), + scroll = this.getScrolls(); + var position = { + x: offset.x - scroll.x, + y: offset.y - scroll.y + }; + + if (relative && (relative = document.id(relative))){ + var relativePosition = relative.getPosition(); + return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)}; + } + return position; + }, + + getCoordinates: function(element){ + if (isBody(this)) return this.getWindow().getCoordinates(); + var position = this.getPosition(element), + size = this.getSize(); + var obj = { + left: position.x, + top: position.y, + width: size.x, + height: size.y + }; + obj.right = obj.left + obj.width; + obj.bottom = obj.top + obj.height; + return obj; + }, + + computePosition: function(obj){ + return { + left: obj.x - styleNumber(this, 'margin-left'), + top: obj.y - styleNumber(this, 'margin-top') + }; + }, + + setPosition: function(obj){ + return this.setStyles(this.computePosition(obj)); + } + +}); + + +[Document, Window].invoke('implement', { + + getSize: function(){ + var doc = getCompatElement(this); + return {x: doc.clientWidth, y: doc.clientHeight}; + }, + + getScroll: function(){ + var win = this.getWindow(), doc = getCompatElement(this); + return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; + }, + + getScrollSize: function(){ + var doc = getCompatElement(this), + min = this.getSize(), + body = this.getDocument().body; + + return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)}; + }, + + getPosition: function(){ + return {x: 0, y: 0}; + }, + + getCoordinates: function(){ + var size = this.getSize(); + return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; + } + +}); + +// private methods + +var styleString = Element.getComputedStyle; + +function styleNumber(element, style){ + return styleString(element, style).toInt() || 0; +} + +function borderBox(element){ + return styleString(element, '-moz-box-sizing') == 'border-box'; +} + +function topBorder(element){ + return styleNumber(element, 'border-top-width'); +} + +function leftBorder(element){ + return styleNumber(element, 'border-left-width'); +} + +function isBody(element){ + return (/^(?:body|html)$/i).test(element.tagName); +} + +function getCompatElement(element){ + var doc = element.getDocument(); + return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; +} + +})(); + +//aliases +Element.alias({position: 'setPosition'}); //compatability + +[Window, Document, Element].invoke('implement', { + + getHeight: function(){ + return this.getSize().y; + }, + + getWidth: function(){ + return this.getSize().x; + }, + + getScrollTop: function(){ + return this.getScroll().y; + }, + + getScrollLeft: function(){ + return this.getScroll().x; + }, + + getScrollHeight: function(){ + return this.getScrollSize().y; + }, + + getScrollWidth: function(){ + return this.getScrollSize().x; + }, + + getTop: function(){ + return this.getPosition().y; + }, + + getLeft: function(){ + return this.getPosition().x; + } + +}); + + +/* +--- + +name: Fx + +description: Contains the basic animation logic to be extended by all other Fx Classes. + +license: MIT-style license. + +requires: [Chain, Events, Options] + +provides: Fx + +... +*/ + +(function(){ + +var Fx = this.Fx = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onStart: nil, + onCancel: nil, + onComplete: nil, + */ + fps: 60, + unit: false, + duration: 500, + frames: null, + frameSkip: true, + link: 'ignore' + }, + + initialize: function(options){ + this.subject = this.subject || this; + this.setOptions(options); + }, + + getTransition: function(){ + return function(p){ + return -(Math.cos(Math.PI * p) - 1) / 2; + }; + }, + + step: function(now){ + if (this.options.frameSkip){ + var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval; + this.time = now; + this.frame += frames; + } else { + this.frame++; + } + + if (this.frame < this.frames){ + var delta = this.transition(this.frame / this.frames); + this.set(this.compute(this.from, this.to, delta)); + } else { + this.frame = this.frames; + this.set(this.compute(this.from, this.to, 1)); + this.stop(); + } + }, + + set: function(now){ + return now; + }, + + compute: function(from, to, delta){ + return Fx.compute(from, to, delta); + }, + + check: function(){ + if (!this.isRunning()) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + start: function(from, to){ + if (!this.check(from, to)) return this; + this.from = from; + this.to = to; + this.frame = (this.options.frameSkip) ? 0 : -1; + this.time = null; + this.transition = this.getTransition(); + var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration; + this.duration = Fx.Durations[duration] || duration.toInt(); + this.frameInterval = 1000 / fps; + this.frames = frames || Math.round(this.duration / this.frameInterval); + this.fireEvent('start', this.subject); + pushInstance.call(this, fps); + return this; + }, + + stop: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + if (this.frames == this.frame){ + this.fireEvent('complete', this.subject); + if (!this.callChain()) this.fireEvent('chainComplete', this.subject); + } else { + this.fireEvent('stop', this.subject); + } + } + return this; + }, + + cancel: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + this.frame = this.frames; + this.fireEvent('cancel', this.subject).clearChain(); + } + return this; + }, + + pause: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + } + return this; + }, + + resume: function(){ + if (this.isPaused()) pushInstance.call(this, this.options.fps); + return this; + }, + + isRunning: function(){ + var list = instances[this.options.fps]; + return list && list.contains(this); + }, + + isPaused: function(){ + return (this.frame < this.frames) && !this.isRunning(); + } + +}); + +Fx.compute = function(from, to, delta){ + return (to - from) * delta + from; +}; + +Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; + +// global timers + +var instances = {}, timers = {}; + +var loop = function(){ + var now = Date.now(); + for (var i = this.length; i--;){ + var instance = this[i]; + if (instance) instance.step(now); + } +}; + +var pushInstance = function(fps){ + var list = instances[fps] || (instances[fps] = []); + list.push(this); + if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list); +}; + +var pullInstance = function(fps){ + var list = instances[fps]; + if (list){ + list.erase(this); + if (!list.length && timers[fps]){ + delete instances[fps]; + timers[fps] = clearInterval(timers[fps]); + } + } +}; + +})(); + + +/* +--- + +name: Fx.CSS + +description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. + +license: MIT-style license. + +requires: [Fx, Element.Style] + +provides: Fx.CSS + +... +*/ + +Fx.CSS = new Class({ + + Extends: Fx, + + //prepares the base from/to object + + prepare: function(element, property, values){ + values = Array.from(values); + var from = values[0], to = values[1]; + if (to == null){ + to = from; + from = element.getStyle(property); + var unit = this.options.unit; + // adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299 + if (unit && from && typeof from == 'string' && from.slice(-unit.length) != unit && parseFloat(from) != 0){ + element.setStyle(property, to + unit); + var value = element.getComputedStyle(property); + // IE and Opera support pixelLeft or pixelWidth + if (!(/px$/.test(value))){ + value = element.style[('pixel-' + property).camelCase()]; + if (value == null){ + // adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + var left = element.style.left; + element.style.left = to + unit; + value = element.style.pixelLeft; + element.style.left = left; + } + } + from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0); + element.setStyle(property, from + unit); + } + } + return {from: this.parse(from), to: this.parse(to)}; + }, + + //parses a value into an array + + parse: function(value){ + value = Function.from(value)(); + value = (typeof value == 'string') ? value.split(' ') : Array.from(value); + return value.map(function(val){ + val = String(val); + var found = false; + Object.each(Fx.CSS.Parsers, function(parser, key){ + if (found) return; + var parsed = parser.parse(val); + if (parsed || parsed === 0) found = {value: parsed, parser: parser}; + }); + found = found || {value: val, parser: Fx.CSS.Parsers.String}; + return found; + }); + }, + + //computes by a from and to prepared objects, using their parsers. + + compute: function(from, to, delta){ + var computed = []; + (Math.min(from.length, to.length)).times(function(i){ + computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); + }); + computed.$family = Function.from('fx:css:value'); + return computed; + }, + + //serves the value as settable + + serve: function(value, unit){ + if (typeOf(value) != 'fx:css:value') value = this.parse(value); + var returned = []; + value.each(function(bit){ + returned = returned.concat(bit.parser.serve(bit.value, unit)); + }); + return returned; + }, + + //renders the change to an element + + render: function(element, property, value, unit){ + element.setStyle(property, this.serve(value, unit)); + }, + + //searches inside the page css to find the values for a selector + + search: function(selector){ + if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; + var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$'); + + var searchStyles = function(rules){ + Array.each(rules, function(rule, i){ + if (rule.media){ + searchStyles(rule.rules || rule.cssRules); + return; + } + if (!rule.style) return; + var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ + return m.toLowerCase(); + }) : null; + if (!selectorText || !selectorTest.test(selectorText)) return; + Object.each(Element.Styles, function(value, style){ + if (!rule.style[style] || Element.ShortStyles[style]) return; + value = String(rule.style[style]); + to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value; + }); + }); + }; + + Array.each(document.styleSheets, function(sheet, j){ + var href = sheet.href; + if (href && href.indexOf('://') > -1 && href.indexOf(document.domain) == -1) return; + var rules = sheet.rules || sheet.cssRules; + searchStyles(rules); + }); + return Fx.CSS.Cache[selector] = to; + } + +}); + +Fx.CSS.Cache = {}; + +Fx.CSS.Parsers = { + + Color: { + parse: function(value){ + if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); + return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; + }, + compute: function(from, to, delta){ + return from.map(function(value, i){ + return Math.round(Fx.compute(from[i], to[i], delta)); + }); + }, + serve: function(value){ + return value.map(Number); + } + }, + + Number: { + parse: parseFloat, + compute: Fx.compute, + serve: function(value, unit){ + return (unit) ? value + unit : value; + } + }, + + String: { + parse: Function.from(false), + compute: function(zero, one){ + return one; + }, + serve: function(zero){ + return zero; + } + } + +}; + + + + +/* +--- + +name: Fx.Tween + +description: Formerly Fx.Style, effect to transition any CSS property for an element. + +license: MIT-style license. + +requires: Fx.CSS + +provides: [Fx.Tween, Element.fade, Element.highlight] + +... +*/ + +Fx.Tween = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(property, now){ + if (arguments.length == 1){ + now = property; + property = this.property || this.options.property; + } + this.render(this.element, property, now, this.options.unit); + return this; + }, + + start: function(property, from, to){ + if (!this.check(property, from, to)) return this; + var args = Array.flatten(arguments); + this.property = this.options.property || args.shift(); + var parsed = this.prepare(this.element, this.property, args); + return this.parent(parsed.from, parsed.to); + } + +}); + +Element.Properties.tween = { + + set: function(options){ + this.get('tween').cancel().setOptions(options); + return this; + }, + + get: function(){ + var tween = this.retrieve('tween'); + if (!tween){ + tween = new Fx.Tween(this, {link: 'cancel'}); + this.store('tween', tween); + } + return tween; + } + +}; + +Element.implement({ + + tween: function(property, from, to){ + this.get('tween').start(property, from, to); + return this; + }, + + fade: function(how){ + var fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle; + if (args[1] == null) args[1] = 'toggle'; + switch (args[1]){ + case 'in': method = 'start'; args[1] = 1; break; + case 'out': method = 'start'; args[1] = 0; break; + case 'show': method = 'set'; args[1] = 1; break; + case 'hide': method = 'set'; args[1] = 0; break; + case 'toggle': + var flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1); + method = 'start'; + args[1] = flag ? 0 : 1; + this.store('fade:flag', !flag); + toggle = true; + break; + default: method = 'start'; + } + if (!toggle) this.eliminate('fade:flag'); + fade[method].apply(fade, args); + var to = args[args.length - 1]; + if (method == 'set' || to != 0) this.setStyle('visibility', to == 0 ? 'hidden' : 'visible'); + else fade.chain(function(){ + this.element.setStyle('visibility', 'hidden'); + this.callChain(); + }); + return this; + }, + + highlight: function(start, end){ + if (!end){ + end = this.retrieve('highlight:original', this.getStyle('background-color')); + end = (end == 'transparent') ? '#fff' : end; + } + var tween = this.get('tween'); + tween.start('background-color', start || '#ffff88', end).chain(function(){ + this.setStyle('background-color', this.retrieve('highlight:original')); + tween.callChain(); + }.bind(this)); + return this; + } + +}); + + +/* +--- + +name: Fx.Morph + +description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules. + +license: MIT-style license. + +requires: Fx.CSS + +provides: Fx.Morph + +... +*/ + +Fx.Morph = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(now){ + if (typeof now == 'string') now = this.search(now); + for (var p in now) this.render(this.element, p, now[p], this.options.unit); + return this; + }, + + compute: function(from, to, delta){ + var now = {}; + for (var p in from) now[p] = this.parent(from[p], to[p], delta); + return now; + }, + + start: function(properties){ + if (!this.check(properties)) return this; + if (typeof properties == 'string') properties = this.search(properties); + var from = {}, to = {}; + for (var p in properties){ + var parsed = this.prepare(this.element, p, properties[p]); + from[p] = parsed.from; + to[p] = parsed.to; + } + return this.parent(from, to); + } + +}); + +Element.Properties.morph = { + + set: function(options){ + this.get('morph').cancel().setOptions(options); + return this; + }, + + get: function(){ + var morph = this.retrieve('morph'); + if (!morph){ + morph = new Fx.Morph(this, {link: 'cancel'}); + this.store('morph', morph); + } + return morph; + } + +}; + +Element.implement({ + + morph: function(props){ + this.get('morph').start(props); + return this; + } + +}); + + +/* +--- + +name: Fx.Transitions + +description: Contains a set of advanced transitions to be used with any of the Fx Classes. + +license: MIT-style license. + +credits: + - Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. + +requires: Fx + +provides: Fx.Transitions + +... +*/ + +Fx.implement({ + + getTransition: function(){ + var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; + if (typeof trans == 'string'){ + var data = trans.split(':'); + trans = Fx.Transitions; + trans = trans[data[0]] || trans[data[0].capitalize()]; + if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; + } + return trans; + } + +}); + +Fx.Transition = function(transition, params){ + params = Array.from(params); + var easeIn = function(pos){ + return transition(pos, params); + }; + return Object.append(easeIn, { + easeIn: easeIn, + easeOut: function(pos){ + return 1 - transition(1 - pos, params); + }, + easeInOut: function(pos){ + return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2; + } + }); +}; + +Fx.Transitions = { + + linear: function(zero){ + return zero; + } + +}; + + + +Fx.Transitions.extend = function(transitions){ + for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); +}; + +Fx.Transitions.extend({ + + Pow: function(p, x){ + return Math.pow(p, x && x[0] || 6); + }, + + Expo: function(p){ + return Math.pow(2, 8 * (p - 1)); + }, + + Circ: function(p){ + return 1 - Math.sin(Math.acos(p)); + }, + + Sine: function(p){ + return 1 - Math.cos(p * Math.PI / 2); + }, + + Back: function(p, x){ + x = x && x[0] || 1.618; + return Math.pow(p, 2) * ((x + 1) * p - x); + }, + + Bounce: function(p){ + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2){ + if (p >= (7 - 4 * a) / 11){ + value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + Elastic: function(p, x){ + return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3); + } + +}); + +['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ + Fx.Transitions[transition] = new Fx.Transition(function(p){ + return Math.pow(p, i + 2); + }); +}); + + +/* +--- + +name: Request + +description: Powerful all purpose Request Class. Uses XMLHTTPRequest. + +license: MIT-style license. + +requires: [Object, Element, Chain, Events, Options, Browser] + +provides: Request + +... +*/ + +(function(){ + +var empty = function(){}, + progressSupport = ('onprogress' in new Browser.Request); + +var Request = this.Request = new Class({ + + Implements: [Chain, Events, Options], + + options: {/* + onRequest: function(){}, + onLoadstart: function(event, xhr){}, + onProgress: function(event, xhr){}, + onComplete: function(){}, + onCancel: function(){}, + onSuccess: function(responseText, responseXML){}, + onFailure: function(xhr){}, + onException: function(headerName, value){}, + onTimeout: function(){}, + user: '', + password: '',*/ + url: '', + data: '', + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }, + async: true, + format: false, + method: 'post', + link: 'ignore', + isSuccess: null, + emulation: true, + urlEncoded: true, + encoding: 'utf-8', + evalScripts: false, + evalResponse: false, + timeout: 0, + noCache: false + }, + + initialize: function(options){ + this.xhr = new Browser.Request(); + this.setOptions(options); + this.headers = this.options.headers; + }, + + onStateChange: function(){ + var xhr = this.xhr; + if (xhr.readyState != 4 || !this.running) return; + this.running = false; + this.status = 0; + Function.attempt(function(){ + var status = xhr.status; + this.status = (status == 1223) ? 204 : status; + }.bind(this)); + xhr.onreadystatechange = empty; + if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; + clearTimeout(this.timer); + + this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML}; + if (this.options.isSuccess.call(this, this.status)) + this.success(this.response.text, this.response.xml); + else + this.failure(); + }, + + isSuccess: function(){ + var status = this.status; + return (status >= 200 && status < 300); + }, + + isRunning: function(){ + return !!this.running; + }, + + processScripts: function(text){ + if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text); + return text.stripScripts(this.options.evalScripts); + }, + + success: function(text, xml){ + this.onSuccess(this.processScripts(text), xml); + }, + + onSuccess: function(){ + this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); + }, + + failure: function(){ + this.onFailure(); + }, + + onFailure: function(){ + this.fireEvent('complete').fireEvent('failure', this.xhr); + }, + + loadstart: function(event){ + this.fireEvent('loadstart', [event, this.xhr]); + }, + + progress: function(event){ + this.fireEvent('progress', [event, this.xhr]); + }, + + timeout: function(){ + this.fireEvent('timeout', this.xhr); + }, + + setHeader: function(name, value){ + this.headers[name] = value; + return this; + }, + + getHeader: function(name){ + return Function.attempt(function(){ + return this.xhr.getResponseHeader(name); + }.bind(this)); + }, + + check: function(){ + if (!this.running) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + send: function(options){ + if (!this.check(options)) return this; + + this.options.isSuccess = this.options.isSuccess || this.isSuccess; + this.running = true; + + var type = typeOf(options); + if (type == 'string' || type == 'element') options = {data: options}; + + var old = this.options; + options = Object.append({data: old.data, url: old.url, method: old.method}, options); + var data = options.data, url = String(options.url), method = options.method.toLowerCase(); + + switch (typeOf(data)){ + case 'element': data = document.id(data).toQueryString(); break; + case 'object': case 'hash': data = Object.toQueryString(data); + } + + if (this.options.format){ + var format = 'format=' + this.options.format; + data = (data) ? format + '&' + data : format; + } + + if (this.options.emulation && !['get', 'post'].contains(method)){ + var _method = '_method=' + method; + data = (data) ? _method + '&' + data : _method; + method = 'post'; + } + + if (this.options.urlEncoded && ['post', 'put'].contains(method)){ + var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; + this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding; + } + + if (!url) url = document.location.pathname; + + var trimPosition = url.lastIndexOf('/'); + if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition); + + if (this.options.noCache) + url += (url.indexOf('?') > -1 ? '&' : '?') + String.uniqueID(); + + if (data && (method == 'get' || method == 'delete')){ + url += (url.indexOf('?') > -1 ? '&' : '?') + data; + data = null; + } + + var xhr = this.xhr; + if (progressSupport){ + xhr.onloadstart = this.loadstart.bind(this); + xhr.onprogress = this.progress.bind(this); + } + + xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password); + if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true; + + xhr.onreadystatechange = this.onStateChange.bind(this); + + Object.each(this.headers, function(value, key){ + try { + xhr.setRequestHeader(key, value); + } catch (e){ + this.fireEvent('exception', [key, value]); + } + }, this); + + this.fireEvent('request'); + xhr.send(data); + if (!this.options.async) this.onStateChange(); + else if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this); + return this; + }, + + cancel: function(){ + if (!this.running) return this; + this.running = false; + var xhr = this.xhr; + xhr.abort(); + clearTimeout(this.timer); + xhr.onreadystatechange = empty; + if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; + this.xhr = new Browser.Request(); + this.fireEvent('cancel'); + return this; + } + +}); + +var methods = {}; +['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ + methods[method] = function(data){ + var object = { + method: method + }; + if (data != null) object.data = data; + return this.send(object); + }; +}); + +Request.implement(methods); + +Element.Properties.send = { + + set: function(options){ + var send = this.get('send').cancel(); + send.setOptions(options); + return this; + }, + + get: function(){ + var send = this.retrieve('send'); + if (!send){ + send = new Request({ + data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') + }); + this.store('send', send); + } + return send; + } + +}; + +Element.implement({ + + send: function(url){ + var sender = this.get('send'); + sender.send({data: this, url: url || sender.options.url}); + return this; + } + +}); + +})(); + + +/* +--- + +name: Request.HTML + +description: Extends the basic Request Class with additional methods for interacting with HTML responses. + +license: MIT-style license. + +requires: [Element, Request] + +provides: Request.HTML + +... +*/ + +Request.HTML = new Class({ + + Extends: Request, + + options: { + update: false, + append: false, + evalScripts: true, + filter: false, + headers: { + Accept: 'text/html, application/xml, text/xml, */*' + } + }, + + success: function(text){ + var options = this.options, response = this.response; + + response.html = text.stripScripts(function(script){ + response.javascript = script; + }); + + var match = response.html.match(/]*>([\s\S]*?)<\/body>/i); + if (match) response.html = match[1]; + var temp = new Element('div').set('html', response.html); + + response.tree = temp.childNodes; + response.elements = temp.getElements(options.filter || '*'); + + if (options.filter) response.tree = response.elements; + if (options.update){ + var update = document.id(options.update).empty(); + if (options.filter) update.adopt(response.elements); + else update.set('html', response.html); + } else if (options.append){ + var append = document.id(options.append); + if (options.filter) response.elements.reverse().inject(append); + else append.adopt(temp.getChildren()); + } + if (options.evalScripts) Browser.exec(response.javascript); + + this.onSuccess(response.tree, response.elements, response.html, response.javascript); + } + +}); + +Element.Properties.load = { + + set: function(options){ + var load = this.get('load').cancel(); + load.setOptions(options); + return this; + }, + + get: function(){ + var load = this.retrieve('load'); + if (!load){ + load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'}); + this.store('load', load); + } + return load; + } + +}; + +Element.implement({ + + load: function(){ + this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString})); + return this; + } + +}); + + +/* +--- + +name: JSON + +description: JSON encoder and decoder. + +license: MIT-style license. + +SeeAlso: + +requires: [Array, String, Number, Function] + +provides: JSON + +... +*/ + +if (typeof JSON == 'undefined') this.JSON = {}; + + + +(function(){ + +var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}; + +var escape = function(chr){ + return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4); +}; + +JSON.validate = function(string){ + string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). + replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). + replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + + return (/^[\],:{}\s]*$/).test(string); +}; + +JSON.encode = JSON.stringify ? function(obj){ + return JSON.stringify(obj); +} : function(obj){ + if (obj && obj.toJSON) obj = obj.toJSON(); + + switch (typeOf(obj)){ + case 'string': + return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"'; + case 'array': + return '[' + obj.map(JSON.encode).clean() + ']'; + case 'object': case 'hash': + var string = []; + Object.each(obj, function(value, key){ + var json = JSON.encode(value); + if (json) string.push(JSON.encode(key) + ':' + json); + }); + return '{' + string + '}'; + case 'number': case 'boolean': return '' + obj; + case 'null': return 'null'; + } + + return null; +}; + +JSON.secure = true; + + +JSON.decode = function(string, secure){ + if (!string || typeOf(string) != 'string') return null; + + if (secure == null) secure = JSON.secure; + if (secure){ + if (JSON.parse) return JSON.parse(string); + if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.'); + } + + return eval('(' + string + ')'); +}; + +})(); + + +/* +--- + +name: Request.JSON + +description: Extends the basic Request Class with additional methods for sending and receiving JSON data. + +license: MIT-style license. + +requires: [Request, JSON] + +provides: Request.JSON + +... +*/ + +Request.JSON = new Class({ + + Extends: Request, + + options: { + /*onError: function(text, error){},*/ + secure: true + }, + + initialize: function(options){ + this.parent(options); + Object.append(this.headers, { + 'Accept': 'application/json', + 'X-Request': 'JSON' + }); + }, + + success: function(text){ + var json; + try { + json = this.response.json = JSON.decode(text, this.options.secure); + } catch (error){ + this.fireEvent('error', [text, error]); + return; + } + if (json == null) this.onFailure(); + else this.onSuccess(json, text); + } + +}); + + +/* +--- + +name: Cookie + +description: Class for creating, reading, and deleting browser Cookies. + +license: MIT-style license. + +credits: + - Based on the functions by Peter-Paul Koch (http://quirksmode.org). + +requires: [Options, Browser] + +provides: Cookie + +... +*/ + +var Cookie = new Class({ + + Implements: Options, + + options: { + path: '/', + domain: false, + duration: false, + secure: false, + document: document, + encode: true + }, + + initialize: function(key, options){ + this.key = key; + this.setOptions(options); + }, + + write: function(value){ + if (this.options.encode) value = encodeURIComponent(value); + if (this.options.domain) value += '; domain=' + this.options.domain; + if (this.options.path) value += '; path=' + this.options.path; + if (this.options.duration){ + var date = new Date(); + date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); + value += '; expires=' + date.toGMTString(); + } + if (this.options.secure) value += '; secure'; + this.options.document.cookie = this.key + '=' + value; + return this; + }, + + read: function(){ + var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); + return (value) ? decodeURIComponent(value[1]) : null; + }, + + dispose: function(){ + new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write(''); + return this; + } + +}); + +Cookie.write = function(key, value, options){ + return new Cookie(key, options).write(value); +}; + +Cookie.read = function(key){ + return new Cookie(key).read(); +}; + +Cookie.dispose = function(key, options){ + return new Cookie(key, options).dispose(); +}; + + +/* +--- + +name: DOMReady + +description: Contains the custom event domready. + +license: MIT-style license. + +requires: [Browser, Element, Element.Event] + +provides: [DOMReady, DomReady] + +... +*/ + +(function(window, document){ + +var ready, + loaded, + checks = [], + shouldPoll, + timer, + testElement = document.createElement('div'); + +var domready = function(){ + clearTimeout(timer); + if (ready) return; + Browser.loaded = ready = true; + document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check); + + document.fireEvent('domready'); + window.fireEvent('domready'); +}; + +var check = function(){ + for (var i = checks.length; i--;) if (checks[i]()){ + domready(); + return true; + } + return false; +}; + +var poll = function(){ + clearTimeout(timer); + if (!check()) timer = setTimeout(poll, 10); +}; + +document.addListener('DOMContentLoaded', domready); + +/**/ +// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/ +// testElement.doScroll() throws when the DOM is not ready, only in the top window +var doScrollWorks = function(){ + try { + testElement.doScroll(); + return true; + } catch (e){} + return false; +}; +// If doScroll works already, it can't be used to determine domready +// e.g. in an iframe +if (testElement.doScroll && !doScrollWorks()){ + checks.push(doScrollWorks); + shouldPoll = true; +} +/**/ + +if (document.readyState) checks.push(function(){ + var state = document.readyState; + return (state == 'loaded' || state == 'complete'); +}); + +if ('onreadystatechange' in document) document.addListener('readystatechange', check); +else shouldPoll = true; + +if (shouldPoll) poll(); + +Element.Events.domready = { + onAdd: function(fn){ + if (ready) fn.call(this); + } +}; + +// Make sure that domready fires before load +Element.Events.load = { + base: 'load', + onAdd: function(fn){ + if (loaded && this == window) fn.call(this); + }, + condition: function(){ + if (this == window){ + domready(); + delete Element.Events.load; + } + return true; + } +}; + +// This is based on the custom load event +window.addEvent('load', function(){ + loaded = true; +}); + +})(window, document); + diff --git a/pyload/webui/themes/flat/js/static/mootools-core.min.js b/pyload/webui/themes/flat/js/static/mootools-core.min.js new file mode 100644 index 000000000..354f94196 --- /dev/null +++ b/pyload/webui/themes/flat/js/static/mootools-core.min.js @@ -0,0 +1,491 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/core/8423c12ffd6a6bfcde9ea22554aec795 + +packager build: + - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady + +copyrights: + - [MooTools](http://mootools.net) + +licenses: + - [MIT License](http://mootools.net/license.txt) +... +*/ + +(function(){this.MooTools={version:"1.5.0",build:"0f7b690afee9349b15909f33016a25d2e4d9f4e3"};var o=this.typeOf=function(i){if(i==null){return"null";}if(i.$family!=null){return i.$family(); +}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if("callee" in i){return"arguments"; +}if("item" in i){return"collection";}}}return typeof i;};var j=this.instanceOf=function(t,i){if(t==null){return false;}var s=t.$constructor||t.constructor; +while(s){if(s===i){return true;}s=s.parent;}if(!t.hasOwnProperty){return false;}return t instanceof i;};var f=this.Function;var p=true;for(var k in {toString:1}){p=null; +}if(p){p=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];}f.prototype.overloadSetter=function(s){var i=this; +return function(u,t){if(u==null){return this;}if(s||typeof u!="string"){for(var v in u){i.call(this,v,u[v]);}if(p){for(var w=p.length;w--;){v=p[w];if(u.hasOwnProperty(v)){i.call(this,v,u[v]); +}}}}else{i.call(this,u,t);}return this;};};f.prototype.overloadGetter=function(s){var i=this;return function(u){var v,t;if(typeof u!="string"){v=u;}else{if(arguments.length>1){v=arguments; +}else{if(s){v=[u];}}}if(v){t={};for(var w=0;w>>0; +b>>0;b>>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a>>0,b=Array(d);for(var a=0;a>>0; +b-1;},test:function(a,b){return((typeOf(a)=="regexp")?a:new RegExp(""+a,b)).test(this); +},trim:function(){return String(this).replace(/^\s+|\s+$/g,"");},clean:function(){return String(this).replace(/\s+/g," ").trim();},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase(); +});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase(); +});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this); +},hexToRgb:function(b){var a=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g); +return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1); +}return(a[c]!=null)?a[c]:"";});}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0); +return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype; +g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this; +if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b); +},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={}; +for(var e=0,b=g.length;e]*>([\s\S]*?)<\/script>/gi,function(m,n){e+=n+"\n";return""; +});if(k===true){j.exec(e);}else{if(typeOf(k)=="function"){k(e,l);}}return l;});j.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event}); +this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,k){d[e]=k;});this.Document=f.$constructor=new Type("Document",function(){}); +f.$family=Function.from("document").hide();Document.mirror(function(e,k){f[e]=k;});f.html=f.documentElement;if(!f.head){f.head=f.getElementsByTagName("head")[0]; +}if(f.execCommand){try{f.execCommand("BackgroundImageCache",false,true);}catch(c){}}if(this.attachEvent&&!this.addEventListener){var b=function(){this.detachEvent("onunload",b); +f.head=f.html=f.window=null;};this.attachEvent("onunload",b);}var g=Array.from;try{g(f.html.childNodes);}catch(c){Array.from=function(k){if(typeof k!="string"&&Type.isEnumerable(k)&&typeOf(k)!="array"){var e=k.length,l=new Array(e); +while(e--){l[e]=k[e];}return l;}return g(k);};var h=Array.prototype,i=h.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var k=h[e]; +Array[e]=function(l){return k.apply(Array.from(l),i.call(arguments,1));};});}})();(function(){var b={};var a=this.DOMEvent=new Type("DOMEvent",function(c,g){if(!g){g=window; +}c=c||g.event;if(c.$extended){return c;}this.event=c;this.$extended=true;this.shift=c.shiftKey;this.control=c.ctrlKey;this.alt=c.altKey;this.meta=c.metaKey; +var i=this.type=c.type;var h=c.target||c.srcElement;while(h&&h.nodeType==3){h=h.parentNode;}this.target=document.id(h);if(i.indexOf("key")==0){var d=this.code=(c.which||c.keyCode); +this.key=b[d];if(i=="keydown"||i=="keyup"){if(d>111&&d<124){this.key="f"+(d-111);}else{if(d>95&&d<106){this.key=d-96;}}}if(this.key==null){this.key=String.fromCharCode(d).toLowerCase(); +}}else{if(i=="click"||i=="dblclick"||i=="contextmenu"||i=="DOMMouseScroll"||i.indexOf("mouse")==0){var j=g.document;j=(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body; +this.page={x:(c.pageX!=null)?c.pageX:c.clientX+j.scrollLeft,y:(c.pageY!=null)?c.pageY:c.clientY+j.scrollTop};this.client={x:(c.pageX!=null)?c.pageX-g.pageXOffset:c.clientX,y:(c.pageY!=null)?c.pageY-g.pageYOffset:c.clientY}; +if(i=="DOMMouseScroll"||i=="mousewheel"){this.wheel=(c.wheelDelta)?c.wheelDelta/120:-(c.detail||0)/3;}this.rightClick=(c.which==3||c.button==2);if(i=="mouseover"||i=="mouseout"){var k=c.relatedTarget||c[(i=="mouseover"?"from":"to")+"Element"]; +while(k&&k.nodeType==3){k=k.parentNode;}this.relatedTarget=document.id(k);}}else{if(i.indexOf("touch")==0||i.indexOf("gesture")==0){this.rotation=c.rotation; +this.scale=c.scale;this.targetTouches=c.targetTouches;this.changedTouches=c.changedTouches;var f=this.touches=c.touches;if(f&&f[0]){var e=f[0];this.page={x:e.pageX,y:e.pageY}; +this.client={x:e.clientX,y:e.clientY};}}}}if(!this.client){this.client={};}if(!this.page){this.page={};}});a.implement({stop:function(){return this.preventDefault().stopPropagation(); +},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); +}else{this.event.returnValue=false;}return this;}});a.defineKey=function(d,c){b[d]=c;return this;};a.defineKeys=a.defineKey.overloadSetter(true);a.defineKeys({"38":"up","40":"down","37":"left","39":"right","27":"esc","32":"space","8":"backspace","9":"tab","46":"delete","13":"enter"}); +})();(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h};}var g=function(){e(this);if(g.$prototyping){return this; +}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;return i;}.extend(this).implement(h); +g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.'); +}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments); +};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone(); +break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.'); +}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h}); +return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this; +}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping; +return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j; +for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments)); +return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty(); +return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d); +this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; +},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c); +}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this; +},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue; +}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments)); +if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})(); +(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p; +var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length; +return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o; +}}}};var h=function(u){var r=u.expressions;for(var p=0;p+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(//,"["+f(">+~`!@$%^&={}\\;/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(//g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")); +function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n]; +if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,""); +}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")}); +}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"}); +}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)"); +break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break; +case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I); +};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o); +};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var k={},m={},d=Object.prototype.toString; +k.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};k.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(d.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML"); +};k.setDocument=function(w){var p=w.nodeType;if(p==9){}else{if(p){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return; +}this.document=w;var A=w.documentElement,o=this.getUIDXML(A),s=m[o],r;if(s){for(r in s){this[r]=s[r];}return;}s=m[o]={};s.root=A;s.isXMLDocument=this.isXML(w); +s.brokenStarGEBTN=s.starSelectsClosedQSA=s.idGetsName=s.brokenMixedCaseQSA=s.brokenGEBCN=s.brokenCheckedQSA=s.brokenEmptyAttributeQSA=s.isHTMLDocument=s.nativeMatchesSelector=false; +var q,u,y,z,t;var x,v="slick_uniqueid";var c=w.createElement("div");var n=w.body||w.getElementsByTagName("body")[0]||A;n.appendChild(c);try{c.innerHTML=''; +s.isHTMLDocument=!!w.getElementById(v);}catch(C){}if(s.isHTMLDocument){c.style.display="none";c.appendChild(w.createComment(""));u=(c.getElementsByTagName("*").length>1); +try{c.innerHTML="foo";x=c.getElementsByTagName("*");q=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");}catch(C){}s.brokenStarGEBTN=u||q;try{c.innerHTML=''; +s.idGetsName=w.getElementById(v)===c.firstChild;}catch(C){}if(c.getElementsByClassName){try{c.innerHTML='';c.getElementsByClassName("b").length; +c.firstChild.className="b";z=(c.getElementsByClassName("b").length!=2);}catch(C){}try{c.innerHTML='';y=(c.getElementsByClassName("a").length!=2); +}catch(C){}s.brokenGEBCN=z||y;}if(c.querySelectorAll){try{c.innerHTML="foo";x=c.querySelectorAll("*");s.starSelectsClosedQSA=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/"); +}catch(C){}try{c.innerHTML='';s.brokenMixedCaseQSA=!c.querySelectorAll(".MiX").length;}catch(C){}try{c.innerHTML=''; +s.brokenCheckedQSA=(c.querySelectorAll(":checked").length==0);}catch(C){}try{c.innerHTML='';s.brokenEmptyAttributeQSA=(c.querySelectorAll('[class*=""]').length!=0); +}catch(C){}}try{c.innerHTML='
            ';t=(c.firstChild.getAttribute("action")!="s");}catch(C){}s.nativeMatchesSelector=A.matches||A.mozMatchesSelector||A.webkitMatchesSelector; +if(s.nativeMatchesSelector){try{s.nativeMatchesSelector.call(A,":slick");s.nativeMatchesSelector=null;}catch(C){}}}try{A.slick_expando=1;delete A.slick_expando; +s.getUID=this.getUIDHTML;}catch(C){s.getUID=this.getUIDXML;}n.removeChild(c);c=x=n=null;s.getAttribute=(s.isHTMLDocument&&t)?function(G,E){var H=this.attributeGetters[E]; +if(H){return H.call(G);}var F=G.getAttributeNode(E);return(F)?F.nodeValue:null;}:function(F,E){var G=this.attributeGetters[E];return(G)?G.call(F):F.getAttribute(E); +};s.hasAttribute=(A&&this.isNativeCode(A.hasAttribute))?function(F,E){return F.hasAttribute(E);}:function(F,E){F=F.getAttributeNode(E);return !!(F&&(F.specified||F.nodeValue)); +};var D=A&&this.isNativeCode(A.contains),B=w&&this.isNativeCode(w.contains);s.contains=(D&&B)?function(E,F){return E.contains(F);}:(D&&!B)?function(E,F){return E===F||((E===w)?w.documentElement:E).contains(F); +}:(A&&A.compareDocumentPosition)?function(E,F){return E===F||!!(E.compareDocumentPosition(F)&16);}:function(E,F){if(F){do{if(F===E){return true;}}while((F=F.parentNode)); +}return false;};s.documentSorter=(A.compareDocumentPosition)?function(F,E){if(!F.compareDocumentPosition||!E.compareDocumentPosition){return 0;}return F.compareDocumentPosition(E)&4?-1:F===E?0:1; +}:("sourceIndex" in A)?function(F,E){if(!F.sourceIndex||!E.sourceIndex){return 0;}return F.sourceIndex-E.sourceIndex;}:(w.createRange)?function(H,F){if(!H.ownerDocument||!F.ownerDocument){return 0; +}var G=H.ownerDocument.createRange(),E=F.ownerDocument.createRange();G.setStart(H,0);G.setEnd(H,0);E.setStart(F,0);E.setEnd(F,0);return G.compareBoundaryPoints(Range.START_TO_END,E); +}:null;A=null;for(r in s){this[r]=s[r];}};var f=/^([#.]?)((?:[\w-]+|\*))$/,h=/\[.+[*$^]=(?:""|'')?\]/,g={};k.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]); +if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U); +}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(f);simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors; +}E=U.getElementsByTagName(v);if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors; +}A=U.getElementById(v);if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A); +}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v); +if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+e.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*"); +for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p); +}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||g[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&h.test(z))||(!y&&z.indexOf(",")>-1)||e.disableQSA){break querySelector; +}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null; +}else{E=U.querySelectorAll(S);}}catch(Q){g[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0; +A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p); +}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z; +return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID; +if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator; +if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1)); +this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search; +}}else{if(s&&w){for(L=0,K=N.length;L1)){this.sort(p);}return(s)?(p[0]||null):p;};k.uidx=1;k.uidk="slick-uniqueid";k.getUIDXML=function(n){var c=n.getAttribute(this.uidk); +if(!c){c=this.uidx++;n.setAttribute(this.uidk,c);}return c;};k.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};k.sort=function(c){if(!this.documentSorter){return c; +}c.sort(this.documentSorter);return c;};k.cacheNTH={};k.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;k.parseNTHArgument=function(q){var o=q.match(this.matchNTH); +if(!o){return false;}var p=o[2]||false;var n=o[1]||1;if(n=="-"){n=-1;}var c=+o[3]||0;o=(p=="n")?{a:n,b:c}:(p=="odd")?{a:2,b:1}:(p=="even")?{a:2,b:0}:{a:0,b:n}; +return(this.cacheNTH[q]=o);};k.createNTHPseudo=function(p,n,c,o){return function(s,q){var u=this.getUID(s);if(!this[c][u]){var A=s.parentNode;if(!A){return false; +}var r=A[p],t=1;if(o){var z=s.nodeName;do{if(r.nodeName!=z){continue;}this[c][this.getUID(r)]=t++;}while((r=r[n]));}else{do{if(r.nodeType!=1){continue; +}this[c][this.getUID(r)]=t++;}while((r=r[n]));}}q=q||"n";var v=this.cacheNTH[q]||this.parseNTHArgument(q);if(!v){return false;}var y=v.a,x=v.b,w=this[c][u]; +if(y==0){return x==w;}if(y>0){if(w":function(p,c,r,o,n,q){if((p=p.firstChild)){do{if(p.nodeType==1){this.push(p,c,r,o,n,q); +}}while((p=p.nextSibling));}},"+":function(p,c,r,o,n,q){while((p=p.nextSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);break;}}},"^":function(p,c,r,o,n,q){p=p.firstChild; +if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:+"](p,c,r,o,n,q);}}},"~":function(q,c,s,p,n,r){while((q=q.nextSibling)){if(q.nodeType!=1){continue; +}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}},"++":function(p,c,r,o,n,q){this["combinator:+"](p,c,r,o,n,q); +this["combinator:!+"](p,c,r,o,n,q);},"~~":function(p,c,r,o,n,q){this["combinator:~"](p,c,r,o,n,q);this["combinator:!~"](p,c,r,o,n,q);},"!":function(p,c,r,o,n,q){while((p=p.parentNode)){if(p!==this.document){this.push(p,c,r,o,n,q); +}}},"!>":function(p,c,r,o,n,q){p=p.parentNode;if(p!==this.document){this.push(p,c,r,o,n,q);}},"!+":function(p,c,r,o,n,q){while((p=p.previousSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q); +break;}}},"!^":function(p,c,r,o,n,q){p=p.lastChild;if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:!+"](p,c,r,o,n,q);}}},"!~":function(q,c,s,p,n,r){while((q=q.previousSibling)){if(q.nodeType!=1){continue; +}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}}};for(var i in j){k["combinator:"+i]=j[i];}var l={empty:function(c){var n=c.firstChild; +return !(n&&n.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,n){return !this.matchNode(c,n);},contains:function(c,n){return(c.innerText||c.textContent||"").indexOf(n)>-1; +},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false; +}}return true;},"only-child":function(o){var n=o;while((n=n.previousSibling)){if(n.nodeType==1){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeType==1){return false; +}}return true;},"nth-child":k.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":k.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":k.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":k.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(n,c){return this["pseudo:nth-child"](n,""+(c+1)); +},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var n=c.nodeName; +while((c=c.previousSibling)){if(c.nodeName==n){return false;}}return true;},"last-of-type":function(c){var n=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==n){return false; +}}return true;},"only-of-type":function(o){var n=o,p=o.nodeName;while((n=n.previousSibling)){if(n.nodeName==p){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeName==p){return false; +}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex")); +},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var b in l){k["pseudo:"+b]=l[b];}var a=k.attributeGetters={"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for"); +},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style"); +},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;},type:function(){return this.getAttribute("type"); +},maxlength:function(){var c=this.getAttributeNode("maxLength");return(c&&c.specified)?c.nodeValue:null;}};a.MAXLENGTH=a.maxLength=a.maxlength;var e=k.Slick=(this.Slick||{}); +e.version="1.1.7";e.search=function(n,o,c){return k.search(n,o,c);};e.find=function(c,n){return k.search(c,n,null,true);};e.contains=function(c,n){k.setDocument(c); +return k.contains(c,n);};e.getAttribute=function(n,c){k.setDocument(n);return k.getAttribute(n,c);};e.hasAttribute=function(n,c){k.setDocument(n);return k.hasAttribute(n,c); +};e.match=function(n,c){if(!(n&&c)){return false;}if(!c||c===n){return true;}k.setDocument(n);return k.matchNode(n,c);};e.defineAttributeGetter=function(c,n){k.attributeGetters[c]=n; +return this;};e.lookupAttributeGetter=function(c){return k.attributeGetters[c];};e.definePseudo=function(c,n){k["pseudo:"+c]=function(p,o){return n.call(p,o); +};return this;};e.lookupPseudo=function(c){var n=k["pseudo:"+c];if(n){return function(o){return n.call(this,o);};}return null;};e.override=function(n,c){k.override(n,c); +return this;};e.isXML=k.isXML;e.uidOf=function(c){return k.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this); +var Element=this.Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={}; +}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0];b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var a,f=0,c=d.length; +f=this.length){delete this[g--]; +}return e;}.protect());}Array.forEachMethod(function(g,e){Elements.implement(e,g);});Array.mirror(Elements);var d;try{d=(document.createElement("").name=="x"); +}catch(b){}var c=function(e){return(""+e).replace(/&/g,"&").replace(/"/g,""");};Document.implement({newElement:function(e,g){if(g&&g.checked!=null){g.defaultChecked=g.checked; +}if(d&&g){e="<"+e;if(g.name){e+=' name="'+c(g.name)+'"';}if(g.type){e+=' type="'+c(g.type)+'"';}e+=">";delete g.name;delete g.type;}return this.id(this.createElement(e)).set(g); +}});})();(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(e){return this.createTextNode(e);},getDocument:function(){return this; +},getWindow:function(){return this.window;},id:(function(){var e={string:function(L,K,l){L=Slick.find(l,"#"+L.replace(/(\W)/g,"\\$1"));return(L)?e.element(L,K):null; +},element:function(K,L){Slick.uidOf(K);if(!L&&!K.$family&&!(/^(?:object|embed)$/i).test(K.tagName)){var l=K.fireEvent;K._fireEvent=function(M,N){return l(M,N); +};Object.append(K,Element.Prototype);}return K;},object:function(K,L,l){if(K.toElement){return e.element(K.toElement(l),L);}return null;}};e.textnode=e.whitespace=e.window=e.document=function(l){return l; +};return function(K,M,L){if(K&&K.$family&&K.uniqueNumber){return K;}var l=typeOf(K);return(e[l])?e[l](K,M,L||document):null;};})()});if(window.$==null){Window.implement("$",function(e,l){return document.id(e,l,this.document); +});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(e){return Slick.search(this,e,new Elements); +},getElement:function(e){return document.id(Slick.find(this,e));}});var p={contains:function(e){return Slick.contains(this,e);}};if(!document.contains){Document.implement(p); +}if(!document.createElement("div").contains){Element.implement(p);}var v=function(L,K){if(!L){return K;}L=Object.clone(Slick.parse(L));var l=L.expressions; +for(var e=l.length;e--;){l[e][0].combinator=K;}return L;};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(e,l){Element.implement(l,function(K){return this.getElement(v(K,e)); +});});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(e,l){Element.implement(l,function(K){return this.getElements(v(K,e)); +});});Element.implement({getFirst:function(e){return document.id(Slick.search(this,v(e,">"))[0]);},getLast:function(e){return document.id(Slick.search(this,v(e,">")).getLast()); +},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(e){return document.id(Slick.find(this,"#"+(""+e).replace(/(\W)/g,"\\$1"))); +},match:function(e){return !e||Slick.match(this,e);}});if(window.$$==null){Window.implement("$$",function(e){if(arguments.length==1){if(typeof e=="string"){return Slick.search(this.document,e,new Elements); +}else{if(Type.isEnumerable(e)){return new Elements(e);}}}return new Elements(arguments);});}var A={before:function(l,e){var K=e.parentNode;if(K){K.insertBefore(l,e); +}},after:function(l,e){var K=e.parentNode;if(K){K.insertBefore(l,e.nextSibling);}},bottom:function(l,e){e.appendChild(l);},top:function(l,e){e.insertBefore(l,e.firstChild); +}};A.inside=A.bottom;var n={},d={};var o={};Array.forEach(["type","value","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","rowSpan","tabIndex","useMap"],function(e){o[e.toLowerCase()]=e; +});o.html="innerHTML";o.text=(document.createElement("div").textContent==null)?"innerText":"textContent";Object.forEach(o,function(l,e){d[e]=function(K,L){K[l]=L; +};n[e]=function(K){return K[l];};});var B=["compact","nowrap","ismap","declare","noshade","checked","disabled","readOnly","multiple","selected","noresize","defer","defaultChecked","autofocus","controls","autoplay","loop"]; +var k={};Array.forEach(B,function(e){var l=e.toLowerCase();k[l]=e;d[l]=function(K,L){K[e]=!!L;};n[l]=function(K){return !!K[e];};});Object.append(d,{"class":function(e,l){("className" in e)?e.className=(l||""):e.setAttribute("class",l); +},"for":function(e,l){("htmlFor" in e)?e.htmlFor=l:e.setAttribute("for",l);},style:function(e,l){(e.style)?e.style.cssText=l:e.setAttribute("style",l); +},value:function(e,l){e.value=(l!=null)?l:"";}});n["class"]=function(e){return("className" in e)?e.className||null:e.getAttribute("class");};var f=document.createElement("button"); +try{f.type="button";}catch(E){}if(f.type!="button"){d.type=function(e,l){e.setAttribute("type",l);};}f=null;var s=document.createElement("input");s.value="t"; +s.type="submit";if(s.value!="t"){d.type=function(l,e){var K=l.value;l.type=e;l.value=K;};}s=null;var u=(function(e){e.random="attribute";return(e.getAttribute("random")=="attribute"); +})(document.createElement("div"));var i=(function(e){e.innerHTML='';return e.cloneNode(true).firstChild.childNodes.length!=1; +})(document.createElement("div"));var j=!!document.createElement("div").classList;var F=function(e){var l=(e||"").clean().split(" "),K={};return l.filter(function(L){if(L!==""&&!K[L]){return K[L]=L; +}});};var t=function(e){this.classList.add(e);};var g=function(e){this.classList.remove(e);};Element.implement({setProperty:function(l,K){var L=d[l.toLowerCase()]; +if(L){L(this,K);}else{var e;if(u){e=this.retrieve("$attributeWhiteList",{});}if(K==null){this.removeAttribute(l);if(u){delete e[l];}}else{this.setAttribute(l,""+K); +if(u){e[l]=true;}}}return this;},setProperties:function(e){for(var l in e){this.setProperty(l,e[l]);}return this;},getProperty:function(M){var K=n[M.toLowerCase()]; +if(K){return K(this);}if(u){var l=this.getAttributeNode(M),L=this.retrieve("$attributeWhiteList",{});if(!l){return null;}if(l.expando&&!L[M]){var N=this.outerHTML; +if(N.substr(0,N.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(M)<0){return null;}L[M]=true;}}var e=Slick.getAttribute(this,M);return(!e&&!Slick.hasAttribute(this,M))?null:e; +},getProperties:function(){var e=Array.from(arguments);return e.map(this.getProperty,this).associate(e);},removeProperty:function(e){return this.setProperty(e,null); +},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;},set:function(K,l){var e=Element.Properties[K];(e&&e.set)?e.set.call(this,l):this.setProperty(K,l); +}.overloadSetter(),get:function(l){var e=Element.Properties[l];return(e&&e.get)?e.get.apply(this):this.getProperty(l);}.overloadGetter(),erase:function(l){var e=Element.Properties[l]; +(e&&e.erase)?e.erase.apply(this):this.removeProperty(l);return this;},hasClass:j?function(e){return this.classList.contains(e);}:function(e){return this.className.clean().contains(e," "); +},addClass:j?function(e){F(e).forEach(t,this);return this;}:function(e){this.className=F(e+" "+this.className).join(" ");return this;},removeClass:j?function(e){F(e).forEach(g,this); +return this;}:function(e){var l=F(this.className);F(e).forEach(l.erase,l);this.className=l.join(" ");return this;},toggleClass:function(e,l){if(l==null){l=!this.hasClass(e); +}return(l)?this.addClass(e):this.removeClass(e);},adopt:function(){var L=this,e,N=Array.flatten(arguments),M=N.length;if(M>1){L=e=document.createDocumentFragment(); +}for(var K=0;K1){L=document.createDocumentFragment(); +for(var N=0,e=O.length;N";a=(x.childNodes.length==1);if(!a){var w="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),b=document.createDocumentFragment(),y=w.length; +while(y--){b.createElement(w[y]);}}x=null;h=Function.attempt(function(){var e=document.createElement("table");e.innerHTML="";return true; +});var c=document.createElement("tr"),r="";c.innerHTML=r;C=(c.innerHTML==r);c=null;if(!h||!C||!a){Element.Properties.html.set=(function(l){var e={table:[1,"","
            "],select:[1,""],tbody:[2,"","
            "],tr:[3,"","
            "]}; +e.thead=e.tfoot=e.tbody;return function(K){var L=e[this.get("tag")];if(!L&&!a){L=[0,"",""];}if(!L){return l.call(this,K);}var O=L[0],N=document.createElement("div"),M=N; +if(!a){b.appendChild(N);}N.innerHTML=[L[1],K,L[2]].flatten().join("");while(O--){M=M.firstChild;}this.empty().adopt(M.childNodes);if(!a){b.removeChild(N); +}N=null;};})(Element.Properties.html.set);}var q=document.createElement("form");q.innerHTML="";if(q.firstChild.value!="s"){Element.Properties.value={set:function(N){var l=this.get("tag"); +if(l!="select"){return this.setProperty("value",N);}var K=this.getElements("option");N=String(N);for(var L=0;L0||r==null?"visible":"hidden";};var p=function(r,v,u){var t=r.style,s=t.filter||r.getComputedStyle("filter")||"";t.filter=(v.test(s)?s.replace(v,u):s+" "+u).trim(); +if(!t.filter){t.removeAttribute("filter");}};var h=(j?function(s,r){s.style.opacity=r;}:(g?function(s,r){if(!s.currentStyle||!s.currentStyle.hasLayout){s.style.zoom=1; +}if(r==null||r==1){p(s,q,"");if(r==1&&i(s)!=1){p(s,q,"alpha(opacity=100)");}}else{p(s,q,"alpha(opacity="+(r*100).limit(0,100).round()+")");}}:b));var i=(j?function(s){var r=s.style.opacity||s.getComputedStyle("opacity"); +return(r=="")?1:r.toFloat();}:(g?function(s){var t=(s.style.filter||s.getComputedStyle("filter")),r;if(t){r=t.match(q);}return(r==null||t==null)?1:(r[1]/100); +}:function(s){var r=s.retrieve("$opacity");if(r==null){r=(s.style.visibility=="hidden"?0:1);}return r;}));var d=(l.style.cssFloat==null)?"styleFloat":"cssFloat",a={left:"0%",top:"0%",center:"50%",right:"100%",bottom:"100%"},c=(l.style.backgroundPositionX!=null); +var m=function(r,s){if(s=="backgroundPosition"){r.removeAttribute(s+"X");s+="Y";}r.removeAttribute(s);};Element.implement({getComputedStyle:function(t){if(!n&&this.currentStyle){return this.currentStyle[t.camelCase()]; +}var s=Element.getDocument(this).defaultView,r=s?s.getComputedStyle(this,null):null;return(r)?r.getPropertyValue((t==d)?"float":t.hyphenate()):"";},setStyle:function(s,r){if(s=="opacity"){if(r!=null){r=parseFloat(r); +}h(this,r);return this;}s=(s=="float"?d:s).camelCase();if(typeOf(r)!="string"){var t=(Element.Styles[s]||"@").split(" ");r=Array.from(r).map(function(v,u){if(!t[u]){return""; +}return(typeOf(v)=="number")?t[u].replace("@",Math.round(v)):v;}).join(" ");}else{if(r==String(Number(r))){r=Math.round(r);}}this.style[s]=r;if((r==""||r==null)&&e&&this.style.removeAttribute){m(this.style,s); +}return this;},getStyle:function(x){if(x=="opacity"){return i(this);}x=(x=="float"?d:x).camelCase();var r=this.style[x];if(!r||x=="zIndex"){if(Element.ShortStyles.hasOwnProperty(x)){r=[]; +for(var w in Element.ShortStyles[x]){r.push(this.getStyle(w));}return r.join(" ");}r=this.getComputedStyle(x);}if(c&&/^backgroundPosition[XY]?$/.test(x)){return r.replace(/(top|right|bottom|left)/g,function(s){return a[s]; +})||"0px";}if(!r&&x=="backgroundPosition"){return"0px 0px";}if(r){r=String(r);var u=r.match(/rgba?\([\d\s,]+\)/);if(u){r=r.replace(u[0],u[0].rgbToHex()); +}}if(!n&&!this.style[x]){if((/^(height|width)$/).test(x)&&!(/px$/.test(r))){var t=(x=="width")?["left","right"]:["top","bottom"],v=0;t.each(function(s){v+=this.getStyle("border-"+s+"-width").toInt()+this.getStyle("padding-"+s).toInt(); +},this);return this["offset"+x.capitalize()]-v+"px";}if((/^border(.+)Width|margin|padding/).test(x)&&isNaN(parseFloat(r))){return"0px";}}if(o&&/^border(Top|Right|Bottom|Left)?$/.test(x)&&/^#/.test(r)){return r.replace(/^(.+)\s(.+)\s(.+)$/,"$2 $3 $1"); +}return r;},setStyles:function(s){for(var r in s){this.setStyle(r,s[r]);}return this;},getStyles:function(){var r={};Array.flatten(arguments).each(function(s){r[s]=this.getStyle(s); +},this);return r;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundSize:"@px",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}; +Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(x){var w=Element.ShortStyles; +var s=Element.Styles;["margin","padding"].each(function(y){var z=y+x;w[y][z]=s[z]="@px";});var v="border"+x;w.border[v]=s[v]="@px @ rgb(@, @, @)";var u=v+"Width",r=v+"Style",t=v+"Color"; +w[v]={};w.borderWidth[u]=w[v][u]=s[u]="@px";w.borderStyle[r]=w[v][r]=s[r]="@";w.borderColor[t]=w[v][t]=s[t]="rgb(@, @, @)";});if(c){Element.ShortStyles.backgroundPosition={backgroundPositionX:"@",backgroundPositionY:"@"}; +}})();(function(){Element.Properties.events={set:function(b){this.addEvents(b);}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{}); +if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h,f); +}if(b.condition){d=function(k){if(b.condition.call(this,k,f)){return h.call(this,k);}return true;};}if(b.base){g=Function.from(b.base).call(this,f);}}var e=function(){return h.call(j); +};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new DOMEvent(k,j.getWindow());if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]); +}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events");if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d); +if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];if(f){if(f.onRemove){f.onRemove.call(this,d,e);}if(f.base){e=Function.from(f.base).call(this,e); +}}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; +},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);}return this;}var c=this.retrieve("events");if(!c){return this; +}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);},this);delete c[b]; +}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c); +}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b); +}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,hashchange:1,popstate:2,error:1,abort:1,scroll:1}; +Element.Events={mousewheel:{base:"onwheel" in document?"wheel":"onmousewheel" in document?"mousewheel":"DOMMouseScroll"}};var a=function(b){var c=b.relatedTarget; +if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c));};if("onmouseenter" in document.documentElement){Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2; +Element.MouseenterCheck=a;}else{Element.Events.mouseenter={base:"mouseover",condition:a};Element.Events.mouseleave={base:"mouseout",condition:a};}if(!window.addEventListener){Element.NativeEvents.propertychange=2; +Element.Events.change={base:function(){var b=this.type;return(this.get("tag")=="input"&&(b=="radio"||b=="checkbox"))?"propertychange":"change";},condition:function(b){return b.type!="propertychange"||b.event.propertyName=="checked"; +}};}})();(function(){var c=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2;var k=function(l,m,n,o,p){while(p&&p!=l){if(m(p,o)){return n.call(p,o,p); +}p=document.id(p.parentNode);}};var a={mouseenter:{base:"mouseover",condition:Element.MouseenterCheck},mouseleave:{base:"mouseout",condition:Element.MouseenterCheck},focus:{base:"focus"+(c?"":"in"),capture:true},blur:{base:c?"blur":"focusout",capture:true}}; +var b="$delegation:";var i=function(l){return{base:"focusin",remove:function(m,o){var p=m.retrieve(b+l+"listeners",{})[o];if(p&&p.forms){for(var n=p.forms.length; +n--;){p.forms[n].removeEvent(l,p.fns[n]);}}},listen:function(x,r,v,n,t,s){var o=(t.get("tag")=="form")?t:n.target.getParent("form");if(!o){return;}var u=x.retrieve(b+l+"listeners",{}),p=u[s]||{forms:[],fns:[]},m=p.forms,w=p.fns; +if(m.indexOf(o)!=-1){return;}m.push(o);var q=function(y){k(x,r,v,y,t);};o.addEvent(l,q);w.push(q);u[s]=p;x.store(b+l+"listeners",u);}};};var d=function(l){return{base:"focusin",listen:function(m,n,p,q,r){var o={blur:function(){this.removeEvents(o); +}};o[l]=function(s){k(m,n,p,s,r);};q.target.addEvents(o);}};};if(!c){Object.append(a,{submit:i("submit"),reset:i("reset"),change:d("change"),select:d("select")}); +}var h=Element.prototype,f=h.addEvent,j=h.removeEvent;var e=function(l,m){return function(r,q,n){if(r.indexOf(":relay")==-1){return l.call(this,r,q,n); +}var o=Slick.parse(r).expressions[0][0];if(o.pseudos[0].key!="relay"){return l.call(this,r,q,n);}var p=o.tag;o.pseudos.slice(1).each(function(s){p+=":"+s.key+(s.value?"("+s.value+")":""); +});l.call(this,r,q);return m.call(this,p,o.pseudos[0].value,q);};};var g={addEvent:function(v,q,x){var t=this.retrieve("$delegates",{}),r=t[v];if(r){for(var y in r){if(r[y].fn==x&&r[y].match==q){return this; +}}}var p=v,u=q,o=x,n=a[v]||{};v=n.base||p;q=function(B){return Slick.match(B,u);};var w=Element.Events[p];if(n.condition||w&&w.condition){var l=q,m=n.condition||w.condition; +q=function(C,B){return l(C,B)&&m.call(C,B,v);};}var z=this,s=String.uniqueID();var A=n.listen?function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){n.listen(z,q,x,B,C,s); +}}:function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){k(z,q,x,B,C);}};if(!r){r={};}r[s]={match:u,fn:o,delegator:A};t[p]=r;return f.call(this,v,A,n.capture); +},removeEvent:function(r,n,t,u){var q=this.retrieve("$delegates",{}),p=q[r];if(!p){return this;}if(u){var m=r,w=p[u].delegator,l=a[r]||{};r=l.base||m;if(l.remove){l.remove(this,u); +}delete p[u];q[m]=p;return j.call(this,r,w,l.capture);}var o,v;if(t){for(o in p){v=p[o];if(v.match==n&&v.fn==t){return g.removeEvent.call(this,r,n,t,o); +}}}else{for(o in p){v=p[o];if(v.match==n){g.removeEvent.call(this,r,n,v.fn,o);}}}return this;}};[Element,Window,Document].invoke("implement",{addEvent:e(f,g.addEvent),removeEvent:e(j,g.removeEvent)}); +})();(function(){var h=document.createElement("div"),e=document.createElement("div");h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null; +var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName);};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n); +}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight}; +},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(a(this)){return this.getWindow().getScroll(); +}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0};while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop; +n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}var n=(k(m,"position")=="static")?i:l; +while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}try{return m.offsetParent; +}catch(n){}return null;},getOffsets:function(){var n=this.getBoundingClientRect;if(n){var r=this.getBoundingClientRect(),p=document.id(this.getDocument().documentElement),q=p.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed"); +return{x:r.left.toInt()+t.x+((s)?0:q.x)-p.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-p.clientTop};}var o=this,m={x:0,y:0};if(a(this)){return m;}while(o&&!a(o)){m.x+=o.offsetLeft; +m.y+=o.offsetTop;o=o.offsetParent;}return m;},getPosition:function(p){var q=this.getOffsets(),n=this.getScrolls();var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition(); +return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates();}var m=this.getPosition(o),n=this.getSize(); +var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")}; +},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight}; +},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body; +return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize(); +return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box"; +}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName); +}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y; +},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x; +},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y; +},getLeft:function(){return this.getPosition().x;}});(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this; +this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval; +this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame-1&&e.indexOf(document.domain)==-1){return;}var h=g.rules||g.cssRules; +b(h);});return Fx.CSS.Cache[a]=d;}});Fx.CSS.Cache={};Fx.CSS.Parsers={Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true); +}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a)); +});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:Function.from(false),compute:function(b,a){return a; +},serve:function(a){return a;}}};Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);},set:function(b,a){if(arguments.length==1){a=b; +b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit);return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this; +}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);return this.parent(a.from,a.to); +}});Element.Properties.tween={set:function(a){this.get("tween").cancel().setOptions(a);return this;},get:function(){var a=this.retrieve("tween");if(!a){a=new Fx.Tween(this,{link:"cancel"}); +this.store("tween",a);}return a;}};Element.implement({tween:function(a,c,b){this.get("tween").start(a,c,b);return this;},fade:function(d){var e=this.get("tween"),g,c=["opacity"].append(arguments),a; +if(c[1]==null){c[1]="toggle";}switch(c[1]){case"in":g="start";c[1]=1;break;case"out":g="start";c[1]=0;break;case"show":g="set";c[1]=1;break;case"hide":g="set"; +c[1]=0;break;case"toggle":var b=this.retrieve("fade:flag",this.getStyle("opacity")==1);g="start";c[1]=b?0:1;this.store("fade:flag",!b);a=true;break;default:g="start"; +}if(!a){this.eliminate("fade:flag");}e[g].apply(e,c);var f=c[c.length-1];if(g=="set"||f!=0){this.setStyle("visibility",f==0?"hidden":"visible");}else{e.chain(function(){this.element.setStyle("visibility","hidden"); +this.callChain();});}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));a=(a=="transparent")?"#fff":a; +}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original")); +b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a); +},set:function(a){if(typeof a=="string"){a=this.search(a);}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={}; +for(var b in e){a[b]=this.parent(e[b],d[b],c);}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={}; +for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){this.get("morph").cancel().setOptions(a); +return this;},get:function(){var a=this.retrieve("morph");if(!a){a=new Fx.Morph(this,{link:"cancel"});this.store("morph",a);}return a;}};Element.implement({morph:function(a){this.get("morph").start(a); +return this;}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof a=="string"){var b=a.split(":"); +a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")];}}return a;}});Fx.Transition=function(c,b){b=Array.from(b); +var a=function(d){return c(d,b);};return Object.append(a,{easeIn:a,easeOut:function(d){return 1-c(1-d,b);},easeInOut:function(d){return(d<=0.5?c(2*d,b):(2-c(2*(1-d),b)))/2; +}});};Fx.Transitions={linear:function(a){return a;}};Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b]);}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a&&a[0]||6); +},Expo:function(a){return Math.pow(2,8*(a-1));},Circ:function(a){return 1-Math.sin(Math.acos(a));},Sine:function(a){return 1-Math.cos(a*Math.PI/2);},Back:function(b,a){a=a&&a[0]||1.618; +return Math.pow(b,2)*((a+1)*b-a);},Bounce:function(f){var e;for(var d=0,c=1;1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e; +},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,a+2); +});});(function(){var d=function(){},a=("onprogress" in new Browser.Request);var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(e){this.xhr=new Browser.Request(); +this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false; +this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d; +}clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml); +}else{this.failure();}},isSuccess:function(){var e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e); +}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); +},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(e){this.fireEvent("loadstart",[e,this.xhr]); +},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f; +return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.bind(this));},check:function(){if(!this.running){return true; +}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(o){if(!this.check(o)){return this; +}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options; +o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString(); +break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e; +j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g; +}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.indexOf("?")>-1?"&":"?")+String.uniqueID(); +}if(j&&(e=="get"||e=="delete")){f+=(f.indexOf("?")>-1?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this); +}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true; +}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]); +}},this);this.fireEvent("request");n.send(j);if(!this.options.async){this.onStateChange();}else{if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this); +}}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d; +if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e}; +if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e); +return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")}); +this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.options.url});return this;}});})(); +Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(f){var e=this.options,c=this.response; +c.html=f.stripScripts(function(h){c.javascript=h;});var d=c.html.match(/]*>([\s\S]*?)<\/body>/i);if(d){c.html=d[1];}var b=new Element("div").set("html",c.html); +c.tree=b.childNodes;c.elements=b.getElements(e.filter||"*");if(e.filter){c.tree=c.elements;}if(e.update){var g=document.id(e.update).empty();if(e.filter){g.adopt(c.elements); +}else{g.set("html",c.html);}}else{if(e.append){var a=document.id(e.append);if(e.filter){c.elements.reverse().inject(a);}else{a.adopt(b.getChildren());}}}if(e.evalScripts){Browser.exec(c.javascript); +}this.onSuccess(c.tree,c.elements,c.html,c.javascript);}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this; +},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",a);}return a; +}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return this;}});if(typeof JSON=="undefined"){this.JSON={}; +}(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4); +};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""); +return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON(); +}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[]; +Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj; +case"null":return"null";}return null;};JSON.secure=true;JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null;}if(secure==null){secure=JSON.secure; +}if(secure){if(JSON.parse){return JSON.parse(string);}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure."); +}}return eval("("+string+")");};})();Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"}); +},success:function(c){var b;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure(); +}else{this.onSuccess(b,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b; +this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path; +}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure"; +}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); +return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}}); +Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose(); +};(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a); +k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b); +if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h); +c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a); +}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this); +}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document); \ No newline at end of file diff --git a/pyload/webui/themes/flat/js/static/mootools-more.js b/pyload/webui/themes/flat/js/static/mootools-more.js new file mode 100644 index 000000000..c7f4a1a0e --- /dev/null +++ b/pyload/webui/themes/flat/js/static/mootools-more.js @@ -0,0 +1,2856 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/more/c1cc18c2fff04bcc58921b4dff80a6f1 + +packager build: + - packager build More/Form.Request More/Fx.Reveal More/Sortables More/Request.Periodical More/Color + +... +*/ + +/* +--- + +script: More.js + +name: More + +description: MooTools More + +license: MIT-style license + +authors: + - Guillermo Rauch + - Thomas Aylott + - Scott Kyle + - Arian Stolwijk + - Tim Wienk + - Christoph Pojer + - Aaron Newton + - Jacob Thornton + +requires: + - Core/MooTools + +provides: [MooTools.More] + +... +*/ + +MooTools.More = { + version: '1.5.0', + build: '73db5e24e6e9c5c87b3a27aebef2248053f7db37' +}; + + +/* +--- + +script: Class.Binds.js + +name: Class.Binds + +description: Automagically binds specified methods in a class to the instance of the class. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Class + - MooTools.More + +provides: [Class.Binds] + +... +*/ + +Class.Mutators.Binds = function(binds){ + if (!this.prototype.initialize) this.implement('initialize', function(){}); + return Array.from(binds).concat(this.prototype.Binds || []); +}; + +Class.Mutators.initialize = function(initialize){ + return function(){ + Array.from(this.Binds).each(function(name){ + var original = this[name]; + if (original) this[name] = original.bind(this); + }, this); + return initialize.apply(this, arguments); + }; +}; + + +/* +--- + +script: Class.Occlude.js + +name: Class.Occlude + +description: Prevents a class from being applied to a DOM element twice. + +license: MIT-style license. + +authors: + - Aaron Newton + +requires: + - Core/Class + - Core/Element + - MooTools.More + +provides: [Class.Occlude] + +... +*/ + +Class.Occlude = new Class({ + + occlude: function(property, element){ + element = document.id(element || this.element); + var instance = element.retrieve(property || this.property); + if (instance && !this.occluded) + return (this.occluded = instance); + + this.occluded = false; + element.store(property || this.property, this); + return this.occluded; + } + +}); + + +/* +--- + +script: Class.Refactor.js + +name: Class.Refactor + +description: Extends a class onto itself with new property, preserving any items attached to the class's namespace. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Class + - MooTools.More + +# Some modules declare themselves dependent on Class.Refactor +provides: [Class.refactor, Class.Refactor] + +... +*/ + +Class.refactor = function(original, refactors){ + + Object.each(refactors, function(item, name){ + var origin = original.prototype[name]; + origin = (origin && origin.$origin) || origin || function(){}; + original.implement(name, (typeof item == 'function') ? function(){ + var old = this.previous; + this.previous = origin; + var value = item.apply(this, arguments); + this.previous = old; + return value; + } : item); + }); + + return original; + +}; + + +/* +--- + +script: Element.Measure.js + +name: Element.Measure + +description: Extends the Element native object to include methods useful in measuring dimensions. + +credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz" + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Element.Style + - Core/Element.Dimensions + - MooTools.More + +provides: [Element.Measure] + +... +*/ + +(function(){ + +var getStylesList = function(styles, planes){ + var list = []; + Object.each(planes, function(directions){ + Object.each(directions, function(edge){ + styles.each(function(style){ + list.push(style + '-' + edge + (style == 'border' ? '-width' : '')); + }); + }); + }); + return list; +}; + +var calculateEdgeSize = function(edge, styles){ + var total = 0; + Object.each(styles, function(value, style){ + if (style.test(edge)) total = total + value.toInt(); + }); + return total; +}; + +var isVisible = function(el){ + return !!(!el || el.offsetHeight || el.offsetWidth); +}; + + +Element.implement({ + + measure: function(fn){ + if (isVisible(this)) return fn.call(this); + var parent = this.getParent(), + toMeasure = []; + while (!isVisible(parent) && parent != document.body){ + toMeasure.push(parent.expose()); + parent = parent.getParent(); + } + var restore = this.expose(), + result = fn.call(this); + restore(); + toMeasure.each(function(restore){ + restore(); + }); + return result; + }, + + expose: function(){ + if (this.getStyle('display') != 'none') return function(){}; + var before = this.style.cssText; + this.setStyles({ + display: 'block', + position: 'absolute', + visibility: 'hidden' + }); + return function(){ + this.style.cssText = before; + }.bind(this); + }, + + getDimensions: function(options){ + options = Object.merge({computeSize: false}, options); + var dim = {x: 0, y: 0}; + + var getSize = function(el, options){ + return (options.computeSize) ? el.getComputedSize(options) : el.getSize(); + }; + + var parent = this.getParent('body'); + + if (parent && this.getStyle('display') == 'none'){ + dim = this.measure(function(){ + return getSize(this, options); + }); + } else if (parent){ + try { //safari sometimes crashes here, so catch it + dim = getSize(this, options); + }catch(e){} + } + + return Object.append(dim, (dim.x || dim.x === 0) ? { + width: dim.x, + height: dim.y + } : { + x: dim.width, + y: dim.height + } + ); + }, + + getComputedSize: function(options){ + + + options = Object.merge({ + styles: ['padding','border'], + planes: { + height: ['top','bottom'], + width: ['left','right'] + }, + mode: 'both' + }, options); + + var styles = {}, + size = {width: 0, height: 0}, + dimensions; + + if (options.mode == 'vertical'){ + delete size.width; + delete options.planes.width; + } else if (options.mode == 'horizontal'){ + delete size.height; + delete options.planes.height; + } + + getStylesList(options.styles, options.planes).each(function(style){ + styles[style] = this.getStyle(style).toInt(); + }, this); + + Object.each(options.planes, function(edges, plane){ + + var capitalized = plane.capitalize(), + style = this.getStyle(plane); + + if (style == 'auto' && !dimensions) dimensions = this.getDimensions(); + + style = styles[plane] = (style == 'auto') ? dimensions[plane] : style.toInt(); + size['total' + capitalized] = style; + + edges.each(function(edge){ + var edgesize = calculateEdgeSize(edge, styles); + size['computed' + edge.capitalize()] = edgesize; + size['total' + capitalized] += edgesize; + }); + + }, this); + + return Object.append(size, styles); + } + +}); + +})(); + + +/* +--- + +script: Element.Position.js + +name: Element.Position + +description: Extends the Element native object to include methods useful positioning elements relative to others. + +license: MIT-style license + +authors: + - Aaron Newton + - Jacob Thornton + +requires: + - Core/Options + - Core/Element.Dimensions + - Element.Measure + +provides: [Element.Position] + +... +*/ + +(function(original){ + +var local = Element.Position = { + + options: {/* + edge: false, + returnPos: false, + minimum: {x: 0, y: 0}, + maximum: {x: 0, y: 0}, + relFixedPosition: false, + ignoreMargins: false, + ignoreScroll: false, + allowNegative: false,*/ + relativeTo: document.body, + position: { + x: 'center', //left, center, right + y: 'center' //top, center, bottom + }, + offset: {x: 0, y: 0} + }, + + getOptions: function(element, options){ + options = Object.merge({}, local.options, options); + local.setPositionOption(options); + local.setEdgeOption(options); + local.setOffsetOption(element, options); + local.setDimensionsOption(element, options); + return options; + }, + + setPositionOption: function(options){ + options.position = local.getCoordinateFromValue(options.position); + }, + + setEdgeOption: function(options){ + var edgeOption = local.getCoordinateFromValue(options.edge); + options.edge = edgeOption ? edgeOption : + (options.position.x == 'center' && options.position.y == 'center') ? {x: 'center', y: 'center'} : + {x: 'left', y: 'top'}; + }, + + setOffsetOption: function(element, options){ + var parentOffset = {x: 0, y: 0}; + var parentScroll = {x: 0, y: 0}; + var offsetParent = element.measure(function(){ + return document.id(this.getOffsetParent()); + }); + + if (!offsetParent || offsetParent == element.getDocument().body) return; + + parentScroll = offsetParent.getScroll(); + parentOffset = offsetParent.measure(function(){ + var position = this.getPosition(); + if (this.getStyle('position') == 'fixed'){ + var scroll = window.getScroll(); + position.x += scroll.x; + position.y += scroll.y; + } + return position; + }); + + options.offset = { + parentPositioned: offsetParent != document.id(options.relativeTo), + x: options.offset.x - parentOffset.x + parentScroll.x, + y: options.offset.y - parentOffset.y + parentScroll.y + }; + }, + + setDimensionsOption: function(element, options){ + options.dimensions = element.getDimensions({ + computeSize: true, + styles: ['padding', 'border', 'margin'] + }); + }, + + getPosition: function(element, options){ + var position = {}; + options = local.getOptions(element, options); + var relativeTo = document.id(options.relativeTo) || document.body; + + local.setPositionCoordinates(options, position, relativeTo); + if (options.edge) local.toEdge(position, options); + + var offset = options.offset; + position.left = ((position.x >= 0 || offset.parentPositioned || options.allowNegative) ? position.x : 0).toInt(); + position.top = ((position.y >= 0 || offset.parentPositioned || options.allowNegative) ? position.y : 0).toInt(); + + local.toMinMax(position, options); + + if (options.relFixedPosition || relativeTo.getStyle('position') == 'fixed') local.toRelFixedPosition(relativeTo, position); + if (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position); + if (options.ignoreMargins) local.toIgnoreMargins(position, options); + + position.left = Math.ceil(position.left); + position.top = Math.ceil(position.top); + delete position.x; + delete position.y; + + return position; + }, + + setPositionCoordinates: function(options, position, relativeTo){ + var offsetY = options.offset.y, + offsetX = options.offset.x, + calc = (relativeTo == document.body) ? window.getScroll() : relativeTo.getPosition(), + top = calc.y, + left = calc.x, + winSize = window.getSize(); + + switch(options.position.x){ + case 'left': position.x = left + offsetX; break; + case 'right': position.x = left + offsetX + relativeTo.offsetWidth; break; + default: position.x = left + ((relativeTo == document.body ? winSize.x : relativeTo.offsetWidth) / 2) + offsetX; break; + } + + switch(options.position.y){ + case 'top': position.y = top + offsetY; break; + case 'bottom': position.y = top + offsetY + relativeTo.offsetHeight; break; + default: position.y = top + ((relativeTo == document.body ? winSize.y : relativeTo.offsetHeight) / 2) + offsetY; break; + } + }, + + toMinMax: function(position, options){ + var xy = {left: 'x', top: 'y'}, value; + ['minimum', 'maximum'].each(function(minmax){ + ['left', 'top'].each(function(lr){ + value = options[minmax] ? options[minmax][xy[lr]] : null; + if (value != null && ((minmax == 'minimum') ? position[lr] < value : position[lr] > value)) position[lr] = value; + }); + }); + }, + + toRelFixedPosition: function(relativeTo, position){ + var winScroll = window.getScroll(); + position.top += winScroll.y; + position.left += winScroll.x; + }, + + toIgnoreScroll: function(relativeTo, position){ + var relScroll = relativeTo.getScroll(); + position.top -= relScroll.y; + position.left -= relScroll.x; + }, + + toIgnoreMargins: function(position, options){ + position.left += options.edge.x == 'right' + ? options.dimensions['margin-right'] + : (options.edge.x != 'center' + ? -options.dimensions['margin-left'] + : -options.dimensions['margin-left'] + ((options.dimensions['margin-right'] + options.dimensions['margin-left']) / 2)); + + position.top += options.edge.y == 'bottom' + ? options.dimensions['margin-bottom'] + : (options.edge.y != 'center' + ? -options.dimensions['margin-top'] + : -options.dimensions['margin-top'] + ((options.dimensions['margin-bottom'] + options.dimensions['margin-top']) / 2)); + }, + + toEdge: function(position, options){ + var edgeOffset = {}, + dimensions = options.dimensions, + edge = options.edge; + + switch(edge.x){ + case 'left': edgeOffset.x = 0; break; + case 'right': edgeOffset.x = -dimensions.x - dimensions.computedRight - dimensions.computedLeft; break; + // center + default: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break; + } + + switch(edge.y){ + case 'top': edgeOffset.y = 0; break; + case 'bottom': edgeOffset.y = -dimensions.y - dimensions.computedTop - dimensions.computedBottom; break; + // center + default: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2)); break; + } + + position.x += edgeOffset.x; + position.y += edgeOffset.y; + }, + + getCoordinateFromValue: function(option){ + if (typeOf(option) != 'string') return option; + option = option.toLowerCase(); + + return { + x: option.test('left') ? 'left' + : (option.test('right') ? 'right' : 'center'), + y: option.test(/upper|top/) ? 'top' + : (option.test('bottom') ? 'bottom' : 'center') + }; + } + +}; + +Element.implement({ + + position: function(options){ + if (options && (options.x != null || options.y != null)){ + return (original ? original.apply(this, arguments) : this); + } + var position = this.setStyle('position', 'absolute').calculatePosition(options); + return (options && options.returnPos) ? position : this.setStyles(position); + }, + + calculatePosition: function(options){ + return local.getPosition(this, options); + } + +}); + +})(Element.prototype.position); + + +/* +--- + +script: IframeShim.js + +name: IframeShim + +description: Defines IframeShim, a class for obscuring select lists and flash objects in IE. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Element.Event + - Core/Element.Style + - Core/Options + - Core/Events + - Element.Position + - Class.Occlude + +provides: [IframeShim] + +... +*/ + +(function(){ + +var browsers = false; + + +this.IframeShim = new Class({ + + Implements: [Options, Events, Class.Occlude], + + options: { + className: 'iframeShim', + src: 'javascript:false;document.write("");', + display: false, + zIndex: null, + margin: 0, + offset: {x: 0, y: 0}, + browsers: browsers + }, + + property: 'IframeShim', + + initialize: function(element, options){ + this.element = document.id(element); + if (this.occlude()) return this.occluded; + this.setOptions(options); + this.makeShim(); + return this; + }, + + makeShim: function(){ + if (this.options.browsers){ + var zIndex = this.element.getStyle('zIndex').toInt(); + + if (!zIndex){ + zIndex = 1; + var pos = this.element.getStyle('position'); + if (pos == 'static' || !pos) this.element.setStyle('position', 'relative'); + this.element.setStyle('zIndex', zIndex); + } + zIndex = ((this.options.zIndex != null || this.options.zIndex === 0) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1; + if (zIndex < 0) zIndex = 1; + this.shim = new Element('iframe', { + src: this.options.src, + scrolling: 'no', + frameborder: 0, + styles: { + zIndex: zIndex, + position: 'absolute', + border: 'none', + filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)' + }, + 'class': this.options.className + }).store('IframeShim', this); + var inject = (function(){ + this.shim.inject(this.element, 'after'); + this[this.options.display ? 'show' : 'hide'](); + this.fireEvent('inject'); + }).bind(this); + if (!IframeShim.ready) window.addEvent('load', inject); + else inject(); + } else { + this.position = this.hide = this.show = this.dispose = Function.from(this); + } + }, + + position: function(){ + if (!IframeShim.ready || !this.shim) return this; + var size = this.element.measure(function(){ + return this.getSize(); + }); + if (this.options.margin != undefined){ + size.x = size.x - (this.options.margin * 2); + size.y = size.y - (this.options.margin * 2); + this.options.offset.x += this.options.margin; + this.options.offset.y += this.options.margin; + } + this.shim.set({width: size.x, height: size.y}).position({ + relativeTo: this.element, + offset: this.options.offset + }); + return this; + }, + + hide: function(){ + if (this.shim) this.shim.setStyle('display', 'none'); + return this; + }, + + show: function(){ + if (this.shim) this.shim.setStyle('display', 'block'); + return this.position(); + }, + + dispose: function(){ + if (this.shim) this.shim.dispose(); + return this; + }, + + destroy: function(){ + if (this.shim) this.shim.destroy(); + return this; + } + +}); + +})(); + +window.addEvent('load', function(){ + IframeShim.ready = true; +}); + + +/* +--- + +script: Mask.js + +name: Mask + +description: Creates a mask element to cover another. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Options + - Core/Events + - Core/Element.Event + - Class.Binds + - Element.Position + - IframeShim + +provides: [Mask] + +... +*/ + +var Mask = new Class({ + + Implements: [Options, Events], + + Binds: ['position'], + + options: {/* + onShow: function(){}, + onHide: function(){}, + onDestroy: function(){}, + onClick: function(event){}, + inject: { + where: 'after', + target: null, + }, + hideOnClick: false, + id: null, + destroyOnHide: false,*/ + style: {}, + 'class': 'mask', + maskMargins: false, + useIframeShim: true, + iframeShimOptions: {} + }, + + initialize: function(target, options){ + this.target = document.id(target) || document.id(document.body); + this.target.store('mask', this); + this.setOptions(options); + this.render(); + this.inject(); + }, + + render: function(){ + this.element = new Element('div', { + 'class': this.options['class'], + id: this.options.id || 'mask-' + String.uniqueID(), + styles: Object.merge({}, this.options.style, { + display: 'none' + }), + events: { + click: function(event){ + this.fireEvent('click', event); + if (this.options.hideOnClick) this.hide(); + }.bind(this) + } + }); + + this.hidden = true; + }, + + toElement: function(){ + return this.element; + }, + + inject: function(target, where){ + where = where || (this.options.inject ? this.options.inject.where : '') || (this.target == document.body ? 'inside' : 'after'); + target = target || (this.options.inject && this.options.inject.target) || this.target; + + this.element.inject(target, where); + + if (this.options.useIframeShim){ + this.shim = new IframeShim(this.element, this.options.iframeShimOptions); + + this.addEvents({ + show: this.shim.show.bind(this.shim), + hide: this.shim.hide.bind(this.shim), + destroy: this.shim.destroy.bind(this.shim) + }); + } + }, + + position: function(){ + this.resize(this.options.width, this.options.height); + + this.element.position({ + relativeTo: this.target, + position: 'topLeft', + ignoreMargins: !this.options.maskMargins, + ignoreScroll: this.target == document.body + }); + + return this; + }, + + resize: function(x, y){ + var opt = { + styles: ['padding', 'border'] + }; + if (this.options.maskMargins) opt.styles.push('margin'); + + var dim = this.target.getComputedSize(opt); + if (this.target == document.body){ + this.element.setStyles({width: 0, height: 0}); + var win = window.getScrollSize(); + if (dim.totalHeight < win.y) dim.totalHeight = win.y; + if (dim.totalWidth < win.x) dim.totalWidth = win.x; + } + this.element.setStyles({ + width: Array.pick([x, dim.totalWidth, dim.x]), + height: Array.pick([y, dim.totalHeight, dim.y]) + }); + + return this; + }, + + show: function(){ + if (!this.hidden) return this; + + window.addEvent('resize', this.position); + this.position(); + this.showMask.apply(this, arguments); + + return this; + }, + + showMask: function(){ + this.element.setStyle('display', 'block'); + this.hidden = false; + this.fireEvent('show'); + }, + + hide: function(){ + if (this.hidden) return this; + + window.removeEvent('resize', this.position); + this.hideMask.apply(this, arguments); + if (this.options.destroyOnHide) return this.destroy(); + + return this; + }, + + hideMask: function(){ + this.element.setStyle('display', 'none'); + this.hidden = true; + this.fireEvent('hide'); + }, + + toggle: function(){ + this[this.hidden ? 'show' : 'hide'](); + }, + + destroy: function(){ + this.hide(); + this.element.destroy(); + this.fireEvent('destroy'); + this.target.eliminate('mask'); + } + +}); + +Element.Properties.mask = { + + set: function(options){ + var mask = this.retrieve('mask'); + if (mask) mask.destroy(); + return this.eliminate('mask').store('mask:options', options); + }, + + get: function(){ + var mask = this.retrieve('mask'); + if (!mask){ + mask = new Mask(this, this.retrieve('mask:options')); + this.store('mask', mask); + } + return mask; + } + +}; + +Element.implement({ + + mask: function(options){ + if (options) this.set('mask', options); + this.get('mask').show(); + return this; + }, + + unmask: function(){ + this.get('mask').hide(); + return this; + } + +}); + + +/* +--- + +script: Spinner.js + +name: Spinner + +description: Adds a semi-transparent overlay over a dom element with a spinnin ajax icon. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Fx.Tween + - Core/Request + - Class.refactor + - Mask + +provides: [Spinner] + +... +*/ + +var Spinner = new Class({ + + Extends: Mask, + + Implements: Chain, + + options: {/* + message: false,*/ + 'class': 'spinner', + containerPosition: {}, + content: { + 'class': 'spinner-content' + }, + messageContainer: { + 'class': 'spinner-msg' + }, + img: { + 'class': 'spinner-img' + }, + fxOptions: { + link: 'chain' + } + }, + + initialize: function(target, options){ + this.target = document.id(target) || document.id(document.body); + this.target.store('spinner', this); + this.setOptions(options); + this.render(); + this.inject(); + + // Add this to events for when noFx is true; parent methods handle hide/show. + var deactivate = function(){ this.active = false; }.bind(this); + this.addEvents({ + hide: deactivate, + show: deactivate + }); + }, + + render: function(){ + this.parent(); + + this.element.set('id', this.options.id || 'spinner-' + String.uniqueID()); + + this.content = document.id(this.options.content) || new Element('div', this.options.content); + this.content.inject(this.element); + + if (this.options.message){ + this.msg = document.id(this.options.message) || new Element('p', this.options.messageContainer).appendText(this.options.message); + this.msg.inject(this.content); + } + + if (this.options.img){ + this.img = document.id(this.options.img) || new Element('div', this.options.img); + this.img.inject(this.content); + } + + this.element.set('tween', this.options.fxOptions); + }, + + show: function(noFx){ + if (this.active) return this.chain(this.show.bind(this)); + if (!this.hidden){ + this.callChain.delay(20, this); + return this; + } + + this.target.set('aria-busy', 'true'); + this.active = true; + + return this.parent(noFx); + }, + + showMask: function(noFx){ + var pos = function(){ + this.content.position(Object.merge({ + relativeTo: this.element + }, this.options.containerPosition)); + }.bind(this); + + if (noFx){ + this.parent(); + pos(); + } else { + if (!this.options.style.opacity) this.options.style.opacity = this.element.getStyle('opacity').toFloat(); + this.element.setStyles({ + display: 'block', + opacity: 0 + }).tween('opacity', this.options.style.opacity); + pos(); + this.hidden = false; + this.fireEvent('show'); + this.callChain(); + } + }, + + hide: function(noFx){ + if (this.active) return this.chain(this.hide.bind(this)); + if (this.hidden){ + this.callChain.delay(20, this); + return this; + } + + this.target.set('aria-busy', 'false'); + this.active = true; + + return this.parent(noFx); + }, + + hideMask: function(noFx){ + if (noFx) return this.parent(); + this.element.tween('opacity', 0).get('tween').chain(function(){ + this.element.setStyle('display', 'none'); + this.hidden = true; + this.fireEvent('hide'); + this.callChain(); + }.bind(this)); + }, + + destroy: function(){ + this.content.destroy(); + this.parent(); + this.target.eliminate('spinner'); + } + +}); + +Request = Class.refactor(Request, { + + options: { + useSpinner: false, + spinnerOptions: {}, + spinnerTarget: false + }, + + initialize: function(options){ + this._send = this.send; + this.send = function(options){ + var spinner = this.getSpinner(); + if (spinner) spinner.chain(this._send.pass(options, this)).show(); + else this._send(options); + return this; + }; + this.previous(options); + }, + + getSpinner: function(){ + if (!this.spinner){ + var update = document.id(this.options.spinnerTarget) || document.id(this.options.update); + if (this.options.useSpinner && update){ + update.set('spinner', this.options.spinnerOptions); + var spinner = this.spinner = update.get('spinner'); + ['complete', 'exception', 'cancel'].each(function(event){ + this.addEvent(event, spinner.hide.bind(spinner)); + }, this); + } + } + return this.spinner; + } + +}); + +Element.Properties.spinner = { + + set: function(options){ + var spinner = this.retrieve('spinner'); + if (spinner) spinner.destroy(); + return this.eliminate('spinner').store('spinner:options', options); + }, + + get: function(){ + var spinner = this.retrieve('spinner'); + if (!spinner){ + spinner = new Spinner(this, this.retrieve('spinner:options')); + this.store('spinner', spinner); + } + return spinner; + } + +}; + +Element.implement({ + + spin: function(options){ + if (options) this.set('spinner', options); + this.get('spinner').show(); + return this; + }, + + unspin: function(){ + this.get('spinner').hide(); + return this; + } + +}); + + +/* +--- + +script: String.QueryString.js + +name: String.QueryString + +description: Methods for dealing with URI query strings. + +license: MIT-style license + +authors: + - Sebastian Markbåge + - Aaron Newton + - Lennart Pilon + - Valerio Proietti + +requires: + - Core/Array + - Core/String + - MooTools.More + +provides: [String.QueryString] + +... +*/ + +String.implement({ + + parseQueryString: function(decodeKeys, decodeValues){ + if (decodeKeys == null) decodeKeys = true; + if (decodeValues == null) decodeValues = true; + + var vars = this.split(/[&;]/), + object = {}; + if (!vars.length) return object; + + vars.each(function(val){ + var index = val.indexOf('=') + 1, + value = index ? val.substr(index) : '', + keys = index ? val.substr(0, index - 1).match(/([^\]\[]+|(\B)(?=\]))/g) : [val], + obj = object; + if (!keys) return; + if (decodeValues) value = decodeURIComponent(value); + keys.each(function(key, i){ + if (decodeKeys) key = decodeURIComponent(key); + var current = obj[key]; + + if (i < keys.length - 1) obj = obj[key] = current || {}; + else if (typeOf(current) == 'array') current.push(value); + else obj[key] = current != null ? [current, value] : value; + }); + }); + + return object; + }, + + cleanQueryString: function(method){ + return this.split('&').filter(function(val){ + var index = val.indexOf('='), + key = index < 0 ? '' : val.substr(0, index), + value = val.substr(index + 1); + + return method ? method.call(null, key, value) : (value || value === 0); + }).join('&'); + } + +}); + + +/* +--- + +name: Events.Pseudos + +description: Adds the functionality to add pseudo events + +license: MIT-style license + +authors: + - Arian Stolwijk + +requires: [Core/Class.Extras, Core/Slick.Parser, MooTools.More] + +provides: [Events.Pseudos] + +... +*/ + +(function(){ + +Events.Pseudos = function(pseudos, addEvent, removeEvent){ + + var storeKey = '_monitorEvents:'; + + var storageOf = function(object){ + return { + store: object.store ? function(key, value){ + object.store(storeKey + key, value); + } : function(key, value){ + (object._monitorEvents || (object._monitorEvents = {}))[key] = value; + }, + retrieve: object.retrieve ? function(key, dflt){ + return object.retrieve(storeKey + key, dflt); + } : function(key, dflt){ + if (!object._monitorEvents) return dflt; + return object._monitorEvents[key] || dflt; + } + }; + }; + + var splitType = function(type){ + if (type.indexOf(':') == -1 || !pseudos) return null; + + var parsed = Slick.parse(type).expressions[0][0], + parsedPseudos = parsed.pseudos, + l = parsedPseudos.length, + splits = []; + + while (l--){ + var pseudo = parsedPseudos[l].key, + listener = pseudos[pseudo]; + if (listener != null) splits.push({ + event: parsed.tag, + value: parsedPseudos[l].value, + pseudo: pseudo, + original: type, + listener: listener + }); + } + return splits.length ? splits : null; + }; + + return { + + addEvent: function(type, fn, internal){ + var split = splitType(type); + if (!split) return addEvent.call(this, type, fn, internal); + + var storage = storageOf(this), + events = storage.retrieve(type, []), + eventType = split[0].event, + args = Array.slice(arguments, 2), + stack = fn, + self = this; + + split.each(function(item){ + var listener = item.listener, + stackFn = stack; + if (listener == false) eventType += ':' + item.pseudo + '(' + item.value + ')'; + else stack = function(){ + listener.call(self, item, stackFn, arguments, stack); + }; + }); + + events.include({type: eventType, event: fn, monitor: stack}); + storage.store(type, events); + + if (type != eventType) addEvent.apply(this, [type, fn].concat(args)); + return addEvent.apply(this, [eventType, stack].concat(args)); + }, + + removeEvent: function(type, fn){ + var split = splitType(type); + if (!split) return removeEvent.call(this, type, fn); + + var storage = storageOf(this), + events = storage.retrieve(type); + if (!events) return this; + + var args = Array.slice(arguments, 2); + + removeEvent.apply(this, [type, fn].concat(args)); + events.each(function(monitor, i){ + if (!fn || monitor.event == fn) removeEvent.apply(this, [monitor.type, monitor.monitor].concat(args)); + delete events[i]; + }, this); + + storage.store(type, events); + return this; + } + + }; + +}; + +var pseudos = { + + once: function(split, fn, args, monitor){ + fn.apply(this, args); + this.removeEvent(split.event, monitor) + .removeEvent(split.original, fn); + }, + + throttle: function(split, fn, args){ + if (!fn._throttled){ + fn.apply(this, args); + fn._throttled = setTimeout(function(){ + fn._throttled = false; + }, split.value || 250); + } + }, + + pause: function(split, fn, args){ + clearTimeout(fn._pause); + fn._pause = fn.delay(split.value || 250, this, args); + } + +}; + +Events.definePseudo = function(key, listener){ + pseudos[key] = listener; + return this; +}; + +Events.lookupPseudo = function(key){ + return pseudos[key]; +}; + +var proto = Events.prototype; +Events.implement(Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent)); + +['Request', 'Fx'].each(function(klass){ + if (this[klass]) this[klass].implement(Events.prototype); +}); + +})(); + + +/* +--- + +name: Element.Event.Pseudos + +description: Adds the functionality to add pseudo events for Elements + +license: MIT-style license + +authors: + - Arian Stolwijk + +requires: [Core/Element.Event, Core/Element.Delegation, Events.Pseudos] + +provides: [Element.Event.Pseudos, Element.Delegation.Pseudo] + +... +*/ + +(function(){ + +var pseudos = {relay: false}, + copyFromEvents = ['once', 'throttle', 'pause'], + count = copyFromEvents.length; + +while (count--) pseudos[copyFromEvents[count]] = Events.lookupPseudo(copyFromEvents[count]); + +DOMEvent.definePseudo = function(key, listener){ + pseudos[key] = listener; + return this; +}; + +var proto = Element.prototype; +[Element, Window, Document].invoke('implement', Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent)); + +})(); + + +/* +--- + +script: Form.Request.js + +name: Form.Request + +description: Handles the basic functionality of submitting a form and updating a dom element with the result. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Request.HTML + - Class.Binds + - Class.Occlude + - Spinner + - String.QueryString + - Element.Delegation.Pseudo + +provides: [Form.Request] + +... +*/ + +if (!window.Form) window.Form = {}; + +(function(){ + + Form.Request = new Class({ + + Binds: ['onSubmit', 'onFormValidate'], + + Implements: [Options, Events, Class.Occlude], + + options: {/* + onFailure: function(){}, + onSuccess: function(){}, // aliased to onComplete, + onSend: function(){}*/ + requestOptions: { + evalScripts: true, + useSpinner: true, + emulation: false, + link: 'ignore' + }, + sendButtonClicked: true, + extraData: {}, + resetForm: true + }, + + property: 'form.request', + + initialize: function(form, target, options){ + this.element = document.id(form); + if (this.occlude()) return this.occluded; + this.setOptions(options) + .setTarget(target) + .attach(); + }, + + setTarget: function(target){ + this.target = document.id(target); + if (!this.request){ + this.makeRequest(); + } else { + this.request.setOptions({ + update: this.target + }); + } + return this; + }, + + toElement: function(){ + return this.element; + }, + + makeRequest: function(){ + var self = this; + this.request = new Request.HTML(Object.merge({ + update: this.target, + emulation: false, + spinnerTarget: this.element, + method: this.element.get('method') || 'post' + }, this.options.requestOptions)).addEvents({ + success: function(tree, elements, html, javascript){ + ['complete', 'success'].each(function(evt){ + self.fireEvent(evt, [self.target, tree, elements, html, javascript]); + }); + }, + failure: function(){ + self.fireEvent('complete', arguments).fireEvent('failure', arguments); + }, + exception: function(){ + self.fireEvent('failure', arguments); + } + }); + return this.attachReset(); + }, + + attachReset: function(){ + if (!this.options.resetForm) return this; + this.request.addEvent('success', function(){ + Function.attempt(function(){ + this.element.reset(); + }.bind(this)); + if (window.OverText) OverText.update(); + }.bind(this)); + return this; + }, + + attach: function(attach){ + var method = (attach != false) ? 'addEvent' : 'removeEvent'; + this.element[method]('click:relay(button, input[type=submit])', this.saveClickedButton.bind(this)); + + var fv = this.element.retrieve('validator'); + if (fv) fv[method]('onFormValidate', this.onFormValidate); + else this.element[method]('submit', this.onSubmit); + + return this; + }, + + detach: function(){ + return this.attach(false); + }, + + //public method + enable: function(){ + return this.attach(); + }, + + //public method + disable: function(){ + return this.detach(); + }, + + onFormValidate: function(valid, form, event){ + //if there's no event, then this wasn't a submit event + if (!event) return; + var fv = this.element.retrieve('validator'); + if (valid || (fv && !fv.options.stopOnFailure)){ + event.stop(); + this.send(); + } + }, + + onSubmit: function(event){ + var fv = this.element.retrieve('validator'); + if (fv){ + //form validator was created after Form.Request + this.element.removeEvent('submit', this.onSubmit); + fv.addEvent('onFormValidate', this.onFormValidate); + fv.validate(event); + return; + } + if (event) event.stop(); + this.send(); + }, + + saveClickedButton: function(event, target){ + var targetName = target.get('name'); + if (!targetName || !this.options.sendButtonClicked) return; + this.options.extraData[targetName] = target.get('value') || true; + this.clickedCleaner = function(){ + delete this.options.extraData[targetName]; + this.clickedCleaner = function(){}; + }.bind(this); + }, + + clickedCleaner: function(){}, + + send: function(){ + var str = this.element.toQueryString().trim(), + data = Object.toQueryString(this.options.extraData); + + if (str) str += "&" + data; + else str = data; + + this.fireEvent('send', [this.element, str.parseQueryString()]); + this.request.send({ + data: str, + url: this.options.requestOptions.url || this.element.get('action') + }); + this.clickedCleaner(); + return this; + } + + }); + + Element.implement('formUpdate', function(update, options){ + var fq = this.retrieve('form.request'); + if (!fq){ + fq = new Form.Request(this, update, options); + } else { + if (update) fq.setTarget(update); + if (options) fq.setOptions(options).makeRequest(); + } + fq.send(); + return this; + }); + +})(); + + +/* +--- + +script: Element.Shortcuts.js + +name: Element.Shortcuts + +description: Extends the Element native object to include some shortcut methods. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Element.Style + - MooTools.More + +provides: [Element.Shortcuts] + +... +*/ + +Element.implement({ + + isDisplayed: function(){ + return this.getStyle('display') != 'none'; + }, + + isVisible: function(){ + var w = this.offsetWidth, + h = this.offsetHeight; + return (w == 0 && h == 0) ? false : (w > 0 && h > 0) ? true : this.style.display != 'none'; + }, + + toggle: function(){ + return this[this.isDisplayed() ? 'hide' : 'show'](); + }, + + hide: function(){ + var d; + try { + //IE fails here if the element is not in the dom + d = this.getStyle('display'); + } catch(e){} + if (d == 'none') return this; + return this.store('element:_originalDisplay', d || '').setStyle('display', 'none'); + }, + + show: function(display){ + if (!display && this.isDisplayed()) return this; + display = display || this.retrieve('element:_originalDisplay') || 'block'; + return this.setStyle('display', (display == 'none') ? 'block' : display); + }, + + swapClass: function(remove, add){ + return this.removeClass(remove).addClass(add); + } + +}); + +Document.implement({ + + clearSelection: function(){ + if (window.getSelection){ + var selection = window.getSelection(); + if (selection && selection.removeAllRanges) selection.removeAllRanges(); + } else if (document.selection && document.selection.empty){ + try { + //IE fails here if selected element is not in dom + document.selection.empty(); + } catch(e){} + } + } + +}); + + +/* +--- + +script: Fx.Reveal.js + +name: Fx.Reveal + +description: Defines Fx.Reveal, a class that shows and hides elements with a transition. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Fx.Morph + - Element.Shortcuts + - Element.Measure + +provides: [Fx.Reveal] + +... +*/ + +(function(){ + + +var hideTheseOf = function(object){ + var hideThese = object.options.hideInputs; + if (window.OverText){ + var otClasses = [null]; + OverText.each(function(ot){ + otClasses.include('.' + ot.options.labelClass); + }); + if (otClasses) hideThese += otClasses.join(', '); + } + return (hideThese) ? object.element.getElements(hideThese) : null; +}; + + +Fx.Reveal = new Class({ + + Extends: Fx.Morph, + + options: {/* + onShow: function(thisElement){}, + onHide: function(thisElement){}, + onComplete: function(thisElement){}, + heightOverride: null, + widthOverride: null,*/ + link: 'cancel', + styles: ['padding', 'border', 'margin'], + transitionOpacity: 'opacity' in document.documentElement, + mode: 'vertical', + display: function(){ + return this.element.get('tag') != 'tr' ? 'block' : 'table-row'; + }, + opacity: 1, + hideInputs: !('opacity' in document.documentElement) ? 'select, input, textarea, object, embed' : null + }, + + dissolve: function(){ + if (!this.hiding && !this.showing){ + if (this.element.getStyle('display') != 'none'){ + this.hiding = true; + this.showing = false; + this.hidden = true; + this.cssText = this.element.style.cssText; + + var startStyles = this.element.getComputedSize({ + styles: this.options.styles, + mode: this.options.mode + }); + if (this.options.transitionOpacity) startStyles.opacity = this.options.opacity; + + var zero = {}; + Object.each(startStyles, function(style, name){ + zero[name] = [style, 0]; + }); + + this.element.setStyles({ + display: Function.from(this.options.display).call(this), + overflow: 'hidden' + }); + + var hideThese = hideTheseOf(this); + if (hideThese) hideThese.setStyle('visibility', 'hidden'); + + this.$chain.unshift(function(){ + if (this.hidden){ + this.hiding = false; + this.element.style.cssText = this.cssText; + this.element.setStyle('display', 'none'); + if (hideThese) hideThese.setStyle('visibility', 'visible'); + } + this.fireEvent('hide', this.element); + this.callChain(); + }.bind(this)); + + this.start(zero); + } else { + this.callChain.delay(10, this); + this.fireEvent('complete', this.element); + this.fireEvent('hide', this.element); + } + } else if (this.options.link == 'chain'){ + this.chain(this.dissolve.bind(this)); + } else if (this.options.link == 'cancel' && !this.hiding){ + this.cancel(); + this.dissolve(); + } + return this; + }, + + reveal: function(){ + if (!this.showing && !this.hiding){ + if (this.element.getStyle('display') == 'none'){ + this.hiding = false; + this.showing = true; + this.hidden = false; + this.cssText = this.element.style.cssText; + + var startStyles; + this.element.measure(function(){ + startStyles = this.element.getComputedSize({ + styles: this.options.styles, + mode: this.options.mode + }); + }.bind(this)); + if (this.options.heightOverride != null) startStyles.height = this.options.heightOverride.toInt(); + if (this.options.widthOverride != null) startStyles.width = this.options.widthOverride.toInt(); + if (this.options.transitionOpacity){ + this.element.setStyle('opacity', 0); + startStyles.opacity = this.options.opacity; + } + + var zero = { + height: 0, + display: Function.from(this.options.display).call(this) + }; + Object.each(startStyles, function(style, name){ + zero[name] = 0; + }); + zero.overflow = 'hidden'; + + this.element.setStyles(zero); + + var hideThese = hideTheseOf(this); + if (hideThese) hideThese.setStyle('visibility', 'hidden'); + + this.$chain.unshift(function(){ + this.element.style.cssText = this.cssText; + this.element.setStyle('display', Function.from(this.options.display).call(this)); + if (!this.hidden) this.showing = false; + if (hideThese) hideThese.setStyle('visibility', 'visible'); + this.callChain(); + this.fireEvent('show', this.element); + }.bind(this)); + + this.start(startStyles); + } else { + this.callChain(); + this.fireEvent('complete', this.element); + this.fireEvent('show', this.element); + } + } else if (this.options.link == 'chain'){ + this.chain(this.reveal.bind(this)); + } else if (this.options.link == 'cancel' && !this.showing){ + this.cancel(); + this.reveal(); + } + return this; + }, + + toggle: function(){ + if (this.element.getStyle('display') == 'none'){ + this.reveal(); + } else { + this.dissolve(); + } + return this; + }, + + cancel: function(){ + this.parent.apply(this, arguments); + if (this.cssText != null) this.element.style.cssText = this.cssText; + this.hiding = false; + this.showing = false; + return this; + } + +}); + +Element.Properties.reveal = { + + set: function(options){ + this.get('reveal').cancel().setOptions(options); + return this; + }, + + get: function(){ + var reveal = this.retrieve('reveal'); + if (!reveal){ + reveal = new Fx.Reveal(this); + this.store('reveal', reveal); + } + return reveal; + } + +}; + +Element.Properties.dissolve = Element.Properties.reveal; + +Element.implement({ + + reveal: function(options){ + this.get('reveal').setOptions(options).reveal(); + return this; + }, + + dissolve: function(options){ + this.get('reveal').setOptions(options).dissolve(); + return this; + }, + + nix: function(options){ + var params = Array.link(arguments, {destroy: Type.isBoolean, options: Type.isObject}); + this.get('reveal').setOptions(options).dissolve().chain(function(){ + this[params.destroy ? 'destroy' : 'dispose'](); + }.bind(this)); + return this; + }, + + wink: function(){ + var params = Array.link(arguments, {duration: Type.isNumber, options: Type.isObject}); + var reveal = this.get('reveal').setOptions(params.options); + reveal.reveal().chain(function(){ + (function(){ + reveal.dissolve(); + }).delay(params.duration || 2000); + }); + } + +}); + +})(); + + +/* +--- + +script: Drag.js + +name: Drag + +description: The base Drag Class. Can be used to drag and resize Elements using mouse events. + +license: MIT-style license + +authors: + - Valerio Proietti + - Tom Occhinno + - Jan Kassens + +requires: + - Core/Events + - Core/Options + - Core/Element.Event + - Core/Element.Style + - Core/Element.Dimensions + - MooTools.More + +provides: [Drag] +... + +*/ + +var Drag = new Class({ + + Implements: [Events, Options], + + options: {/* + onBeforeStart: function(thisElement){}, + onStart: function(thisElement, event){}, + onSnap: function(thisElement){}, + onDrag: function(thisElement, event){}, + onCancel: function(thisElement){}, + onComplete: function(thisElement, event){},*/ + snap: 6, + unit: 'px', + grid: false, + style: true, + limit: false, + handle: false, + invert: false, + preventDefault: false, + stopPropagation: false, + modifiers: {x: 'left', y: 'top'} + }, + + initialize: function(){ + var params = Array.link(arguments, { + 'options': Type.isObject, + 'element': function(obj){ + return obj != null; + } + }); + + this.element = document.id(params.element); + this.document = this.element.getDocument(); + this.setOptions(params.options || {}); + var htype = typeOf(this.options.handle); + this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element; + this.mouse = {'now': {}, 'pos': {}}; + this.value = {'start': {}, 'now': {}}; + + this.selection = 'selectstart' in document ? 'selectstart' : 'mousedown'; + + + if ('ondragstart' in document && !('FileReader' in window) && !Drag.ondragstartFixed){ + document.ondragstart = Function.from(false); + Drag.ondragstartFixed = true; + } + + this.bound = { + start: this.start.bind(this), + check: this.check.bind(this), + drag: this.drag.bind(this), + stop: this.stop.bind(this), + cancel: this.cancel.bind(this), + eventStop: Function.from(false) + }; + this.attach(); + }, + + attach: function(){ + this.handles.addEvent('mousedown', this.bound.start); + return this; + }, + + detach: function(){ + this.handles.removeEvent('mousedown', this.bound.start); + return this; + }, + + start: function(event){ + var options = this.options; + + if (event.rightClick) return; + + if (options.preventDefault) event.preventDefault(); + if (options.stopPropagation) event.stopPropagation(); + this.mouse.start = event.page; + + this.fireEvent('beforeStart', this.element); + + var limit = options.limit; + this.limit = {x: [], y: []}; + + var z, coordinates; + for (z in options.modifiers){ + if (!options.modifiers[z]) continue; + + var style = this.element.getStyle(options.modifiers[z]); + + // Some browsers (IE and Opera) don't always return pixels. + if (style && !style.match(/px$/)){ + if (!coordinates) coordinates = this.element.getCoordinates(this.element.getOffsetParent()); + style = coordinates[options.modifiers[z]]; + } + + if (options.style) this.value.now[z] = (style || 0).toInt(); + else this.value.now[z] = this.element[options.modifiers[z]]; + + if (options.invert) this.value.now[z] *= -1; + + this.mouse.pos[z] = event.page[z] - this.value.now[z]; + + if (limit && limit[z]){ + var i = 2; + while (i--){ + var limitZI = limit[z][i]; + if (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI == 'function') ? limitZI() : limitZI; + } + } + } + + if (typeOf(this.options.grid) == 'number') this.options.grid = { + x: this.options.grid, + y: this.options.grid + }; + + var events = { + mousemove: this.bound.check, + mouseup: this.bound.cancel + }; + events[this.selection] = this.bound.eventStop; + this.document.addEvents(events); + }, + + check: function(event){ + if (this.options.preventDefault) event.preventDefault(); + var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2))); + if (distance > this.options.snap){ + this.cancel(); + this.document.addEvents({ + mousemove: this.bound.drag, + mouseup: this.bound.stop + }); + this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element); + } + }, + + drag: function(event){ + var options = this.options; + + if (options.preventDefault) event.preventDefault(); + this.mouse.now = event.page; + + for (var z in options.modifiers){ + if (!options.modifiers[z]) continue; + this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z]; + + if (options.invert) this.value.now[z] *= -1; + + if (options.limit && this.limit[z]){ + if ((this.limit[z][1] || this.limit[z][1] === 0) && (this.value.now[z] > this.limit[z][1])){ + this.value.now[z] = this.limit[z][1]; + } else if ((this.limit[z][0] || this.limit[z][0] === 0) && (this.value.now[z] < this.limit[z][0])){ + this.value.now[z] = this.limit[z][0]; + } + } + + if (options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % options.grid[z]); + + if (options.style) this.element.setStyle(options.modifiers[z], this.value.now[z] + options.unit); + else this.element[options.modifiers[z]] = this.value.now[z]; + } + + this.fireEvent('drag', [this.element, event]); + }, + + cancel: function(event){ + this.document.removeEvents({ + mousemove: this.bound.check, + mouseup: this.bound.cancel + }); + if (event){ + this.document.removeEvent(this.selection, this.bound.eventStop); + this.fireEvent('cancel', this.element); + } + }, + + stop: function(event){ + var events = { + mousemove: this.bound.drag, + mouseup: this.bound.stop + }; + events[this.selection] = this.bound.eventStop; + this.document.removeEvents(events); + if (event) this.fireEvent('complete', [this.element, event]); + } + +}); + +Element.implement({ + + makeResizable: function(options){ + var drag = new Drag(this, Object.merge({ + modifiers: { + x: 'width', + y: 'height' + } + }, options)); + + this.store('resizer', drag); + return drag.addEvent('drag', function(){ + this.fireEvent('resize', drag); + }.bind(this)); + } + +}); + + +/* +--- + +script: Drag.Move.js + +name: Drag.Move + +description: A Drag extension that provides support for the constraining of draggables to containers and droppables. + +license: MIT-style license + +authors: + - Valerio Proietti + - Tom Occhinno + - Jan Kassens + - Aaron Newton + - Scott Kyle + +requires: + - Core/Element.Dimensions + - Drag + +provides: [Drag.Move] + +... +*/ + +Drag.Move = new Class({ + + Extends: Drag, + + options: {/* + onEnter: function(thisElement, overed){}, + onLeave: function(thisElement, overed){}, + onDrop: function(thisElement, overed, event){},*/ + droppables: [], + container: false, + precalculate: false, + includeMargins: true, + checkDroppables: true + }, + + initialize: function(element, options){ + this.parent(element, options); + element = this.element; + + this.droppables = $$(this.options.droppables); + this.setContainer(this.options.container); + + if (this.options.style){ + if (this.options.modifiers.x == 'left' && this.options.modifiers.y == 'top'){ + var parent = element.getOffsetParent(), + styles = element.getStyles('left', 'top'); + if (parent && (styles.left == 'auto' || styles.top == 'auto')){ + element.setPosition(element.getPosition(parent)); + } + } + + if (element.getStyle('position') == 'static') element.setStyle('position', 'absolute'); + } + + this.addEvent('start', this.checkDroppables, true); + this.overed = null; + }, + + setContainer: function(container) { + this.container = document.id(container); + if (this.container && typeOf(this.container) != 'element'){ + this.container = document.id(this.container.getDocument().body); + } + }, + + start: function(event){ + if (this.container) this.options.limit = this.calculateLimit(); + + if (this.options.precalculate){ + this.positions = this.droppables.map(function(el){ + return el.getCoordinates(); + }); + } + + this.parent(event); + }, + + calculateLimit: function(){ + var element = this.element, + container = this.container, + + offsetParent = document.id(element.getOffsetParent()) || document.body, + containerCoordinates = container.getCoordinates(offsetParent), + elementMargin = {}, + elementBorder = {}, + containerMargin = {}, + containerBorder = {}, + offsetParentPadding = {}; + + ['top', 'right', 'bottom', 'left'].each(function(pad){ + elementMargin[pad] = element.getStyle('margin-' + pad).toInt(); + elementBorder[pad] = element.getStyle('border-' + pad).toInt(); + containerMargin[pad] = container.getStyle('margin-' + pad).toInt(); + containerBorder[pad] = container.getStyle('border-' + pad).toInt(); + offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt(); + }, this); + + var width = element.offsetWidth + elementMargin.left + elementMargin.right, + height = element.offsetHeight + elementMargin.top + elementMargin.bottom, + left = 0, + top = 0, + right = containerCoordinates.right - containerBorder.right - width, + bottom = containerCoordinates.bottom - containerBorder.bottom - height; + + if (this.options.includeMargins){ + left += elementMargin.left; + top += elementMargin.top; + } else { + right += elementMargin.right; + bottom += elementMargin.bottom; + } + + if (element.getStyle('position') == 'relative'){ + var coords = element.getCoordinates(offsetParent); + coords.left -= element.getStyle('left').toInt(); + coords.top -= element.getStyle('top').toInt(); + + left -= coords.left; + top -= coords.top; + if (container.getStyle('position') != 'relative'){ + left += containerBorder.left; + top += containerBorder.top; + } + right += elementMargin.left - coords.left; + bottom += elementMargin.top - coords.top; + + if (container != offsetParent){ + left += containerMargin.left + offsetParentPadding.left; + if (!offsetParentPadding.left && left < 0) left = 0; + top += offsetParent == document.body ? 0 : containerMargin.top + offsetParentPadding.top; + if (!offsetParentPadding.top && top < 0) top = 0; + } + } else { + left -= elementMargin.left; + top -= elementMargin.top; + if (container != offsetParent){ + left += containerCoordinates.left + containerBorder.left; + top += containerCoordinates.top + containerBorder.top; + } + } + + return { + x: [left, right], + y: [top, bottom] + }; + }, + + getDroppableCoordinates: function(element){ + var position = element.getCoordinates(); + if (element.getStyle('position') == 'fixed'){ + var scroll = window.getScroll(); + position.left += scroll.x; + position.right += scroll.x; + position.top += scroll.y; + position.bottom += scroll.y; + } + return position; + }, + + checkDroppables: function(){ + var overed = this.droppables.filter(function(el, i){ + el = this.positions ? this.positions[i] : this.getDroppableCoordinates(el); + var now = this.mouse.now; + return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top); + }, this).getLast(); + + if (this.overed != overed){ + if (this.overed) this.fireEvent('leave', [this.element, this.overed]); + if (overed) this.fireEvent('enter', [this.element, overed]); + this.overed = overed; + } + }, + + drag: function(event){ + this.parent(event); + if (this.options.checkDroppables && this.droppables.length) this.checkDroppables(); + }, + + stop: function(event){ + this.checkDroppables(); + this.fireEvent('drop', [this.element, this.overed, event]); + this.overed = null; + return this.parent(event); + } + +}); + +Element.implement({ + + makeDraggable: function(options){ + var drag = new Drag.Move(this, options); + this.store('dragger', drag); + return drag; + } + +}); + + +/* +--- + +script: Sortables.js + +name: Sortables + +description: Class for creating a drag and drop sorting interface for lists of items. + +license: MIT-style license + +authors: + - Tom Occhino + +requires: + - Core/Fx.Morph + - Drag.Move + +provides: [Sortables] + +... +*/ + +var Sortables = new Class({ + + Implements: [Events, Options], + + options: {/* + onSort: function(element, clone){}, + onStart: function(element, clone){}, + onComplete: function(element){},*/ + opacity: 1, + clone: false, + revert: false, + handle: false, + dragOptions: {}, + unDraggableTags: ['button', 'input', 'a', 'textarea', 'select', 'option'] + }, + + initialize: function(lists, options){ + this.setOptions(options); + + this.elements = []; + this.lists = []; + this.idle = true; + + this.addLists($$(document.id(lists) || lists)); + + if (!this.options.clone) this.options.revert = false; + if (this.options.revert) this.effect = new Fx.Morph(null, Object.merge({ + duration: 250, + link: 'cancel' + }, this.options.revert)); + }, + + attach: function(){ + this.addLists(this.lists); + return this; + }, + + detach: function(){ + this.lists = this.removeLists(this.lists); + return this; + }, + + addItems: function(){ + Array.flatten(arguments).each(function(element){ + this.elements.push(element); + var start = element.retrieve('sortables:start', function(event){ + this.start.call(this, event, element); + }.bind(this)); + (this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start); + }, this); + return this; + }, + + addLists: function(){ + Array.flatten(arguments).each(function(list){ + this.lists.include(list); + this.addItems(list.getChildren()); + }, this); + return this; + }, + + removeItems: function(){ + return $$(Array.flatten(arguments).map(function(element){ + this.elements.erase(element); + var start = element.retrieve('sortables:start'); + (this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start); + + return element; + }, this)); + }, + + removeLists: function(){ + return $$(Array.flatten(arguments).map(function(list){ + this.lists.erase(list); + this.removeItems(list.getChildren()); + + return list; + }, this)); + }, + + getDroppableCoordinates: function (element){ + var offsetParent = element.getOffsetParent(); + var position = element.getPosition(offsetParent); + var scroll = { + w: window.getScroll(), + offsetParent: offsetParent.getScroll() + }; + position.x += scroll.offsetParent.x; + position.y += scroll.offsetParent.y; + + if (offsetParent.getStyle('position') == 'fixed'){ + position.x -= scroll.w.x; + position.y -= scroll.w.y; + } + + return position; + }, + + getClone: function(event, element){ + if (!this.options.clone) return new Element(element.tagName).inject(document.body); + if (typeOf(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list); + var clone = element.clone(true).setStyles({ + margin: 0, + position: 'absolute', + visibility: 'hidden', + width: element.getStyle('width') + }).addEvent('mousedown', function(event){ + element.fireEvent('mousedown', event); + }); + //prevent the duplicated radio inputs from unchecking the real one + if (clone.get('html').test('radio')){ + clone.getElements('input[type=radio]').each(function(input, i){ + input.set('name', 'clone_' + i); + if (input.get('checked')) element.getElements('input[type=radio]')[i].set('checked', true); + }); + } + + return clone.inject(this.list).setPosition(this.getDroppableCoordinates(this.element)); + }, + + getDroppables: function(){ + var droppables = this.list.getChildren().erase(this.clone).erase(this.element); + if (!this.options.constrain) droppables.append(this.lists).erase(this.list); + return droppables; + }, + + insert: function(dragging, element){ + var where = 'inside'; + if (this.lists.contains(element)){ + this.list = element; + this.drag.droppables = this.getDroppables(); + } else { + where = this.element.getAllPrevious().contains(element) ? 'before' : 'after'; + } + this.element.inject(element, where); + this.fireEvent('sort', [this.element, this.clone]); + }, + + start: function(event, element){ + if ( + !this.idle || + event.rightClick || + (!this.options.handle && this.options.unDraggableTags.contains(event.target.get('tag'))) + ) return; + + this.idle = false; + this.element = element; + this.opacity = element.getStyle('opacity'); + this.list = element.getParent(); + this.clone = this.getClone(event, element); + + this.drag = new Drag.Move(this.clone, Object.merge({ + + droppables: this.getDroppables() + }, this.options.dragOptions)).addEvents({ + onSnap: function(){ + event.stop(); + this.clone.setStyle('visibility', 'visible'); + this.element.setStyle('opacity', this.options.opacity || 0); + this.fireEvent('start', [this.element, this.clone]); + }.bind(this), + onEnter: this.insert.bind(this), + onCancel: this.end.bind(this), + onComplete: this.end.bind(this) + }); + + this.clone.inject(this.element, 'before'); + this.drag.start(event); + }, + + end: function(){ + this.drag.detach(); + this.element.setStyle('opacity', this.opacity); + var self = this; + if (this.effect){ + var dim = this.element.getStyles('width', 'height'), + clone = this.clone, + pos = clone.computePosition(this.getDroppableCoordinates(clone)); + + var destroy = function(){ + this.removeEvent('cancel', destroy); + clone.destroy(); + self.reset(); + }; + + this.effect.element = clone; + this.effect.start({ + top: pos.top, + left: pos.left, + width: dim.width, + height: dim.height, + opacity: 0.25 + }).addEvent('cancel', destroy).chain(destroy); + } else { + this.clone.destroy(); + self.reset(); + } + + }, + + reset: function(){ + this.idle = true; + this.fireEvent('complete', this.element); + }, + + serialize: function(){ + var params = Array.link(arguments, { + modifier: Type.isFunction, + index: function(obj){ + return obj != null; + } + }); + var serial = this.lists.map(function(list){ + return list.getChildren().map(params.modifier || function(element){ + return element.get('id'); + }, this); + }, this); + + var index = params.index; + if (this.lists.length == 1) index = 0; + return (index || index === 0) && index >= 0 && index < this.lists.length ? serial[index] : serial; + } + +}); + + +/* +--- + +script: Request.Periodical.js + +name: Request.Periodical + +description: Requests the same URL to pull data from a server but increases the intervals if no data is returned to reduce the load + +license: MIT-style license + +authors: + - Christoph Pojer + +requires: + - Core/Request + - MooTools.More + +provides: [Request.Periodical] + +... +*/ + +Request.implement({ + + options: { + initialDelay: 5000, + delay: 5000, + limit: 60000 + }, + + startTimer: function(data){ + var fn = function(){ + if (!this.running) this.send({data: data}); + }; + this.lastDelay = this.options.initialDelay; + this.timer = fn.delay(this.lastDelay, this); + this.completeCheck = function(response){ + clearTimeout(this.timer); + this.lastDelay = (response) ? this.options.delay : (this.lastDelay + this.options.delay).min(this.options.limit); + this.timer = fn.delay(this.lastDelay, this); + }; + return this.addEvent('complete', this.completeCheck); + }, + + stopTimer: function(){ + clearTimeout(this.timer); + return this.removeEvent('complete', this.completeCheck); + } + +}); + + +/* +--- + +script: Color.js + +name: Color + +description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa. + +license: MIT-style license + +authors: + - Valerio Proietti + +requires: + - Core/Array + - Core/String + - Core/Number + - Core/Hash + - Core/Function + - MooTools.More + +provides: [Color] + +... +*/ + +(function(){ + +var Color = this.Color = new Type('Color', function(color, type){ + if (arguments.length >= 3){ + type = 'rgb'; color = Array.slice(arguments, 0, 3); + } else if (typeof color == 'string'){ + if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true); + else if (color.match(/hsb/)) color = color.hsbToRgb(); + else color = color.hexToRgb(true); + } + type = type || 'rgb'; + switch (type){ + case 'hsb': + var old = color; + color = color.hsbToRgb(); + color.hsb = old; + break; + case 'hex': color = color.hexToRgb(true); break; + } + color.rgb = color.slice(0, 3); + color.hsb = color.hsb || color.rgbToHsb(); + color.hex = color.rgbToHex(); + return Object.append(color, this); +}); + +Color.implement({ + + mix: function(){ + var colors = Array.slice(arguments); + var alpha = (typeOf(colors.getLast()) == 'number') ? colors.pop() : 50; + var rgb = this.slice(); + colors.each(function(color){ + color = new Color(color); + for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha)); + }); + return new Color(rgb, 'rgb'); + }, + + invert: function(){ + return new Color(this.map(function(value){ + return 255 - value; + })); + }, + + setHue: function(value){ + return new Color([value, this.hsb[1], this.hsb[2]], 'hsb'); + }, + + setSaturation: function(percent){ + return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb'); + }, + + setBrightness: function(percent){ + return new Color([this.hsb[0], this.hsb[1], percent], 'hsb'); + } + +}); + +this.$RGB = function(r, g, b){ + return new Color([r, g, b], 'rgb'); +}; + +this.$HSB = function(h, s, b){ + return new Color([h, s, b], 'hsb'); +}; + +this.$HEX = function(hex){ + return new Color(hex, 'hex'); +}; + +Array.implement({ + + rgbToHsb: function(){ + var red = this[0], + green = this[1], + blue = this[2], + hue = 0; + var max = Math.max(red, green, blue), + min = Math.min(red, green, blue); + var delta = max - min; + var brightness = max / 255, + saturation = (max != 0) ? delta / max : 0; + if (saturation != 0){ + var rr = (max - red) / delta; + var gr = (max - green) / delta; + var br = (max - blue) / delta; + if (red == max) hue = br - gr; + else if (green == max) hue = 2 + rr - br; + else hue = 4 + gr - rr; + hue /= 6; + if (hue < 0) hue++; + } + return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)]; + }, + + hsbToRgb: function(){ + var br = Math.round(this[2] / 100 * 255); + if (this[1] == 0){ + return [br, br, br]; + } else { + var hue = this[0] % 360; + var f = hue % 60; + var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255); + var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255); + var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255); + switch (Math.floor(hue / 60)){ + case 0: return [br, t, p]; + case 1: return [q, br, p]; + case 2: return [p, br, t]; + case 3: return [p, q, br]; + case 4: return [t, p, br]; + case 5: return [br, p, q]; + } + } + return false; + } + +}); + +String.implement({ + + rgbToHsb: function(){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHsb() : null; + }, + + hsbToRgb: function(){ + var hsb = this.match(/\d{1,3}/g); + return (hsb) ? hsb.hsbToRgb() : null; + } + +}); + +})(); + + diff --git a/pyload/webui/themes/flat/js/static/mootools-more.min.js b/pyload/webui/themes/flat/js/static/mootools-more.min.js new file mode 100644 index 000000000..ce03a60fd --- /dev/null +++ b/pyload/webui/themes/flat/js/static/mootools-more.min.js @@ -0,0 +1,226 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/more/c1cc18c2fff04bcc58921b4dff80a6f1 + +packager build: + - packager build More/Form.Request More/Fx.Reveal More/Sortables More/Request.Periodical More/Color + +copyrights: + - [MooTools](http://mootools.net) + +licenses: + - [MIT License](http://mootools.net/license.txt) +... +*/ + +MooTools.More={version:"1.5.0",build:"73db5e24e6e9c5c87b3a27aebef2248053f7db37"};Class.Mutators.Binds=function(a){if(!this.prototype.initialize){this.implement("initialize",function(){}); +}return Array.from(a).concat(this.prototype.Binds||[]);};Class.Mutators.initialize=function(a){return function(){Array.from(this.Binds).each(function(b){var c=this[b]; +if(c){this[b]=c.bind(this);}},this);return a.apply(this,arguments);};};Class.Occlude=new Class({occlude:function(c,b){b=document.id(b||this.element);var a=b.retrieve(c||this.property); +if(a&&!this.occluded){return(this.occluded=a);}this.occluded=false;b.store(c||this.property,this);return this.occluded;}});Class.refactor=function(b,a){Object.each(a,function(e,d){var c=b.prototype[d]; +c=(c&&c.$origin)||c||function(){};b.implement(d,(typeof e=="function")?function(){var f=this.previous;this.previous=c;var g=e.apply(this,arguments);this.previous=f; +return g;}:e);});return b;};(function(){var b=function(e,d){var f=[];Object.each(d,function(g){Object.each(g,function(h){e.each(function(i){f.push(i+"-"+h+(i=="border"?"-width":"")); +});});});return f;};var c=function(f,e){var d=0;Object.each(e,function(h,g){if(g.test(f)){d=d+h.toInt();}});return d;};var a=function(d){return !!(!d||d.offsetHeight||d.offsetWidth); +};Element.implement({measure:function(h){if(a(this)){return h.call(this);}var g=this.getParent(),e=[];while(!a(g)&&g!=document.body){e.push(g.expose()); +g=g.getParent();}var f=this.expose(),d=h.call(this);f();e.each(function(i){i();});return d;},expose:function(){if(this.getStyle("display")!="none"){return function(){}; +}var d=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=d;}.bind(this); +},getDimensions:function(d){d=Object.merge({computeSize:false},d);var i={x:0,y:0};var h=function(j,e){return(e.computeSize)?j.getComputedSize(e):j.getSize(); +};var f=this.getParent("body");if(f&&this.getStyle("display")=="none"){i=this.measure(function(){return h(this,d);});}else{if(f){try{i=h(this,d);}catch(g){}}}return Object.append(i,(i.x||i.x===0)?{width:i.x,height:i.y}:{x:i.width,y:i.height}); +},getComputedSize:function(d){d=Object.merge({styles:["padding","border"],planes:{height:["top","bottom"],width:["left","right"]},mode:"both"},d);var g={},e={width:0,height:0},f; +if(d.mode=="vertical"){delete e.width;delete d.planes.width;}else{if(d.mode=="horizontal"){delete e.height;delete d.planes.height;}}b(d.styles,d.planes).each(function(h){g[h]=this.getStyle(h).toInt(); +},this);Object.each(d.planes,function(i,h){var k=h.capitalize(),j=this.getStyle(h);if(j=="auto"&&!f){f=this.getDimensions();}j=g[h]=(j=="auto")?f[h]:j.toInt(); +e["total"+k]=j;i.each(function(m){var l=c(m,g);e["computed"+m.capitalize()]=l;e["total"+k]+=l;});},this);return Object.append(e,g);}});})();(function(b){var a=Element.Position={options:{relativeTo:document.body,position:{x:"center",y:"center"},offset:{x:0,y:0}},getOptions:function(d,c){c=Object.merge({},a.options,c); +a.setPositionOption(c);a.setEdgeOption(c);a.setOffsetOption(d,c);a.setDimensionsOption(d,c);return c;},setPositionOption:function(c){c.position=a.getCoordinateFromValue(c.position); +},setEdgeOption:function(d){var c=a.getCoordinateFromValue(d.edge);d.edge=c?c:(d.position.x=="center"&&d.position.y=="center")?{x:"center",y:"center"}:{x:"left",y:"top"}; +},setOffsetOption:function(f,d){var c={x:0,y:0};var e={x:0,y:0};var g=f.measure(function(){return document.id(this.getOffsetParent());});if(!g||g==f.getDocument().body){return; +}e=g.getScroll();c=g.measure(function(){var i=this.getPosition();if(this.getStyle("position")=="fixed"){var h=window.getScroll();i.x+=h.x;i.y+=h.y;}return i; +});d.offset={parentPositioned:g!=document.id(d.relativeTo),x:d.offset.x-c.x+e.x,y:d.offset.y-c.y+e.y};},setDimensionsOption:function(d,c){c.dimensions=d.getDimensions({computeSize:true,styles:["padding","border","margin"]}); +},getPosition:function(e,d){var c={};d=a.getOptions(e,d);var f=document.id(d.relativeTo)||document.body;a.setPositionCoordinates(d,c,f);if(d.edge){a.toEdge(c,d); +}var g=d.offset;c.left=((c.x>=0||g.parentPositioned||d.allowNegative)?c.x:0).toInt();c.top=((c.y>=0||g.parentPositioned||d.allowNegative)?c.y:0).toInt(); +a.toMinMax(c,d);if(d.relFixedPosition||f.getStyle("position")=="fixed"){a.toRelFixedPosition(f,c);}if(d.ignoreScroll){a.toIgnoreScroll(f,c);}if(d.ignoreMargins){a.toIgnoreMargins(c,d); +}c.left=Math.ceil(c.left);c.top=Math.ceil(c.top);delete c.x;delete c.y;return c;},setPositionCoordinates:function(k,g,d){var f=k.offset.y,h=k.offset.x,e=(d==document.body)?window.getScroll():d.getPosition(),j=e.y,c=e.x,i=window.getSize(); +switch(k.position.x){case"left":g.x=c+h;break;case"right":g.x=c+h+d.offsetWidth;break;default:g.x=c+((d==document.body?i.x:d.offsetWidth)/2)+h;break;}switch(k.position.y){case"top":g.y=j+f; +break;case"bottom":g.y=j+f+d.offsetHeight;break;default:g.y=j+((d==document.body?i.y:d.offsetHeight)/2)+f;break;}},toMinMax:function(c,d){var f={left:"x",top:"y"},e; +["minimum","maximum"].each(function(g){["left","top"].each(function(h){e=d[g]?d[g][f[h]]:null;if(e!=null&&((g=="minimum")?c[h]e)){c[h]=e;}});}); +},toRelFixedPosition:function(e,c){var d=window.getScroll();c.top+=d.y;c.left+=d.x;},toIgnoreScroll:function(e,d){var c=e.getScroll();d.top-=c.y;d.left-=c.x; +},toIgnoreMargins:function(c,d){c.left+=d.edge.x=="right"?d.dimensions["margin-right"]:(d.edge.x!="center"?-d.dimensions["margin-left"]:-d.dimensions["margin-left"]+((d.dimensions["margin-right"]+d.dimensions["margin-left"])/2)); +c.top+=d.edge.y=="bottom"?d.dimensions["margin-bottom"]:(d.edge.y!="center"?-d.dimensions["margin-top"]:-d.dimensions["margin-top"]+((d.dimensions["margin-bottom"]+d.dimensions["margin-top"])/2)); +},toEdge:function(c,d){var e={},g=d.dimensions,f=d.edge;switch(f.x){case"left":e.x=0;break;case"right":e.x=-g.x-g.computedRight-g.computedLeft;break;default:e.x=-(Math.round(g.totalWidth/2)); +break;}switch(f.y){case"top":e.y=0;break;case"bottom":e.y=-g.y-g.computedTop-g.computedBottom;break;default:e.y=-(Math.round(g.totalHeight/2));break;}c.x+=e.x; +c.y+=e.y;},getCoordinateFromValue:function(c){if(typeOf(c)!="string"){return c;}c=c.toLowerCase();return{x:c.test("left")?"left":(c.test("right")?"right":"center"),y:c.test(/upper|top/)?"top":(c.test("bottom")?"bottom":"center")}; +}};Element.implement({position:function(d){if(d&&(d.x!=null||d.y!=null)){return(b?b.apply(this,arguments):this);}var c=this.setStyle("position","absolute").calculatePosition(d); +return(d&&d.returnPos)?c:this.setStyles(c);},calculatePosition:function(c){return a.getPosition(this,c);}});})(Element.prototype.position);(function(){var a=false; +this.IframeShim=new Class({Implements:[Options,Events,Class.Occlude],options:{className:"iframeShim",src:'javascript:false;document.write("");',display:false,zIndex:null,margin:0,offset:{x:0,y:0},browsers:a},property:"IframeShim",initialize:function(c,b){this.element=document.id(c); +if(this.occlude()){return this.occluded;}this.setOptions(b);this.makeShim();return this;},makeShim:function(){if(this.options.browsers){var d=this.element.getStyle("zIndex").toInt(); +if(!d){d=1;var c=this.element.getStyle("position");if(c=="static"||!c){this.element.setStyle("position","relative");}this.element.setStyle("zIndex",d); +}d=((this.options.zIndex!=null||this.options.zIndex===0)&&d>this.options.zIndex)?this.options.zIndex:d-1;if(d<0){d=1;}this.shim=new Element("iframe",{src:this.options.src,scrolling:"no",frameborder:0,styles:{zIndex:d,position:"absolute",border:"none",filter:"progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"},"class":this.options.className}).store("IframeShim",this); +var b=(function(){this.shim.inject(this.element,"after");this[this.options.display?"show":"hide"]();this.fireEvent("inject");}).bind(this);if(!IframeShim.ready){window.addEvent("load",b); +}else{b();}}else{this.position=this.hide=this.show=this.dispose=Function.from(this);}},position:function(){if(!IframeShim.ready||!this.shim){return this; +}var b=this.element.measure(function(){return this.getSize();});if(this.options.margin!=undefined){b.x=b.x-(this.options.margin*2);b.y=b.y-(this.options.margin*2); +this.options.offset.x+=this.options.margin;this.options.offset.y+=this.options.margin;}this.shim.set({width:b.x,height:b.y}).position({relativeTo:this.element,offset:this.options.offset}); +return this;},hide:function(){if(this.shim){this.shim.setStyle("display","none");}return this;},show:function(){if(this.shim){this.shim.setStyle("display","block"); +}return this.position();},dispose:function(){if(this.shim){this.shim.dispose();}return this;},destroy:function(){if(this.shim){this.shim.destroy();}return this; +}});})();window.addEvent("load",function(){IframeShim.ready=true;});var Mask=new Class({Implements:[Options,Events],Binds:["position"],options:{style:{},"class":"mask",maskMargins:false,useIframeShim:true,iframeShimOptions:{}},initialize:function(b,a){this.target=document.id(b)||document.id(document.body); +this.target.store("mask",this);this.setOptions(a);this.render();this.inject();},render:function(){this.element=new Element("div",{"class":this.options["class"],id:this.options.id||"mask-"+String.uniqueID(),styles:Object.merge({},this.options.style,{display:"none"}),events:{click:function(a){this.fireEvent("click",a); +if(this.options.hideOnClick){this.hide();}}.bind(this)}});this.hidden=true;},toElement:function(){return this.element;},inject:function(b,a){a=a||(this.options.inject?this.options.inject.where:"")||(this.target==document.body?"inside":"after"); +b=b||(this.options.inject&&this.options.inject.target)||this.target;this.element.inject(b,a);if(this.options.useIframeShim){this.shim=new IframeShim(this.element,this.options.iframeShimOptions); +this.addEvents({show:this.shim.show.bind(this.shim),hide:this.shim.hide.bind(this.shim),destroy:this.shim.destroy.bind(this.shim)});}},position:function(){this.resize(this.options.width,this.options.height); +this.element.position({relativeTo:this.target,position:"topLeft",ignoreMargins:!this.options.maskMargins,ignoreScroll:this.target==document.body});return this; +},resize:function(a,e){var b={styles:["padding","border"]};if(this.options.maskMargins){b.styles.push("margin");}var d=this.target.getComputedSize(b);if(this.target==document.body){this.element.setStyles({width:0,height:0}); +var c=window.getScrollSize();if(d.totalHeight0&&b>0)?true:this.style.display!="none";},toggle:function(){return this[this.isDisplayed()?"hide":"show"](); +},hide:function(){var b;try{b=this.getStyle("display");}catch(a){}if(b=="none"){return this;}return this.store("element:_originalDisplay",b||"").setStyle("display","none"); +},show:function(a){if(!a&&this.isDisplayed()){return this;}a=a||this.retrieve("element:_originalDisplay")||"block";return this.setStyle("display",(a=="none")?"block":a); +},swapClass:function(a,b){return this.removeClass(a).addClass(b);}});Document.implement({clearSelection:function(){if(window.getSelection){var a=window.getSelection(); +if(a&&a.removeAllRanges){a.removeAllRanges();}}else{if(document.selection&&document.selection.empty){try{document.selection.empty();}catch(b){}}}}});(function(){var a=function(d){var b=d.options.hideInputs; +if(window.OverText){var c=[null];OverText.each(function(e){c.include("."+e.options.labelClass);});if(c){b+=c.join(", ");}}return(b)?d.element.getElements(b):null; +};Fx.Reveal=new Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:"opacity" in document.documentElement,mode:"vertical",display:function(){return this.element.get("tag")!="tr"?"block":"table-row"; +},opacity:1,hideInputs:!("opacity" in document.documentElement)?"select, input, textarea, object, embed":null},dissolve:function(){if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true; +this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); +if(this.options.transitionOpacity){d.opacity=this.options.opacity;}var c={};Object.each(d,function(f,e){c[e]=[f,0];});this.element.setStyles({display:Function.from(this.options.display).call(this),overflow:"hidden"}); +var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){if(this.hidden){this.hiding=false;this.element.style.cssText=this.cssText; +this.element.setStyle("display","none");if(b){b.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);this.callChain();}.bind(this));this.start(c); +}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this)); +}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();this.dissolve();}}}return this;},reveal:function(){if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"){this.hiding=false; +this.showing=true;this.hidden=false;this.cssText=this.element.style.cssText;var d;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); +}.bind(this));if(this.options.heightOverride!=null){d.height=this.options.heightOverride.toInt();}if(this.options.widthOverride!=null){d.width=this.options.widthOverride.toInt(); +}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=this.options.opacity;}var c={height:0,display:Function.from(this.options.display).call(this)}; +Object.each(d,function(f,e){c[e]=0;});c.overflow="hidden";this.element.setStyles(c);var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){this.element.style.cssText=this.cssText; +this.element.setStyle("display",Function.from(this.options.display).call(this));if(!this.hidden){this.showing=false;}if(b){b.setStyle("visibility","visible"); +}this.callChain();this.fireEvent("show",this.element);}.bind(this));this.start(d);}else{this.callChain();this.fireEvent("complete",this.element);this.fireEvent("show",this.element); +}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();this.reveal(); +}}}return this;},toggle:function(){if(this.element.getStyle("display")=="none"){this.reveal();}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments); +if(this.cssText!=null){this.element.style.cssText=this.cssText;}this.hiding=false;this.showing=false;return this;}});Element.Properties.reveal={set:function(b){this.get("reveal").cancel().setOptions(b); +return this;},get:function(){var b=this.retrieve("reveal");if(!b){b=new Fx.Reveal(this);this.store("reveal",b);}return b;}};Element.Properties.dissolve=Element.Properties.reveal; +Element.implement({reveal:function(b){this.get("reveal").setOptions(b).reveal();return this;},dissolve:function(b){this.get("reveal").setOptions(b).dissolve(); +return this;},nix:function(b){var c=Array.link(arguments,{destroy:Type.isBoolean,options:Type.isObject});this.get("reveal").setOptions(b).dissolve().chain(function(){this[c.destroy?"destroy":"dispose"](); +}.bind(this));return this;},wink:function(){var c=Array.link(arguments,{duration:Type.isNumber,options:Type.isObject});var b=this.get("reveal").setOptions(c.options); +b.reveal().chain(function(){(function(){b.dissolve();}).delay(c.duration||2000);});}});})();var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var b=Array.link(arguments,{options:Type.isObject,element:function(c){return c!=null; +}});this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var a=typeOf(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element; +this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection="selectstart" in document?"selectstart":"mousedown";if("ondragstart" in document&&!("FileReader" in window)&&!Drag.ondragstartFixed){document.ondragstart=Function.from(false); +Drag.ondragstartFixed=true;}this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:Function.from(false)}; +this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start); +return this;},start:function(a){var j=this.options;if(a.rightClick){return;}if(j.preventDefault){a.preventDefault();}if(j.stopPropagation){a.stopPropagation(); +}this.mouse.start=a.page;this.fireEvent("beforeStart",this.element);var c=j.limit;this.limit={x:[],y:[]};var e,g;for(e in j.modifiers){if(!j.modifiers[e]){continue; +}var b=this.element.getStyle(j.modifiers[e]);if(b&&!b.match(/px$/)){if(!g){g=this.element.getCoordinates(this.element.getOffsetParent());}b=g[j.modifiers[e]]; +}if(j.style){this.value.now[e]=(b||0).toInt();}else{this.value.now[e]=this.element[j.modifiers[e]];}if(j.invert){this.value.now[e]*=-1;}this.mouse.pos[e]=a.page[e]-this.value.now[e]; +if(c&&c[e]){var d=2;while(d--){var f=c[e][d];if(f||f===0){this.limit[e][d]=(typeof f=="function")?f():f;}}}}if(typeOf(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid}; +}var h={mousemove:this.bound.check,mouseup:this.bound.cancel};h[this.selection]=this.bound.eventStop;this.document.addEvents(h);},check:function(a){if(this.options.preventDefault){a.preventDefault(); +}var b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop}); +this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element);}},drag:function(b){var a=this.options;if(a.preventDefault){b.preventDefault(); +}this.mouse.now=b.page;for(var c in a.modifiers){if(!a.modifiers[c]){continue;}this.value.now[c]=this.mouse.now[c]-this.mouse.pos[c];if(a.invert){this.value.now[c]*=-1; +}if(a.limit&&this.limit[c]){if((this.limit[c][1]||this.limit[c][1]===0)&&(this.value.now[c]>this.limit[c][1])){this.value.now[c]=this.limit[c][1];}else{if((this.limit[c][0]||this.limit[c][0]===0)&&(this.value.now[c]d.left&&b.xd.top);},this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed]); +}if(a){this.fireEvent("enter",[this.element,a]);}this.overed=a;}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables(); +}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return this.parent(a);}});Element.implement({makeDraggable:function(a){var b=new Drag.Move(this,a); +this.store("dragger",b);return b;}});var Sortables=new Class({Implements:[Events,Options],options:{opacity:1,clone:false,revert:false,handle:false,dragOptions:{},unDraggableTags:["button","input","a","textarea","select","option"]},initialize:function(a,b){this.setOptions(b); +this.elements=[];this.lists=[];this.idle=true;this.addLists($$(document.id(a)||a));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new Fx.Morph(null,Object.merge({duration:250,link:"cancel"},this.options.revert)); +}},attach:function(){this.addLists(this.lists);return this;},detach:function(){this.lists=this.removeLists(this.lists);return this;},addItems:function(){Array.flatten(arguments).each(function(a){this.elements.push(a); +var b=a.retrieve("sortables:start",function(c){this.start.call(this,c,a);}.bind(this));(this.options.handle?a.getElement(this.options.handle)||a:a).addEvent("mousedown",b); +},this);return this;},addLists:function(){Array.flatten(arguments).each(function(a){this.lists.include(a);this.addItems(a.getChildren());},this);return this; +},removeItems:function(){return $$(Array.flatten(arguments).map(function(a){this.elements.erase(a);var b=a.retrieve("sortables:start");(this.options.handle?a.getElement(this.options.handle)||a:a).removeEvent("mousedown",b); +return a;},this));},removeLists:function(){return $$(Array.flatten(arguments).map(function(a){this.lists.erase(a);this.removeItems(a.getChildren());return a; +},this));},getDroppableCoordinates:function(c){var d=c.getOffsetParent();var b=c.getPosition(d);var a={w:window.getScroll(),offsetParent:d.getScroll()}; +b.x+=a.offsetParent.x;b.y+=a.offsetParent.y;if(d.getStyle("position")=="fixed"){b.x-=a.w.x;b.y-=a.w.y;}return b;},getClone:function(b,a){if(!this.options.clone){return new Element(a.tagName).inject(document.body); +}if(typeOf(this.options.clone)=="function"){return this.options.clone.call(this,b,a,this.list);}var c=a.clone(true).setStyles({margin:0,position:"absolute",visibility:"hidden",width:a.getStyle("width")}).addEvent("mousedown",function(d){a.fireEvent("mousedown",d); +});if(c.get("html").test("radio")){c.getElements("input[type=radio]").each(function(d,e){d.set("name","clone_"+e);if(d.get("checked")){a.getElements("input[type=radio]")[e].set("checked",true); +}});}return c.inject(this.list).setPosition(this.getDroppableCoordinates(this.element));},getDroppables:function(){var a=this.list.getChildren().erase(this.clone).erase(this.element); +if(!this.options.constrain){a.append(this.lists).erase(this.list);}return a;},insert:function(c,b){var a="inside";if(this.lists.contains(b)){this.list=b; +this.drag.droppables=this.getDroppables();}else{a=this.element.getAllPrevious().contains(b)?"before":"after";}this.element.inject(b,a);this.fireEvent("sort",[this.element,this.clone]); +},start:function(b,a){if(!this.idle||b.rightClick||(!this.options.handle&&this.options.unDraggableTags.contains(b.target.get("tag")))){return;}this.idle=false; +this.element=a;this.opacity=a.getStyle("opacity");this.list=a.getParent();this.clone=this.getClone(b,a);this.drag=new Drag.Move(this.clone,Object.merge({droppables:this.getDroppables()},this.options.dragOptions)).addEvents({onSnap:function(){b.stop(); +this.clone.setStyle("visibility","visible");this.element.setStyle("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]); +}.bind(this),onEnter:this.insert.bind(this),onCancel:this.end.bind(this),onComplete:this.end.bind(this)});this.clone.inject(this.element,"before");this.drag.start(b); +},end:function(){this.drag.detach();this.element.setStyle("opacity",this.opacity);var a=this;if(this.effect){var c=this.element.getStyles("width","height"),e=this.clone,d=e.computePosition(this.getDroppableCoordinates(e)); +var b=function(){this.removeEvent("cancel",b);e.destroy();a.reset();};this.effect.element=e;this.effect.start({top:d.top,left:d.left,width:c.width,height:c.height,opacity:0.25}).addEvent("cancel",b).chain(b); +}else{this.clone.destroy();a.reset();}},reset:function(){this.idle=true;this.fireEvent("complete",this.element);},serialize:function(){var c=Array.link(arguments,{modifier:Type.isFunction,index:function(d){return d!=null; +}});var b=this.lists.map(function(d){return d.getChildren().map(c.modifier||function(e){return e.get("id");},this);},this);var a=c.index;if(this.lists.length==1){a=0; +}return(a||a===0)&&a>=0&&a=3){d="rgb";c=Array.slice(arguments,0,3);}else{if(typeof c=="string"){if(c.match(/rgb/)){c=c.rgbToHex().hexToRgb(true); +}else{if(c.match(/hsb/)){c=c.hsbToRgb();}else{c=c.hexToRgb(true);}}}}d=d||"rgb";switch(d){case"hsb":var b=c;c=c.hsbToRgb();c.hsb=b;break;case"hex":c=c.hexToRgb(true); +break;}c.rgb=c.slice(0,3);c.hsb=c.hsb||c.rgbToHsb();c.hex=c.rgbToHex();return Object.append(c,this);});a.implement({mix:function(){var b=Array.slice(arguments); +var d=(typeOf(b.getLast())=="number")?b.pop():50;var c=this.slice();b.each(function(e){e=new a(e);for(var f=0;f<3;f++){c[f]=Math.round((c[f]/100*(100-d))+(e[f]/100*d)); +}});return new a(c,"rgb");},invert:function(){return new a(this.map(function(b){return 255-b;}));},setHue:function(b){return new a([b,this.hsb[1],this.hsb[2]],"hsb"); +},setSaturation:function(b){return new a([this.hsb[0],b,this.hsb[2]],"hsb");},setBrightness:function(b){return new a([this.hsb[0],this.hsb[1],b],"hsb"); +}});this.$RGB=function(e,d,c){return new a([e,d,c],"rgb");};this.$HSB=function(e,d,c){return new a([e,d,c],"hsb");};this.$HEX=function(b){return new a(b,"hex"); +};Array.implement({rgbToHsb:function(){var c=this[0],d=this[1],k=this[2],h=0;var j=Math.max(c,d,k),f=Math.min(c,d,k);var l=j-f;var i=j/255,g=(j!=0)?l/j:0; +if(g!=0){var e=(j-c)/l;var b=(j-d)/l;var m=(j-k)/l;if(c==j){h=m-b;}else{if(d==j){h=2+e-m;}else{h=4+b-e;}}h/=6;if(h<0){h++;}}return[Math.round(h*360),Math.round(g*100),Math.round(i*100)]; +},hsbToRgb:function(){var d=Math.round(this[2]/100*255);if(this[1]==0){return[d,d,d];}else{var b=this[0]%360;var g=b%60;var h=Math.round((this[2]*(100-this[1]))/10000*255); +var e=Math.round((this[2]*(6000-this[1]*g))/600000*255);var c=Math.round((this[2]*(6000-this[1]*(60-g)))/600000*255);switch(Math.floor(b/60)){case 0:return[d,c,h]; +case 1:return[e,d,h];case 2:return[h,d,c];case 3:return[h,e,d];case 4:return[c,h,d];case 5:return[d,h,e];}}return false;}});String.implement({rgbToHsb:function(){var b=this.match(/\d{1,3}/g); +return(b)?b.rgbToHsb():null;},hsbToRgb:function(){var b=this.match(/\d{1,3}/g);return(b)?b.hsbToRgb():null;}});})(); \ No newline at end of file diff --git a/pyload/webui/themes/flat/js/static/purr.js b/pyload/webui/themes/flat/js/static/purr.js new file mode 100644 index 000000000..9cbc503d9 --- /dev/null +++ b/pyload/webui/themes/flat/js/static/purr.js @@ -0,0 +1,309 @@ +/* +--- +script: purr.js + +description: Class to create growl-style popup notifications. + +license: MIT-style + +authors: [atom smith] + +requires: +- core/1.3: [Core, Browser, Array, Function, Number, String, Hash, Event, Class.Extras, Element.Event, Element.Style, Element.Dimensions, Fx.CSS, FX.Tween, Fx.Morph] + +provides: [Purr, Element.alert] +... +*/ + + +var Purr = new Class({ + + 'options': { + 'mode': 'top', + 'position': 'left', + 'elementAlertClass': 'purr-element-alert', + 'elements': { + 'wrapper': 'div', + 'alert': 'div', + 'buttonWrapper': 'div', + 'button': 'button' + }, + 'elementOptions': { + 'wrapper': { + 'styles': { + 'position': 'fixed', + 'z-index': '9999' + }, + 'class': 'purr-wrapper' + }, + 'alert': { + 'class': 'purr-alert', + 'styles': { + 'opacity': '.85' + } + }, + 'buttonWrapper': { + 'class': 'purr-button-wrapper' + }, + 'button': { + 'class': 'purr-button' + } + }, + 'alert': { + 'buttons': [], + 'clickDismiss': true, + 'hoverWait': true, + 'hideAfter': 5000, + 'fx': { + 'duration': 500 + }, + 'highlight': false, + 'highlightRepeat': false, + 'highlight': { + 'start': '#FF0', + 'end': false + } + } + }, + + 'Implements': [Options, Events, Chain], + + 'initialize': function(options){ + this.setOptions(options); + this.createWrapper(); + return this; + }, + + 'bindAlert': function(){ + return this.alert.bind(this); + }, + + 'createWrapper': function(){ + this.wrapper = new Element(this.options.elements.wrapper, this.options.elementOptions.wrapper); + if(this.options.mode == 'top') + { + this.wrapper.setStyle('top', 0); + } + else + { + this.wrapper.setStyle('bottom', 0); + } + document.id(document.body).grab(this.wrapper); + this.positionWrapper(this.options.position); + }, + + 'positionWrapper': function(position){ + if(typeOf(position) == 'object') + { + + var wrapperCoords = this.getWrapperCoords(); + + this.wrapper.setStyles({ + 'bottom': '', + 'left': position.x, + 'top': position.y - wrapperCoords.height, + 'position': 'absolute' + }); + } + else if(position == 'left') + { + this.wrapper.setStyle('left', 0); + } + else if(position == 'right') + { + this.wrapper.setStyle('right', 0); + } + else + { + this.wrapper.setStyle('left', (window.innerWidth / 2) - (this.getWrapperCoords().width / 2)); + } + return this; + }, + + 'getWrapperCoords': function(){ + this.wrapper.setStyle('visibility', 'hidden'); + var measurer = this.alert('need something in here to measure'); + var coords = this.wrapper.getCoordinates(); + measurer.destroy(); + this.wrapper.setStyle('visibility',''); + return coords; + }, + + 'alert': function(msg, options){ + + options = Object.merge({}, this.options.alert, options || {}); + + var alert = new Element(this.options.elements.alert, this.options.elementOptions.alert); + + if(typeOf(msg) == 'string') + { + alert.set('html', msg); + } + else if(typeOf(msg) == 'element') + { + alert.grab(msg); + } + else if(typeOf(msg) == 'array') + { + var alerts = []; + msg.each(function(m){ + alerts.push(this.alert(m, options)); + }, this); + return alerts; + } + + alert.store('options', options); + + if(options.buttons.length > 0) + { + options.clickDismiss = false; + options.hideAfter = false; + options.hoverWait = false; + var buttonWrapper = new Element(this.options.elements.buttonWrapper, this.options.elementOptions.buttonWrapper); + alert.grab(buttonWrapper); + options.buttons.each(function(button){ + if(button.text != undefined) + { + var callbackButton = new Element(this.options.elements.button, this.options.elementOptions.button); + callbackButton.set('html', button.text); + if(button.callback != undefined) + { + callbackButton.addEvent('click', button.callback.pass(alert)); + } + if(button.dismiss != undefined && button.dismiss) + { + callbackButton.addEvent('click', this.dismiss.pass(alert, this)); + } + buttonWrapper.grab(callbackButton); + } + }, this); + } + if(options.className != undefined) + { + alert.addClass(options.className); + } + + this.wrapper.grab(alert, (this.options.mode == 'top') ? 'bottom' : 'top'); + + var fx = Object.merge(this.options.alert.fx, options.fx); + var alertFx = new Fx.Morph(alert, fx); + alert.store('fx', alertFx); + this.fadeIn(alert); + + if(options.highlight) + { + alertFx.addEvent('complete', function(){ + alert.highlight(options.highlight.start, options.highlight.end); + if(options.highlightRepeat) + { + alert.highlight.periodical(options.highlightRepeat, alert, [options.highlight.start, options.highlight.end]); + } + }); + } + if(options.hideAfter) + { + this.dismiss(alert); + } + + if(options.clickDismiss) + { + alert.addEvent('click', function(){ + this.holdUp = false; + this.dismiss(alert, true); + }.bind(this)); + } + + if(options.hoverWait) + { + alert.addEvents({ + 'mouseenter': function(){ + this.holdUp = true; + }.bind(this), + 'mouseleave': function(){ + this.holdUp = false; + }.bind(this) + }); + } + + return alert; + }, + + 'fadeIn': function(alert){ + var alertFx = alert.retrieve('fx'); + alertFx.set({ + 'opacity': 0 + }); + alertFx.start({ + 'opacity': [this.options.elementOptions.alert.styles.opacity, .9].pick(), + }); + }, + + 'dismiss': function(alert, now){ + now = now || false; + var options = alert.retrieve('options'); + if(now) + { + this.fadeOut(alert); + } + else + { + this.fadeOut.delay(options.hideAfter, this, alert); + } + }, + + 'fadeOut': function(alert){ + if(this.holdUp) + { + this.dismiss.delay(100, this, [alert, true]) + return null; + } + var alertFx = alert.retrieve('fx'); + if(!alertFx) + { + return null; + } + var to = { + 'opacity': 0 + } + if(this.options.mode == 'top') + { + to['margin-top'] = '-'+alert.offsetHeight+'px'; + } + else + { + to['margin-bottom'] = '-'+alert.offsetHeight+'px'; + } + alertFx.start(to); + alertFx.addEvent('complete', function(){ + alert.destroy(); + }); + } +}); + +Element.implement({ + + 'alert': function(msg, options){ + var alert = this.retrieve('alert'); + if(!alert) + { + options = options || { + 'mode':'top' + }; + alert = new Purr(options) + this.store('alert', alert); + } + + var coords = this.getCoordinates(); + + alert.alert(msg, options); + + alert.wrapper.setStyles({ + 'bottom': '', + 'left': (coords.left - (alert.wrapper.getWidth() / 2)) + (this.getWidth() / 2), + 'top': coords.top - (alert.wrapper.getHeight()), + 'position': 'absolute' + }); + + } + +}); \ No newline at end of file diff --git a/pyload/webui/themes/flat/js/static/purr.min.js b/pyload/webui/themes/flat/js/static/purr.min.js new file mode 100644 index 000000000..bf70e357d --- /dev/null +++ b/pyload/webui/themes/flat/js/static/purr.min.js @@ -0,0 +1 @@ +var Purr=new Class({options:{mode:"top",position:"left",elementAlertClass:"purr-element-alert",elements:{wrapper:"div",alert:"div",buttonWrapper:"div",button:"button"},elementOptions:{wrapper:{styles:{position:"fixed","z-index":"9999"},"class":"purr-wrapper"},alert:{"class":"purr-alert",styles:{opacity:".85"}},buttonWrapper:{"class":"purr-button-wrapper"},button:{"class":"purr-button"}},alert:{buttons:[],clickDismiss:!0,hoverWait:!0,hideAfter:5e3,fx:{duration:500},highlight:!1,highlightRepeat:!1,highlight:{start:"#FF0",end:!1}}},Implements:[Options,Events,Chain],initialize:function(t){return this.setOptions(t),this.createWrapper(),this},bindAlert:function(){return this.alert.bind(this)},createWrapper:function(){this.wrapper=new Element(this.options.elements.wrapper,this.options.elementOptions.wrapper),"top"==this.options.mode?this.wrapper.setStyle("top",0):this.wrapper.setStyle("bottom",0),document.id(document.body).grab(this.wrapper),this.positionWrapper(this.options.position)},positionWrapper:function(t){if("object"==typeOf(t)){var e=this.getWrapperCoords();this.wrapper.setStyles({bottom:"",left:t.x,top:t.y-e.height,position:"absolute"})}else"left"==t?this.wrapper.setStyle("left",0):"right"==t?this.wrapper.setStyle("right",0):this.wrapper.setStyle("left",window.innerWidth/2-this.getWrapperCoords().width/2);return this},getWrapperCoords:function(){this.wrapper.setStyle("visibility","hidden");var t=this.alert("need something in here to measure"),e=this.wrapper.getCoordinates();return t.destroy(),this.wrapper.setStyle("visibility",""),e},alert:function(t,e){e=Object.merge({},this.options.alert,e||{});var i=new Element(this.options.elements.alert,this.options.elementOptions.alert);if("string"==typeOf(t))i.set("html",t);else if("element"==typeOf(t))i.grab(t);else if("array"==typeOf(t)){var s=[];return t.each(function(t){s.push(this.alert(t,e))},this),s}if(i.store("options",e),e.buttons.length>0){e.clickDismiss=!1,e.hideAfter=!1,e.hoverWait=!1;var r=new Element(this.options.elements.buttonWrapper,this.options.elementOptions.buttonWrapper);i.grab(r),e.buttons.each(function(t){if(void 0!=t.text){var e=new Element(this.options.elements.button,this.options.elementOptions.button);e.set("html",t.text),void 0!=t.callback&&e.addEvent("click",t.callback.pass(i)),void 0!=t.dismiss&&t.dismiss&&e.addEvent("click",this.dismiss.pass(i,this)),r.grab(e)}},this)}void 0!=e.className&&i.addClass(e.className),this.wrapper.grab(i,"top"==this.options.mode?"bottom":"top");var o=Object.merge(this.options.alert.fx,e.fx),n=new Fx.Morph(i,o);return i.store("fx",n),this.fadeIn(i),e.highlight&&n.addEvent("complete",function(){i.highlight(e.highlight.start,e.highlight.end),e.highlightRepeat&&i.highlight.periodical(e.highlightRepeat,i,[e.highlight.start,e.highlight.end])}),e.hideAfter&&this.dismiss(i),e.clickDismiss&&i.addEvent("click",function(){this.holdUp=!1,this.dismiss(i,!0)}.bind(this)),e.hoverWait&&i.addEvents({mouseenter:function(){this.holdUp=!0}.bind(this),mouseleave:function(){this.holdUp=!1}.bind(this)}),i},fadeIn:function(t){var e=t.retrieve("fx");e.set({opacity:0}),e.start({opacity:[this.options.elementOptions.alert.styles.opacity,.9].pick()})},dismiss:function(t,e){e=e||!1;var i=t.retrieve("options");e?this.fadeOut(t):this.fadeOut.delay(i.hideAfter,this,t)},fadeOut:function(t){if(this.holdUp)return this.dismiss.delay(100,this,[t,!0]),null;var e=t.retrieve("fx");if(!e)return null;var i={opacity:0};"top"==this.options.mode?i["margin-top"]="-"+t.offsetHeight+"px":i["margin-bottom"]="-"+t.offsetHeight+"px",e.start(i),e.addEvent("complete",function(){t.destroy()})}});Element.implement({alert:function(t,e){var i=this.retrieve("alert");i||(e=e||{mode:"top"},i=new Purr(e),this.store("alert",i));var s=this.getCoordinates();i.alert(t,e),i.wrapper.setStyles({bottom:"",left:s.left-i.wrapper.getWidth()/2+this.getWidth()/2,top:s.top-i.wrapper.getHeight(),position:"absolute"})}}); \ No newline at end of file diff --git a/pyload/webui/themes/flat/js/static/tinytab.js b/pyload/webui/themes/flat/js/static/tinytab.js new file mode 100644 index 000000000..de50279fc --- /dev/null +++ b/pyload/webui/themes/flat/js/static/tinytab.js @@ -0,0 +1,43 @@ +/* +--- +description: TinyTab - Tiny and simple tab handler for Mootools. + +license: MIT-style + +authors: +- Danillo César de O. Melo + +requires: +- core/1.2.4: '*' + +provides: TinyTab + +... +*/ +(function($) { + this.TinyTab = new Class({ + Implements: Events, + initialize: function(tabs, contents, opt) { + this.tabs = tabs; + this.contents = contents; + if(!opt) opt = {}; + this.css = opt.selectedClass || 'selected'; + this.select(this.tabs[0]); + tabs.each(function(el){ + el.addEvent('click',function(e){ + this.select(el); + e.stop(); + }.bind(this)); + }.bind(this)); + }, + + select: function(el) { + this.tabs.removeClass(this.css); + el.addClass(this.css); + this.contents.setStyle('display','none'); + var content = this.contents[this.tabs.indexOf(el)]; + content.setStyle('display','block'); + this.fireEvent('change',[content,el]); + } + }); +})(document.id); \ No newline at end of file diff --git a/pyload/webui/themes/flat/js/static/tinytab.min.js b/pyload/webui/themes/flat/js/static/tinytab.min.js new file mode 100644 index 000000000..2f4fa0436 --- /dev/null +++ b/pyload/webui/themes/flat/js/static/tinytab.min.js @@ -0,0 +1 @@ +!function(){this.TinyTab=new Class({Implements:Events,initialize:function(s,t,e){this.tabs=s,this.contents=t,e||(e={}),this.css=e.selectedClass||"selected",this.select(this.tabs[0]),s.each(function(s){s.addEvent("click",function(t){this.select(s),t.stop()}.bind(this))}.bind(this))},select:function(s){this.tabs.removeClass(this.css),s.addClass(this.css),this.contents.setStyle("display","none");var t=this.contents[this.tabs.indexOf(s)];t.setStyle("display","block"),this.fireEvent("change",[t,s])}})}(document.id); \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/admin.html b/pyload/webui/themes/flat/tml/admin.html new file mode 100644 index 000000000..c7bdd7894 --- /dev/null +++ b/pyload/webui/themes/flat/tml/admin.html @@ -0,0 +1,98 @@ +{% extends '/flat/tml/base.html' %} + +{% block head %} + +{% endblock %} + + +{% block title %}{{ _("Administrate") }} - {{ super() }} {% endblock %} +{% block subtitle %}{{ _("Administrate") }}{% endblock %} + +{% block content %} + + {{_("Quit pyLoad")}} | + {{_("Restart pyLoad")}} +
            +
            + + {{ _("To add user or change passwords use:") }} python pyload.py -u
            + {{ _("Important: Admin user have always all permissions!") }} + +
            + + + + + + + + + {% for name, data in users.iteritems() %} + + + + + + + {% endfor %} + + +
            + {{ _("Name") }} + + {{ _("Change Password") }} + + {{ _("Admin") }} + + {{ _("Permissions") }} +
            {{ name }}{{ _("change") }} + +
            + + +
            +{% endblock %} +{% block hidden %} +
            +
            +

            {{ _("Change Password") }}

            + +

            {{ _("Enter your current and desired Password.") }}

            + + + + + + + + + + + + + + + +
            + +
            + +
            +{% endblock %} diff --git a/pyload/webui/themes/flat/tml/base.html b/pyload/webui/themes/flat/tml/base.html new file mode 100644 index 000000000..17349c5f1 --- /dev/null +++ b/pyload/webui/themes/flat/tml/base.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + +{% block title %}pyLoad {{_("Webinterface")}}{% endblock %} + +{% block head %} +{% endblock %} + + + + +
            + + +
            + {% block headpanel %} + + {% if user.is_authenticated %} + + +{% if update %} + +{{_("pyLoad Update available!")}} + +{% endif %} + + +{% if plugins %} + +{{_("Plugins updated, please restart!")}} + +{% endif %} + + +Captcha: +{{_("Captcha waiting")}} + + + User:{{user.name}} + +{% else %} + {{_("Please Login!")}} +{% endif %} + + {% endblock %} +
            + + + +
            + +
            + +
            +
            + +{% if perms.STATUS %} + +{% endif %} + +{% if perms.LIST %} + +{% endif %} + +{% block pageactions %} +{% endblock %} +
            + +
            + +
            + +

            {% block subtitle %}pyLoad - {{_("Webinterface")}}{% endblock %}

            + +{% block statusbar %} +{% endblock %} + + +
            + +
            +
            + + +{% for message in messages %} +

            {{message}}

            +{% endfor %} + +
            + + {{_("loading")}} +
            + +{% block content %} +{% endblock content %} + +
            + + +
            +
            + +
            + {% include '/flat/tml/window.html' %} + {% include '/flat/tml/captcha.html' %} + {% block hidden %} + {% endblock %} +
            + + diff --git a/pyload/webui/themes/flat/tml/captcha.html b/pyload/webui/themes/flat/tml/captcha.html new file mode 100644 index 000000000..ae1afe444 --- /dev/null +++ b/pyload/webui/themes/flat/tml/captcha.html @@ -0,0 +1,42 @@ + +
            + +
            + +

            {{_("Captcha reading")}}

            +

            {{_("Please read the text on the captcha.")}}

            + +
            + + + + + + + + + + + +
            + +
            + +
            + +
            + + + + +
            + +
            + +
            + +
            \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/downloads.html b/pyload/webui/themes/flat/tml/downloads.html new file mode 100644 index 000000000..445f8da37 --- /dev/null +++ b/pyload/webui/themes/flat/tml/downloads.html @@ -0,0 +1,29 @@ +{% extends '/flat/tml/base.html' %} + +{% block title %}Downloads - {{super()}} {% endblock %} + +{% block subtitle %} +{{_("Downloads")}} +{% endblock %} + +{% block content %} + +
              + {% for folder in files.folder %} +
            • + {{ folder.name }} +
                + {% for file in folder.files %} +
              • {{file}}
              • + {% endfor %} +
              +
            • + {% endfor %} + + {% for file in files.files %} +
            • {{ file }}
            • + {% endfor %} + +
            + +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/folder.html b/pyload/webui/themes/flat/tml/folder.html new file mode 100644 index 000000000..89b84e7bb --- /dev/null +++ b/pyload/webui/themes/flat/tml/folder.html @@ -0,0 +1,15 @@ +
          • + + + + {{ name }} + + +    + +    + + + +
            {{ _("Folder is empty") }}
            +
          • \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/home.html b/pyload/webui/themes/flat/tml/home.html new file mode 100644 index 000000000..838a351ad --- /dev/null +++ b/pyload/webui/themes/flat/tml/home.html @@ -0,0 +1,263 @@ +{% extends '/flat/tml/base.html' %} +{% block head %} + + + +{% endblock %} + +{% block subtitle %} +{{_("Active Downloads")}} +{% endblock %} + +{% block menu %} +
          • + {{_("Home")}} +
          • +
          • + {{_("Queue")}} +
          • +
          • + {{_("Collector")}} +
          • +
          • + {{_("Downloads")}} +
          • +
          • + {{_("Logs")}} +
          • +
          • + {{_("Config")}} +
          • +{% endblock %} + +{% block content %} + + + + + + + + + + + + + {% for link in content %} + + + + + + + + + + + {% endfor %} + + +
            {{_("Name")}}{{_("Status")}}{{_("Information")}}{{_("Size")}}{{_("Progress")}}
            +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/info.html b/pyload/webui/themes/flat/tml/info.html new file mode 100644 index 000000000..26b46736d --- /dev/null +++ b/pyload/webui/themes/flat/tml/info.html @@ -0,0 +1,81 @@ +{% extends '/flat/tml/base.html' %} + +{% block head %} + +{% endblock %} + +{% block title %}{{ _("Information") }} - {{ super() }} {% endblock %} +{% block subtitle %}{{ _("Information") }}{% endblock %} + +{% block content %} +

            {{ _("News") }}

            +
            + +

            {{ _("Support") }}

            + + + +

            {{ _("System") }}

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            {{ _("Python:") }}{{ python }}
            {{ _("OS:") }}{{ os }}
            {{ _("pyLoad version:") }}{{ version }}
            {{ _("Installation Folder:") }}{{ folder }}
            {{ _("Config Folder:") }}{{ config }}
            {{ _("Download Folder:") }}{{ download }}
            {{ _("Free Space:") }}{{ freespace }}
            {{ _("Language:") }}{{ language }}
            {{ _("Webinterface Port:") }}{{ webif }}
            {{ _("Remote Interface Port:") }}{{ remote }}
            + +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/login.html b/pyload/webui/themes/flat/tml/login.html new file mode 100644 index 000000000..76365a79c --- /dev/null +++ b/pyload/webui/themes/flat/tml/login.html @@ -0,0 +1,36 @@ +{% extends '/flat/tml/base.html' %} + +{% block title %}{{_("Login")}} - {{super()}} {% endblock %} + +{% block content %} + +
            +
            +
            + +
            + Login + +
            + +
            + +
            +
            +
            + +{% if errors %} +

            {{_("Your username and password didn't match. Please try again.")}}

            + {{ _("To reset your login data or add an user run:") }} python pyload.py -u +{% endif %} + +
            +
            + +{% endblock %} diff --git a/pyload/webui/themes/flat/tml/logout.html b/pyload/webui/themes/flat/tml/logout.html new file mode 100644 index 000000000..370031b25 --- /dev/null +++ b/pyload/webui/themes/flat/tml/logout.html @@ -0,0 +1,9 @@ +{% extends '/flat/tml/base.html' %} + +{% block head %} + +{% endblock %} + +{% block content %} +

            {{_("You were successfully logged out.")}}

            +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/logs.html b/pyload/webui/themes/flat/tml/logs.html new file mode 100644 index 000000000..87e5a0f30 --- /dev/null +++ b/pyload/webui/themes/flat/tml/logs.html @@ -0,0 +1,41 @@ +{% extends '/flat/tml/base.html' %} + +{% block title %}{{_("Logs")}} - {{super()}} {% endblock %} +{% block subtitle %}{{_("Logs")}}{% endblock %} +{% block head %} + +{% endblock %} + +{% block content %} +
            + + +
            +
            + +   + + +
            +
            +
            {{warning}}
            +
            +
            + + {% for line in log %} + + {% endfor %} +
            {{line.line}}{{line.date}}{{line.level}}{{line.message}}
            +
            +
            +
            + + +
            +
            +
             
            +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/pathchooser.html b/pyload/webui/themes/flat/tml/pathchooser.html new file mode 100644 index 000000000..95a1a3be5 --- /dev/null +++ b/pyload/webui/themes/flat/tml/pathchooser.html @@ -0,0 +1,76 @@ + + + + + + +
            +
            +
            + + +
            + + {% if type == 'folder' %} + {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} + {% else %} + {{_("Path")}}: {{_("absolute")}} | {{_("relative")}} + {% endif %} +
            + + + + + + + + {% if parentdir %} + + + + {% endif %} +{% for file in files %} + + {% if type == 'folder' %} + + {% else %} + + {% endif %} + + + + + +{% endfor %} +
            {{_("name")}}{{_("size")}}{{_("type")}}{{_("last modified")}}
            + {{_("parent directory")}} +
            {% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{% if file.type == 'dir' %}{{ file.name|truncate(25) }}{% else %}{{ file.name|truncate(25) }}{% endif %}{{ file.size|float|filesizeformat }}{% if file.type == 'dir' %}directory{% else %}{{ file.ext|default("file") }}{% endif %}{{ file.modified|date("d.m.Y - H:i:s") }}
            +
            + + \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/queue.html b/pyload/webui/themes/flat/tml/queue.html new file mode 100644 index 000000000..0d3022ddd --- /dev/null +++ b/pyload/webui/themes/flat/tml/queue.html @@ -0,0 +1,104 @@ +{% extends '/flat/tml/base.html' %} +{% block head %} + + + + +{% endblock %} + +{% if target %} + {% set name = _("Queue") %} +{% else %} + {% set name = _("Collector") %} +{% endif %} + +{% block title %}{{name}} - {{super()}} {% endblock %} +{% block subtitle %}{{name}}{% endblock %} + +{% block pageactions %} + +{% endblock %} + +{% block content %} +{% autoescape true %} + +
              +{% for package in content %} +
            • +
              + + +
              + + {{package.name}} +    + + +    + +    + +    + + +
              + {% set progress = (package.linksdone * 100) / package.linkstotal %} + +
              +
              + + +
              +
              + + +
              +
            • +{% endfor %} +
            +{% endautoescape %} +{% endblock %} + +{% block hidden %} +
            +
            +

            {{_("Edit Package")}}

            +

            {{_("Edit the package detais below.")}}

            + + + + + + + + + + + + +
            + +
            + +
            +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/settings.html b/pyload/webui/themes/flat/tml/settings.html new file mode 100644 index 000000000..1bd0d1e17 --- /dev/null +++ b/pyload/webui/themes/flat/tml/settings.html @@ -0,0 +1,204 @@ +{% extends '/flat/tml/base.html' %} + +{% block title %}{{ _("Config") }} - {{ super() }} {% endblock %} +{% block subtitle %}{{ _("Config") }}{% endblock %} + +{% block head %} + + + + +{% endblock %} + +{% block content %} + + + +
            + +
            + + + + + + +
            + +
            +

               {{ _("Choose a section from the menu") }}

            +
            +
            + + +
            +
            + + + + + + +
            + + +
            +

               {{ _("Choose a section from the menu") }}

            +
            +
            + +
            + +
            + + + +
            + + + + + + + + + + + + + + + + + + + + {% for account in conf.accs %} + {% set plugin = account.type %} + + + + + + + + + + + + + + {% endfor %} +
            {{ _("Plugin") }}{{ _("Name") }}{{ _("Password") }}{{ _("Status") }}{{ _("Premium") }}{{ _("Valid until") }}{{ _("Traffic left") }}{{ _("Time") }}{{ _("Max Parallel") }}{{ _("Delete?") }}
            + {{ plugin }} + + + + {% if account.valid %} + + {{ _("valid") }} + {% else %} + + {{ _("not valid") }} + {% endif %} + + + {% if account.premium %} + + {{ _("yes") }} + {% else %} + + {{ _("no") }} + {% endif %} + + + + {{ account.validuntil }} + + + + {{ account.trafficleft }} + + + + + + + +
            + + + +
            +
            +
            +{% endblock %} +{% block hidden %} +
            +
            +

            {{_("Add Account")}}

            +

            {{_("Enter your account data to use premium features.")}}

            + + + + + + + + + + + +
            + +
            + +
            +{% endblock %} \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/settings_item.html b/pyload/webui/themes/flat/tml/settings_item.html new file mode 100644 index 000000000..813383343 --- /dev/null +++ b/pyload/webui/themes/flat/tml/settings_item.html @@ -0,0 +1,48 @@ + + {% if section.outline %} + + {% endif %} + {% for okey, option in section.iteritems() %} + {% if okey not in ("desc","outline") %} + + + + + {% endif %} + {% endfor %} +
            {{ section.outline }}
            + {% if option.type == "bool" %} + + {% elif ";" in option.type %} + + {% elif option.type == "folder" %} + + + {% elif option.type == "file" %} + + + {% elif option.type == "password" %} + + {% else %} + + {% endif %} +
            \ No newline at end of file diff --git a/pyload/webui/themes/flat/tml/window.html b/pyload/webui/themes/flat/tml/window.html new file mode 100644 index 000000000..8f57843c6 --- /dev/null +++ b/pyload/webui/themes/flat/tml/window.html @@ -0,0 +1,46 @@ + + +
            +
            +

            {{_("Add Package")}}

            +

            {{_("Paste your links or upload a container.")}}

            + + + + + + + + + + + + + + + {{_("Queue")}} + + {{_("Collector")}} + + + + + +
            + +
            + +
            \ No newline at end of file diff --git a/scripts/clonedigger.sh b/scripts/clonedigger.sh index 87c3437cf..358c1b68b 100644 --- a/scripts/clonedigger.sh +++ b/scripts/clonedigger.sh @@ -1,4 +1,4 @@ #!/bin/sh -PYLOAD="../module" # Check ~/pyload/module directory +PYLOAD="../pyload" # Check pyload directory clonedigger -o cpd.xml --cpd-output --fast --ignore-dir="lib" --ignore-dir="remote" $PYLOAD diff --git a/scripts/code_analysis.sh b/scripts/code_analysis.sh index dce93d63d..c853652bf 100644 --- a/scripts/code_analysis.sh +++ b/scripts/code_analysis.sh @@ -1,6 +1,6 @@ #!/bin/sh -PYLOAD="../module" # Check ~/pyload/module directory +PYLOAD="../pyload" # Check pyload directory echo "Running sloccount ..." REPORT="sloccount.sc" -- cgit v1.2.3