summaryrefslogtreecommitdiffstats
path: root/pyload/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'pyload/plugins')
-rw-r--r--pyload/plugins/Base.py30
-rw-r--r--pyload/plugins/Crypter.py77
-rw-r--r--pyload/plugins/Hoster.py6
-rw-r--r--pyload/plugins/network/CurlRequest.py1
4 files changed, 56 insertions, 58 deletions
diff --git a/pyload/plugins/Base.py b/pyload/plugins/Base.py
index 3ca8abdd0..abb59a7bc 100644
--- a/pyload/plugins/Base.py
+++ b/pyload/plugins/Base.py
@@ -1,21 +1,19 @@
# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: RaNaN
-"""
+###############################################################################
+# Copyright(c) 2008-2013 pyLoad Team
+# http://www.pyload.org
+#
+# This file is part of pyLoad.
+# pyLoad is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# Subjected to the terms and conditions in LICENSE
+#
+# @author: RaNaN
+###############################################################################
import sys
from time import time, sleep
diff --git a/pyload/plugins/Crypter.py b/pyload/plugins/Crypter.py
index cce43fb56..2175b5f94 100644
--- a/pyload/plugins/Crypter.py
+++ b/pyload/plugins/Crypter.py
@@ -1,50 +1,60 @@
# -*- coding: utf-8 -*-
-from traceback import print_exc
-
-from pyload.Api import LinkStatus
+from pyload.Api import LinkStatus, DownloadStatus as DS
from pyload.utils import to_list, has_method, uniqify
from pyload.utils.fs import exists, remove, fs_encode
from pyload.utils.packagetools import parseNames
-from Base import Base, Retry
+from Base import Base, Fail, Retry, Abort
class Package:
""" Container that indicates that a new package should be created """
- def __init__(self, name=None, urls=None):
+ def __init__(self, name=None, links=None):
self.name = name
- self.urls = urls if urls else []
+ self.links = []
+
+ if links:
+ self.addLinks(links)
# nested packages
self.packs = []
- def addURL(self, url):
- self.urls.append(url)
+ def addLinks(self, links):
+ """ Add one or multiple links to the package
+
+ :param links: One or list of urls or :class:`LinkStatus`
+ """
+ links = to_list(links)
+ for link in links:
+ if not isinstance(link, LinkStatus):
+ link = LinkStatus(link, link, -1, DS.Queued)
- def addLink(self, url, name, status, size):
- # TODO: allow to add urls with known information
- pass
+ self.links.append(link)
def addPackage(self, pack):
self.packs.append(pack)
+ def getURLs(self):
+ return [link.url for link in self.links]
+
def getAllURLs(self):
- urls = self.urls
+ urls = self.getURLs()
for p in self.packs:
urls.extend(p.getAllURLs())
return urls
# same name and urls is enough to be equal for packages
def __eq__(self, other):
- return self.name == other.name and self.urls == other.urls
+ return self.name == other.name and self.links == other.links
def __repr__(self):
- return u"<CrypterPackage name=%s, links=%s, packs=%s" % (self.name, self.urls, self.packs)
+ return u"<CrypterPackage name=%s, links=[%s], packs=%s" % (self.name, ",".join(str(l) for l in self.links),
+ self.packs)
def __hash__(self):
- return hash(self.name) ^ hash(frozenset(self.urls)) ^ hash(self.name)
+ return hash(self.name) ^ hash(frozenset(self.links)) ^ hash(self.name)
class PyFileMockup:
@@ -53,7 +63,7 @@ class PyFileMockup:
def __init__(self, url, pack):
self.url = url
self.name = url
- self._package = pack
+ self._package = None
self.packageid = pack.id if pack else -1
def package(self):
@@ -91,18 +101,21 @@ class Crypter(Base):
QUEUE_DECRYPT = False
@classmethod
- def decrypt(cls, core, url_or_urls):
+ def decrypt(cls, core, url_or_urls, password=None):
"""Static method to decrypt urls or content. Can be used by other plugins.
To decrypt file content prefix the string with ``CONTENT_PREFIX `` as seen above.
:param core: pyLoad `Core`, needed in decrypt context
:param url_or_urls: List of urls or single url/ file content
+ :param password: optional password used for decrypting
+
+ :raises Exception: No decryption errors are cascaded
:return: List of decrypted urls, all package info removed
"""
urls = to_list(url_or_urls)
- p = cls(core)
+ p = cls(core, password)
try:
- result = p.processDecrypt(urls)
+ result = p._decrypt(urls)
finally:
p.clean()
@@ -113,12 +126,12 @@ class Crypter(Base):
ret.extend(url_or_pack.getAllURLs())
else: # single url
ret.append(url_or_pack)
- # eliminate duplicates
+ # eliminate duplicates
return uniqify(ret)
# TODO: pass user to crypter
# TODO: crypter could not only know url, but also the name and size
- def __init__(self, core, package=None, password=None):
+ def __init__(self, core, password=None):
Base.__init__(self, core)
self.req = None
@@ -131,8 +144,6 @@ class Crypter(Base):
if self.req is None:
self.req = core.requestFactory.getRequest()
- # Package the plugin was initialized for, don't use this, its not guaranteed to be set
- self.package = package
#: Password supplied by user
self.password = password
@@ -186,7 +197,7 @@ class Crypter(Base):
return [Package(name, purls) for name, purls in parseNames([(url, url) for url in urls]).iteritems()]
def _decrypt(self, urls):
- """ Internal method to select decrypting method
+ """Internal method to select decrypting method
:param urls: List of urls/content
:return:
@@ -208,7 +219,7 @@ class Crypter(Base):
self.logDebug("Deprecated .decrypt() method in Crypter plugin")
result = []
for url in urls:
- self.pyfile = PyFileMockup(url, self.package)
+ self.pyfile = PyFileMockup(url)
self.setup()
self.decrypt(self.pyfile)
result.extend(self.convertPackages())
@@ -223,22 +234,12 @@ class Crypter(Base):
result.extend(to_list(self.decryptFile(c)))
try:
if f.startswith("tmp_"): remove(f)
- except:
- pass
+ except IOError:
+ self.logWarning(_("Could not remove file '%s'") % f)
+ self.core.print_exc()
return result
- def processDecrypt(self, urls):
- """Catches all exceptions in decrypt methods and return results
-
- :return: Decrypting results
- """
- try:
- return to_list(self._decrypt(urls))
- except Exception:
- self.core.print_exc()
- return []
-
def getLocalContent(self, urls):
"""Load files from disk and separate to file content and url list
diff --git a/pyload/plugins/Hoster.py b/pyload/plugins/Hoster.py
index bc1e4f9d0..4d96c5730 100644
--- a/pyload/plugins/Hoster.py
+++ b/pyload/plugins/Hoster.py
@@ -58,16 +58,14 @@ class Hoster(Base):
@staticmethod
def getInfo(urls):
"""This method is used to retrieve the online status of files for hoster plugins.
- It has to *yield* list of tuples with the result in this format (name, size, status, url),
- where status is one of API pyfile statuses.
:param urls: List of urls
- :return: yield list of tuple with results (name, size, status, url)
+ :return: yield list of :class:`LinkStatus` as result
"""
pass
def __init__(self, pyfile):
- Base.__init__(self, pyfile.m.core)
+ Base.__init__(self, pyfile.m.core, pyfile.owner)
self.wantReconnect = False
#: enables simultaneous processing of multiple downloads
diff --git a/pyload/plugins/network/CurlRequest.py b/pyload/plugins/network/CurlRequest.py
index 182553ed1..8d1f22450 100644
--- a/pyload/plugins/network/CurlRequest.py
+++ b/pyload/plugins/network/CurlRequest.py
@@ -40,6 +40,7 @@ def myurlencode(data):
bad_headers = range(400, 418) + range(500, 506)
+pycurl.global_init(pycurl.GLOBAL_DEFAULT)
class CurlRequest(Request):
""" Request class based on libcurl """