Alberto Paro avatar Alberto Paro committed df39bea Merge

merged latest pyload trunk

Comments (0)

Files changed (402)

 Downloads/*
 container/*
 Logs/*
+docs/module/
+docs/_build
 module/plugins/container/DLC_*.py
 failed_links.txt
 module/config/gui.xml
 module/config/core.xml
 module/config/plugin.xml
 links.txt
-module/links.pkl
-module/cookies.txt
 ssl.crt
 ssl.key
 cert.pem
 module/web/pyload.db
-webserver.pid
 *.svg
 *.prefs
 *.po
+*.orig
+*.rej
+pyload/*
+dist/*
+build/*
+setup.py
+paver-minilib.zip
+env/*
 3ea104a0ecccec36b1d71e3e9b2569269a6df8e1 v0.3.2
 8739885c143aad6165fad82a38429e4b3a7ac637 v0.4
 172b7ac22ba8f99b879dc5e2ee6ddf696e1d5e57 v0.4.1
-2ea2980753319ac7af0fff5d2a52e23462fdfc76 v0.4.2
-2ea2980753319ac7af0fff5d2a52e23462fdfc76 v0.4.2
-0000000000000000000000000000000000000000 v0.4.2
-0000000000000000000000000000000000000000 v0.4.2
 a6056a60450a31b85dccc196b7735152ae079aee v0.4.2
 2480b4b44803063a9256d6fc70a865ca6d744856 v0.4.3
 e328358b2009f32adddfc8b9930b5819709eb2fe v0.4.4
+73cb51958a1d61a1041726c2c14a8100525f2b8d v0.4.5
+4979df70ef1aaaf82d0522af81ba3dc3e943ccdf v0.4.6
+04f6f6fcc398b4b472d4e0fb1c455cc36719aee6 v0.4.7
+e534c70d0e8c1dd1fb68106ca35998e843c07a0e v0.4.8
-
-   ?IIIIIIII77777:~~.                      NM                               M   
- +III777777$$$$$7~~~~,                     NM                               M   
- III777777$$$$$$+~~~==  MMMMMMM  8M     M  NM        MMI      OMM$      MMO M   
- I777777++++++=.~~====  M     MM 8M     M  NM     7M    MN        M   MD    M   
- 77777 ~~~~~~~~~======  M     NM 8M     M  NM     MO     M    $DDDM  NM     M   
- 77777~~~~~~~=========  M     MM 8M     M  NM     M8     M  MM    M  NM     M   
-  777$~~~~~==========   MNMZ8MM  +MMMMM?M  NM     $M    MM  MM    M   MZ    M   
-      ~~~==,,,,,,       M               M  NMMMMMN  7MMO      MMM=     IMMD     
-      ~======= =~       M               M                                       
-      ~======~ =                    DMMO                                        
-       ~=======                                                                 
-        :=====                                                                  
-         :===                                                                   
-          ,=,                                                                 
 
 Description
 ===========
 
 pyLoad is written entirely in Python and is currently under heavy development.
 
-To read the newest info, get the latest version, find help or contribute
-to the wiki, visit <http://pyload.org/>
+For news, downloads, wiki, forum and further information visit http://pyload.org/
 
 To report bugs, suggest features, ask a question, get the developer version
-or help us out, visit <http://bitbucket.org/spoob/pyload/>
+or help us out, visit http://bitbucket.org/spoob/pyload/
 
-Requirements
+Documentation about extending pyLoad can be found at http://docs.pyload.org or join us at #pyload on irc.freenode.net
+
+Dependencies
 ============
 
-pycrypto: RSDF/CCF/DLC support
-pycurl: lower memory footprint while downloading
-pyqt4: for the GUI
-django: for webinterface
-tesseract, PIL: Captcha recognition
+You need at least python 2.5 to run pyLoad and all of these required libaries.
+They should be automatically installed when using pip install.
+The prebuilt pyload packages also install these dependencies or have them included, so manuall install
+is only needed when installing pyLoad from source.
+
+Required
+--------
+
+- pycurl a.k.a python-curl
+- jinja2
+- beaker
+- thrift
+- simplejson (for python 2.5)
+
+Some plugins require additional packages, only install these when needed.
+
+Optional
+--------
+
+- pycrypto: RSDF/CCF/DLC support
+- tesseract, python-pil a.k.a python-imaging: Automatic captcha recognition for a small amount of plugins
+- jsengine (spidermonkey, ossp-js, pyv8, rhino): Used for several hoster, ClickNLoad
+- feedparser
+- BeautifulSoup
+- pyOpenSSL: For SSL connection
 
 First start
 ===========
 
-First, run
-$ python pyLoadCore.py
-Follow the instructions of the setup assistent.
+Note: If you installed pyload via package-manager `python pyLoadCore.py` is probably equivalent to `pyLoadCore`
+
+Run::
+
+    python pyLoadCore.py
+
+and follow the instructions of the setup assistent.
+
+For a list of options use::
+
+    python pyLoadCore.py -h
 
 Configuration
-===========
+=============
 
-After the first start you can configurate pyLoad with the webinterface or the GUI.
-Additionally you could simply edit the config files located in your pyLoad home dir(defaults to: ~/.pyload)
+After finishing the setup assistent pyLoad is ready to use and more configuration can be done via webinterface.
+Additionally you could simply edit the config files located in your pyLoad home dir (defaults to: ~/.pyload)
 with your favorite editor and edit the appropriate options. For a short description of
-the options take a look at <http://pyload.org/configuration>.
+the options take a look at http://pyload.org/configuration.
+
+To restart the configure assistent run::
+
+    python pyLoadCore.py -s
 
 Adding downloads
-================
+----------------
 
-To start the CLI and connect to a local server, run
-$ python pyLoadCli.py -l
+To start the CLI and connect to a local server, run::
 
-If you want to connect from graphical enviroment, you can also use the GUI:
-$ python pyLoadGui.py
+    python pyLoadCli.py -l
 
-Or access the address you setted for the webinterface with your webbrowser.
+for more options refer to::
+
+    python pyLoadCli.py -h
+
+The webinterface can be accessed when pointing your webbrowser to the ip and configured port, defaults to http://localhost:8000
 
 Notes
 =====
-For more information, see
-<http://pyload.org/>
+For more information, see http://pyload.org/
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pyLoad.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pyLoad.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/pyLoad"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pyLoad"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	make -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."

docs/access_api.rst

+.. _access_api:
+
+*********************
+How to access the API
+*********************
+
+pyLoad has a very powerfull API with can be accessed in several ways.
+
+Overview
+--------
+
+First of all, you need to know what you can do with our API. It lets you do all common task like
+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 <module.Api.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 <module.Api.Api>` as service.
+More information about thrift can be found here http://wiki.apache.org/thrift/.
+
+
+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
+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
+supported here http://wiki.apache.org/thrift/LibraryFeatures?action=show&redirect=LanguageSupport.
+
+Now install thrift, for instructions see http://wiki.apache.org/thrift/ThriftInstallation.
+If every thing went fine you are ready to generate the method stubs, the command basically looks like this. ::
+
+     $ thrift --gen (language) pyload.thrift
+
+You find now a directory named :file:`gen-(language)`. For instruction how to use the generated files consider the docs
+at the thrift wiki and the examples here http://wiki.apache.org/thrift/ThriftUsage.
+
+
+=======
+Example
+=======
+In case you want to use python, pyload has already all files included to access the api over rpc.
+
+A basic script that prints out some information: ::
+
+    from module.remote.thriftbackend.ThriftClient import ThriftClient, WrongLogin
+
+    try:
+        client = ThriftClient(host="127.0.0.1", port=7227, user="User", password="yourpw")
+    except:
+        print "Login was wrong"
+        exit()
+
+    print "Server version:", client.getServerVersion()
+    print client.statusDownloads()
+    q = client.getQueue()
+    for p in q:
+      data = client.getPackageData(p.pid)
+      print "Package Name: ", data.name
+
+That's all for now, pretty easy isn't it?
+If you still have open questions come around in irc or post them at our pyload forum.
+
+
+Using HTTP/JSON
+---------------
+
+Another maybe easier way, which does not require much setup is to access the JSON Api via HTTP.
+For this reason the webinterface must be enabled.
+
+=====
+Login
+=====
+
+First you need to authenticate, if you using this within the webinterface and the user is logged the API is also accessible,
+since they share the same cookie/session.
+
+However, if you are building a external client and want to authenticate manually
+you have to send your credentials ``username`` and ``password`` as
+POST parameter to ``http://pyload-core/api/login``.
+
+The result will be your session id. If you are using cookies, it will be set and you can use the API now.
+In case you dont't have cookies enabled you can pass the session id as ``session`` POST parameter
+so pyLoad can authenticate you.
+
+===============
+Calling Methods
+===============
+
+In general you can use any method listed at the :class:`Api <module.Api.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`.
+
+==================
+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 <module.Api.Api>`
+documentation.
+
+It is important that *all* arguments are in JSON format. So ``http://pyload-core/api/getFileData/1`` is valid because
+1 represents an integer in json format. On the other hand if the method is expecting strings, this would be correct:
+``http://pyload-core/api/getUserData/"username"/"password"``.
+
+Strings are wrapped in double qoutes, because `"username"` represents a string in json format. It's not limited to strings and intergers,
+every container type like lists and dicts are possible. You usually don't have to convert them. just use a json encoder before using them
+in the HTTP request.
+
+Please note that the data have to be urlencoded at last. (Most libaries will do that automatically)
+# -*- coding: utf-8 -*-
+#
+# pyLoad documentation build configuration file, created by
+# sphinx-quickstart on Sat Jun  4 11:54:34 2011.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+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"))
+
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode']
+
+autosummary_generate = True
+autodoc_default_flags = ['members']
+autoclass_content = 'both'
+autodoc_member_order = 'bysource'
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'pyLoad'
+copyright = u'2011, pyLoad Team'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '0.4'
+# The full version, including alpha/beta/rc tags.
+release = '0.4.8'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# 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")
+
+# 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
+# pixels large.
+html_favicon = join(dir_name, "icons", "pyload2.ico")
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'pyLoaddoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'pyLoad.tex', u'pyLoad Documentation',
+   u'pyLoad Team', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'pyload', u'pyLoad Documentation',
+     [u'pyLoad Team'], 1)
+]
+
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {'http://docs.python.org/': None}
+
+# usage: epydoc --conf docs.conf , results goes to ~/.pyload/docs
+
+[epydoc]
+
+modules: pyLoadCore.py, pyLoadCli.py, pyloadGui.py, module
+output: html
+target: docs
+docformat: restructuredtext
+
+exclude: module\.lib|module\.remote\.thriftbackend\.thriftgen|PyQt4|\.pyc|\.pyo|module\.plugins\.(accounts|captcha|container|crypter|hooks|hoster)
+
+name: pyLoad Documentation
+url: http://docs.pyload.org

docs/extend_pyload.rst

+.. _extend_pyload:
+
+********************
+How to extend pyLoad                                                                                                                
+********************
+
+In general there a two different plugin types. These allow everybody to write powerful, modular plugins without knowing
+every detail of the pyLoad core. However you should have some basic knowledge of python.
+
+.. toctree::
+
+    write_hooks.rst
+    write_plugins.rst
+.. pyLoad documentation master file, created by
+   sphinx-quickstart on Sat Jun  4 11:54:34 2011.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to pyLoad's documentation!
+==================================
+
+Great that you found your way to the pyLoad documentation!
+
+We have collected some information here to help developer writing plugins and understandig our code.
+If you want to help us developing visit us in our IRC channel #pyload on freenode.net or leave a message in our forum.
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+   access_api.rst
+   extend_pyload.rst
+   module_overview.rst
+
+.. currentmodule:: module
+
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`

docs/module_overview.rst

+Module Overview
+===============
+
+You can find an overview of some important classes here:
+
+.. autosummary::
+   :toctree: module
+
+   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

docs/write_hooks.rst

+.. _write_hooks:
+
+Hooks
+=====
+
+A Hook is a python file which is located at :file:`module/plugins/hooks`.
+The :class:`HookManager <module.HookManager.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 <module.HookManager.HookManager>`,
+do something complete autonomic and has full access to the :class:`Api <module.Api.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 <module.plugins.Hook.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
+
+        class YourHook(Hook):
+                __name__ = "YourHook"
+                __version__ = "0.1"
+                __description__ = "Does really cool stuff"
+                __config__ = [ ("activated" , "bool" , "Activated"  , "True" ) ]
+                __threaded__ = ["downloadFinished"]
+                __author_name__ = ("Me")
+                __author_mail__ = ("me@has-no-mail.com")
+                
+All meta-data is defined in the header, you need at least one option at ``__config__`` so the user can toggle your
+hook on and off. Dont't overwrite the ``init`` method if not neccesary, use ``setup`` instead.
+
+Using the Config
+----------------
+
+We are taking a closer look at the ``__config__`` parameter.
+You can add more config values as desired by adding tuples of the following format to the config list: ``("name", "type", "description", "default value")``.
+When everything went right you can access the config values with ``self.getConfig(name)`` and ``self.setConfig(name,value``.
+
+
+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 <module.plugins.Hook.Hook>` base class.
+The name is indicating when the function gets called.
+See :class:`Hook <module.plugins.Hook.Hook>` page for a complete listing.
+
+You should be aware of the arguments the Hooks are called with, whether its a :class:`PyFile <module.PyFile.PyFile>`
+or :class:`PyPackage <module.PyPackage.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
+
+    class YourHook(Hook):
+        """
+        Your Hook code here.
+        """
+
+        def coreReady(self):
+            print "Yay, the core is ready let's do some work."
+
+        def downloadFinished(self, pyfile):
+            print "A Download just finished."
+
+Another important feature to mention can be seen at the ``__threaded__`` parameter. Function names listed will be executed
+in a thread, in order to not block the main thread. This should be used for all kind of longer processing tasks.
+
+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 <module.HookManager.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
+
+    class YourHook(Hook):
+        """
+        Your Hook code here.
+        """
+        event_map = {"downloadFinished" : "doSomeWork",
+                     "allDownloadsFnished": "someMethod",
+                     "coreReady": "initialize"}
+
+        def initialize(self):
+            print "Initialized."
+
+        def doSomeWork(self, pyfile):
+            print "This is equivalent to the above example."
+
+        def someMethod(self):
+            print "The underlying event (allDownloadsFinished) for this method is not available through the base class"
+
+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 <module.HookManager.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
+available as event and not accessible through overwriting hook methods. However you can safely do this, it will not be removed and is easier to implement.
+
+
+Providing RPC services
+----------------------
+
+You may noticed that pyLoad has an :class:`Api <module.Api.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
+
+    class YourHook(Hook):
+        """
+        Your Hook code here.
+        """
+        
+        @Expose
+        def invoke(self, arg):
+            print "Invoked with", arg
+
+Thats all, it's available via the :class:`Api <module.Api.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
+
+    print client.getServices()
+    print client.call(ServiceCall("YourHook", "invoke", "an argument"))
+
+Providing status information
+----------------------------
+Your hook can store information in a ``dict`` that can easily be retrievied via the :class:`Api <module.Api.Api>`.
+
+Just store everything in ``self.info``. ::
+
+    from module.plugins.Hook import Hook
+
+    class YourHook(Hook):
+        """
+        Your Hook code here.
+        """
+
+        def setup(self):
+            self.info = {"running": False}
+
+        def coreReady(self):
+            self.info["running"] = True
+
+Usable with: ::
+
+    #Assuming client is a ThriftClient or Api object
+
+    print client.getAllInfo()
+
+Example
+-------
+    Sorry but you won't find an example here ;-)
+    
+    Look at :file:`module/plugins/hooks` and you will find plenty examples there.

docs/write_plugins.rst

+.. _write_plugins:
+
+Plugins
+=======
+
+A Plugin is a python file located at one of the subfolders in :file:`module/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 <module.plugins.Plugin.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
+the plugin. In case the ``__pattern__`` matched on the url the plugin will be assigned to handle it and instanciated when
+pyLoad begins to download/decrypt the url.
+
+Plugin header
+-------------
+
+How basic hoster plugin header could look like: ::
+
+        from module.plugin.Hoster import Hoster
+
+        class MyFileHoster(Hoster):
+                __name__ = "MyFileHoster"
+                __version__ = "0.1"
+                __pattern__ = r"http://myfilehoster.example.com/file_id/[0-9]+"
+                __config__ = []
+
+You have to define these meta-data, ``__pattern__`` has to be a regexp that sucessfully compiles with
+``re.compile(__pattern__)``.
+
+Just like :ref:`write_hooks` you can add and use config values exatly the same way.
+If you want a Crypter or Container plugin, just replace the word Hoster with your desired plugin type.
+
+
+Hoster plugins
+--------------
+
+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
+
+        class MyFileHoster(Hoster):
+            """
+                plugin code
+            """
+            
+            def process(self, pyfile):
+                html = self.load(pyfile.url)  # load the content of the orginal pyfile.url to html
+
+                # parse the name from the site and set attribute in pyfile
+                pyfile.name = self.myFunctionToParseTheName(html)
+                parsed_url = self.myFunctionToParseUrl(html)
+
+                # download the file, destination is determined by pyLoad
+                self.download(parsed_url)
+
+You need to know about the :class:`PyFile <module.PyFile.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
+__________
+
+Some hoster require you to wait a specific time. Just set the time with ``self.setWait(seconds)`` or
+``self.setWait(seconds, True)`` if you want pyLoad to perform a reconnect if needed.
+
+Captcha decrypting
+__________________
+
+To handle captcha input just use ``self.decryptCaptcha(url, ...)``, it will be send to clients
+or handled by :class:`Hook <module.plugins.Hook.Hook>` plugins
+
+Crypter
+-------
+
+What about Decrypter and Container plugins?
+Well, they work nearly the same, only that the function they have to provide is named ``decrypt``
+
+Example: ::
+
+    from module.plugin.Crypter import Crypter
+
+    class MyFileCrypter(Crypter):
+        """
+            plugin code
+        """
+        def decrypt(self, pyfile):
+
+            urls = ["http://get.pyload.org/src", "http://get.pyload.org/debian", "http://get.pyload.org/win"]
+
+            self.packages.append(("pyLoad packages", urls, "pyLoad packages")) # urls list of urls
+
+They can access all the methods from :class:`Plugin <module.plugins.Plugin.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/`.
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: pyLoad 0.4.4\n"
+"Project-Id-Version: pyLoad 0.4.9\n"
 "Report-Msgid-Bugs-To: 'bugs@pyload.org'\n"
-"POT-Creation-Date: 2011-01-26 19:51+0100\n"
+"POT-Creation-Date: 2011-12-07 19:21+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: pyLoadCli.py:60 pyLoadCli.py:584
-msgid "pyLoadCore not running"
-msgstr ""
-
-#: pyLoadCli.py:66 pyLoadCli.py:125
+#: pyLoadCli.py:75 pyLoadCli.py:133
 msgid " Command Line Interface"
 msgstr ""
 
-#: pyLoadCli.py:127
+#: pyLoadCli.py:165
 #, python-format
 msgid "%s Downloads:"
 msgstr ""
 
-#: pyLoadCli.py:139
+#: pyLoadCli.py:177
 msgid " Speed: "
 msgstr ""
 
-#: pyLoadCli.py:139
+#: pyLoadCli.py:177
 msgid " Size: "
 msgstr ""
 
-#: pyLoadCli.py:140
+#: pyLoadCli.py:178
 msgid " Finished in: "
 msgstr ""
 
-#: pyLoadCli.py:141
+#: pyLoadCli.py:179
 msgid " ID: "
 msgstr ""
 
-#: pyLoadCli.py:146
+#: pyLoadCli.py:184
 msgid "waiting: "
 msgstr ""
 
-#: pyLoadCli.py:153 pyLoadCli.py:157
-msgid "Status: "
+#: pyLoadCli.py:191 pyLoadCli.py:193
+msgid "Status:"
 msgstr ""
 
-#: pyLoadCli.py:153 pyLoadCli.py:157
-msgid " total Speed: "
+#: pyLoadCli.py:191
+msgid "paused"
 msgstr ""
 
-#: pyLoadCli.py:154 pyLoadCli.py:158
-msgid " Files in queue: "
+#: pyLoadCli.py:193
+msgid "running"
 msgstr ""
 
-#: pyLoadCli.py:170
+#: pyLoadCli.py:196
+msgid "total Speed"
+msgstr ""
+
+#: pyLoadCli.py:196
+msgid "Files in queue"
+msgstr ""
+
+#: pyLoadCli.py:197
+msgid "Total"
+msgstr ""
+
+#: pyLoadCli.py:203
 msgid "Menu:"
 msgstr ""
 
-#: pyLoadCli.py:175
+#: pyLoadCli.py:205
 msgid " Add Links"
 msgstr ""
 
-#: pyLoadCli.py:177
-msgid " Manage Links"
+#: pyLoadCli.py:206
+msgid " Manage Queue"
 msgstr ""
 
-#: pyLoadCli.py:179
+#: pyLoadCli.py:207
+msgid " Manage Collector"
+msgstr ""
+
+#: pyLoadCli.py:208
 msgid " (Un)Pause Server"
 msgstr ""
 
-#: pyLoadCli.py:181
+#: pyLoadCli.py:209
 msgid " Kill Server"
 msgstr ""
 
-#: pyLoadCli.py:183
+#: pyLoadCli.py:210
 msgid " Quit"
 msgstr ""
 
-#: pyLoadCli.py:193
-msgid "Name your package."
+#: pyLoadCli.py:289 pyLoadCli.py:296
+msgid "Please use this syntax: add <Package name> <link> <link2> ..."
 msgstr ""
 
-#: pyLoadCli.py:203 pyLoadCli.py:220 pyLoadCli.py:261
+#: pyLoadCli.py:315
+#, python-format
+msgid "Checking %d links:"
+msgstr ""
+
+#: pyLoadCli.py:324
+msgid "File does not exists."
+msgstr ""
+
+#: pyLoadCli.py:385
+msgid "pyLoad was terminated"
+msgstr ""
+
+#: pyLoadCli.py:443
+msgid "Prints server status"
+msgstr ""
+
+#: pyLoadCli.py:444
+msgid "Prints downloads in queue"
+msgstr ""
+
+#: pyLoadCli.py:445
+msgid "Prints downloads in collector"
+msgstr ""
+
+#: pyLoadCli.py:446
+msgid "Adds package to queue"
+msgstr ""
+
+#: pyLoadCli.py:447
+msgid "Adds package to collector"
+msgstr ""
+
+#: pyLoadCli.py:448
+msgid "Delete Files from Queue/Collector"
+msgstr ""
+
+#: pyLoadCli.py:449
+msgid "Delete Packages from Queue/Collector"
+msgstr ""
+
+#: pyLoadCli.py:450
+msgid "Move Packages from Queue to Collector or vice versa"
+msgstr ""
+
+#: pyLoadCli.py:451
+msgid "Restart files"
+msgstr ""
+
+#: pyLoadCli.py:452
+msgid "Restart packages"
+msgstr ""
+
+#: pyLoadCli.py:453
+msgid "Check online status, works with local container"
+msgstr ""
+
+#: pyLoadCli.py:454
+msgid "Checks online status of a container file"
+msgstr ""
+
+#: pyLoadCli.py:455
+msgid "Pause the server"
+msgstr ""
+
+#: pyLoadCli.py:456
+msgid "continue downloads"
+msgstr ""
+
+#: pyLoadCli.py:457
+msgid "Toggle pause/unpause"
+msgstr ""
+
+#: pyLoadCli.py:458
+msgid "kill server"
+msgstr ""
+
+#: pyLoadCli.py:460
+msgid "List of commands:"
+msgstr ""
+
+#: pyLoadCli.py:473
+msgid "Couldn't write user config file"
+msgstr ""
+
+#: pyLoadCli.py:548
+msgid "You need py-openssl to connect to this pyLoad Core."
+msgstr ""
+
+#: pyLoadCli.py:555
+msgid "Address: "
+msgstr ""
+
+#: pyLoadCli.py:556
+msgid "Port: "
+msgstr ""
+
+#: pyLoadCli.py:557
+msgid "Username: "
+msgstr ""
+
+#: pyLoadCli.py:561
+msgid "Password: "
+msgstr ""
+
+#: pyLoadCli.py:566 pyLoadCli.py:575
+msgid "Login data is wrong."
+msgstr ""
+
+#: pyLoadCli.py:568 pyLoadCli.py:577
+#, python-format
+msgid "Could not establish connection to %(addr)s:%(port)s."
+msgstr ""
+
+#: pyLoadCli.py:580
+msgid "You need py-openssl to connect to this pyLoad core."
+msgstr ""
+
+#: pyLoadCli.py:582
+msgid "Interactive mode ignored since you passed some commands."
+msgstr ""
+
+#: module/cli/ManageFiles.py:97
+msgid "Manage Packages:"
+msgstr ""
+
+#: module/cli/ManageFiles.py:99
+msgid "Manage Links:"
+msgstr ""
+
+#: module/cli/ManageFiles.py:104
+msgid "What do you want to move?"
+msgstr ""
+
+#: module/cli/ManageFiles.py:106
+msgid "What do you want to delete?"
+msgstr ""
+
+#: module/cli/ManageFiles.py:108
+msgid "What do you want to restart?"
+msgstr ""
+
+#: module/cli/ManageFiles.py:113
+msgid "Choose what yout want to do or enter package number."
+msgstr ""
+
+#: module/cli/ManageFiles.py:115
+msgid "delete"
+msgstr ""
+
+#: module/cli/ManageFiles.py:115
+msgid "move"
+msgstr ""
+
+#: module/cli/ManageFiles.py:115
+msgid "restart"
+msgstr ""
+
+#: module/cli/ManageFiles.py:148
+msgid " - previous"
+msgstr ""
+
+#: module/cli/ManageFiles.py:148
+msgid " - next"
+msgstr ""
+
+#: module/cli/ManageFiles.py:149 module/cli/AddPackage.py:64
 msgid " back to main menu"
 msgstr ""
 
-#: pyLoadCli.py:208
+#: module/cli/AddPackage.py:48
+msgid "Add Package:"
+msgstr ""
+
+#: module/cli/AddPackage.py:53
+msgid "Enter a name for the new package"
+msgstr ""
+
+#: module/cli/AddPackage.py:57
 #, python-format
 msgid "Package: %s"
 msgstr ""
 
-#: pyLoadCli.py:210
+#: module/cli/AddPackage.py:58
 msgid "Parse the links you want to add."
 msgstr ""
 
-#: pyLoadCli.py:212
+#: module/cli/AddPackage.py:59
 #, python-format
 msgid "Type %s when done."
 msgstr ""
 
-#: pyLoadCli.py:214
+#: module/cli/AddPackage.py:60
 msgid "Links added: "
 msgstr ""
-
-#: pyLoadCli.py:227
-msgid ""
-"Type d(number of package) to delete a package, r to restart, or w/o d,r to "
-"look into it."
-msgstr ""
-
-#: pyLoadCli.py:243
-msgid "Type d(number) of the link you want to delete or r(number) to restart."
-msgstr ""
-
-#: pyLoadCli.py:259
-msgid " - previous"
-msgstr ""
-
-#: pyLoadCli.py:259
-msgid " - next"
-msgstr ""
-
-#: pyLoadCli.py:484
-msgid "status"
-msgstr ""
-
-#: pyLoadCli.py:484
-msgid "prints server status"
-msgstr ""
-
-#: pyLoadCli.py:485
-msgid "queue"
-msgstr ""
-
-#: pyLoadCli.py:485
-msgid "prints downloads in queue"
-msgstr ""
-
-#: pyLoadCli.py:486
-msgid "collector"
-msgstr ""
-
-#: pyLoadCli.py:486
-msgid "prints downloads in collector"
-msgstr ""
-
-#: pyLoadCli.py:487
-msgid "pause"
-msgstr ""
-
-#: pyLoadCli.py:487
-msgid "pause the server"
-msgstr ""
-
-#: pyLoadCli.py:488
-msgid "unpause"
-msgstr ""
-
-#: pyLoadCli.py:488
-msgid "continue downloads"
-msgstr ""
-
-#: pyLoadCli.py:489
-msgid "toggle"
-msgstr ""
-
-#: pyLoadCli.py:489
-msgid "toggle pause/unpause"
-msgstr ""
-
-#: pyLoadCli.py:490
-msgid "kill"
-msgstr ""
-
-#: pyLoadCli.py:490
-msgid "kill server"
-msgstr ""
-
-#: pyLoadCli.py:563
-msgid "Username: "
-msgstr ""
-
-#: pyLoadCli.py:564
-msgid "address: "
-msgstr ""
-
-#: pyLoadCli.py:566
-msgid "Use SSL? ([y]/n): "
-msgstr ""
-
-#: pyLoadCli.py:571
-msgid "Port: "
-msgstr ""
-
-#: pyLoadCli.py:575
-msgid "Password: "
-msgstr ""
-
-#: pyLoadCli.py:588
-msgid "Linklist added"
-msgstr ""
-
-#: pyLoadCli.py:617
-msgid "Status: paused"
-msgstr ""
-
-#: pyLoadCli.py:619
-msgid "Status: running"
-msgstr ""
-
-#: pyLoadCli.py:621
-#, python-format
-msgid "%s Downloads"
-msgstr ""
-
-#: pyLoadCli.py:624
-#, python-format
-msgid "Downloading: %(name)-40s %(percent)s%%  @%(speed)dkB/s"
-msgstr ""
-
-#: pyLoadCli.py:626
-#, python-format
-msgid "Waiting: %(name)s-40s: %(format_wait)s"
-msgstr ""
-
-#: pyLoadCli.py:629
-msgid "Unknown Command"
-msgstr ""
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: pyLoad 0.4.4\n"
+"Project-Id-Version: pyLoad 0.4.9\n"
 "Report-Msgid-Bugs-To: 'bugs@pyload.org'\n"
-"POT-Creation-Date: 2011-01-26 19:51+0100\n"
+"POT-Creation-Date: 2011-12-07 19:21+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: pyLoadCore.py:175
+#: pyLoadCore.py:185
 msgid "Received Quit signal"
 msgstr ""
 
-#: pyLoadCore.py:264
+#: pyLoadCore.py:301
 #, python-format
 msgid "pyLoad already running with pid %s"
 msgstr ""
 
-#: pyLoadCore.py:278
+#: pyLoadCore.py:315
 #, python-format
 msgid "Failed changing group: %s"
 msgstr ""
 
-#: pyLoadCore.py:287
+#: pyLoadCore.py:325
 #, python-format
 msgid "Failed changing user: %s"
 msgstr ""
 
-#: pyLoadCore.py:289
+#: pyLoadCore.py:327
 msgid "folder for logs"
 msgstr ""
 
-#: pyLoadCore.py:300
+#: pyLoadCore.py:338
+msgid "Starting"
+msgstr ""
+
+#: pyLoadCore.py:339
 #, python-format
 msgid "Using home directory: %s"
 msgstr ""
 
-#: pyLoadCore.py:306
+#: pyLoadCore.py:348
 msgid "pycrypto to decode container files"
 msgstr ""
 
-#: pyLoadCore.py:309
-msgid "Django for webinterface"
-msgstr ""
-
-#: pyLoadCore.py:310
+#: pyLoadCore.py:351
 msgid "folder for temporary files"
 msgstr ""
 
-#: pyLoadCore.py:315
+#: pyLoadCore.py:356
 msgid "folder for downloads"
 msgstr ""
 
-#: pyLoadCore.py:316
-msgid "file for links"
-msgstr ""
-
-#: pyLoadCore.py:319
+#: pyLoadCore.py:359
 msgid "OpenSSL for secure connection"
 msgstr ""
 
-#: pyLoadCore.py:343
+#: pyLoadCore.py:363
+msgid "Moving old user config to DB"
+msgstr ""
+
+#: pyLoadCore.py:366
+msgid "Please check your logindata with ./pyLoadCore.py -u"
+msgstr ""
+
+#: pyLoadCore.py:369
+msgid "All links removed"
+msgstr ""
+
+#: pyLoadCore.py:400
 #, python-format
 msgid "Downloadtime: %s"
 msgstr ""
 
-#: pyLoadCore.py:354
+#: pyLoadCore.py:410
 #, python-format
-msgid "Free space: %sGB"
+msgid "Free space: %s"
 msgstr ""
 
-#: pyLoadCore.py:356
-#, python-format
-msgid "Free space: %sMB"
+#: pyLoadCore.py:430
+msgid "Activating Accounts..."
 msgstr ""
 
-#: pyLoadCore.py:385
+#: pyLoadCore.py:436
+msgid "Activating Plugins..."
+msgstr ""
+
+#: pyLoadCore.py:439
+msgid "pyLoad is up and running"
+msgstr ""
+
+#: pyLoadCore.py:458
 msgid "restarting pyLoad"
 msgstr ""
 
-#: pyLoadCore.py:389
+#: pyLoadCore.py:462
 msgid "pyLoad quits"
 msgstr ""
 
-#: pyLoadCore.py:436
+#: pyLoadCore.py:519
 #, python-format
 msgid "Install %s"
 msgstr ""
 
-#: pyLoadCore.py:471
+#: pyLoadCore.py:555
 #, python-format
 msgid "could not find %(desc)s: %(name)s"
 msgstr ""
 
-#: pyLoadCore.py:473
+#: pyLoadCore.py:557
 #, python-format
 msgid "could not create %(desc)s: %(name)s"
 msgstr ""
 
-#: pyLoadCore.py:498
+#: pyLoadCore.py:578
 msgid "shutting down..."
 msgstr ""
 
-#: pyLoadCore.py:513
+#: pyLoadCore.py:595
 msgid "error while shutting down"
 msgstr ""
 
-#: pyLoadCore.py:652
+#: pyLoadCore.py:659
+msgid "killed pyLoad from Terminal"
+msgstr ""
+
+#: module/common/JsEngine.py:156
+msgid ""
+"No js engine detected, please install either Spidermonkey, ossp-js, pyv8 or "
+"rhino"
+msgstr ""
+
+#: module/remote/ThriftBackend.py:39
+msgid "Using SSL ThriftBackend"
+msgstr ""
+
+#: module/remote/RemoteManager.py:35
+#, python-format
+msgid "Remote backend error: %s"
+msgstr ""
+
+#: module/remote/RemoteManager.py:82
+#, python-format
+msgid "Starting %(name)s: %(addr)s:%(port)s"
+msgstr ""
+
+#: module/remote/RemoteManager.py:84
+#, python-format
+msgid "Failed loading backend %(name)s | %(error)s"
+msgstr ""
+
+#: module/ThreadManager.py:137
+#, python-format
+msgid "Reconnect Failed: %s"
+msgstr ""
+
+#: module/ThreadManager.py:176
+msgid "Reconnect script not found!"
+msgstr ""
+
+#: module/ThreadManager.py:182
+msgid "Starting reconnect"
+msgstr ""
+
+#: module/ThreadManager.py:196
+msgid "Failed executing reconnect script!"
+msgstr ""
+
+#: module/ThreadManager.py:208
+#, python-format
+msgid "Reconnected, new IP: %s"
+msgstr ""
+
+#: module/ThreadManager.py:288
+msgid "Not enough space left on device"
+msgstr ""
+
+#: module/HookManager.py:90 module/plugins/Hook.py:102
+#, python-format
+msgid "Error executing hooks: %s"
+msgstr ""
+
+#: module/HookManager.py:140
+#, python-format
+msgid "Failed activating %(name)s"
+msgstr ""
+
+#: module/HookManager.py:144
+#, python-format
+msgid "Activated plugins: %s"
+msgstr ""
+
+#: module/HookManager.py:145
+#, python-format
+msgid "Deactivate plugins: %s"
+msgstr ""
+
+#: module/CaptchaManager.py:78 module/interaction/InteractionManager.py:82
+msgid "No Client connected for captcha decrypting"
+msgstr ""
+
+#: module/web/ServerThread.py:35
+msgid "SSL certificates not found."
+msgstr ""
+
+#: module/web/ServerThread.py:39
+#, python-format
+msgid "Sorry, we dropped support for starting %s directly within pyLoad"
+msgstr ""
+
+#: module/web/ServerThread.py:40
+msgid "You can use the threaded server which offers good performance and ssl,"
+msgstr ""
+
+#: module/web/ServerThread.py:41
+#, python-format
+msgid ""
+"of course you can still use your existing %s with pyLoa