diff options
Diffstat (limited to 'module/plugins/crypter')
91 files changed, 631 insertions, 615 deletions
| diff --git a/module/plugins/crypter/BitshareComFolder.py b/module/plugins/crypter/BitshareComFolder.py index c70a849b6..f0dd9e570 100644 --- a/module/plugins/crypter/BitshareComFolder.py +++ b/module/plugins/crypter/BitshareComFolder.py @@ -6,11 +6,12 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  class BitshareComFolder(SimpleCrypter):      __name__    = "BitshareComFolder"      __type__    = "crypter" -    __version__ = "0.03" +    __version__ = "0.04"      __pattern__ = r'http://(?:www\.)?bitshare\.com/\?d=\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Bitshare.com folder decrypter plugin"""      __license__     = "GPLv3" @@ -18,7 +19,7 @@ class BitshareComFolder(SimpleCrypter):      LINK_PATTERN = r'<a href="(http://bitshare\.com/files/.+)">.+</a></td>' -    NAME_PATTERN = r'View public folder "(?P<N>.+)"</h1>' +    NAME_PATTERN = r'View public folder "(?P<N>.+?)"</h1>'  getInfo = create_getInfo(BitshareComFolder) diff --git a/module/plugins/crypter/C1neonCom.py b/module/plugins/crypter/C1NeonCom.py index 926633ff7..9b6093081 100644 --- a/module/plugins/crypter/C1neonCom.py +++ b/module/plugins/crypter/C1NeonCom.py @@ -9,7 +9,7 @@ class C1NeonCom(DeadCrypter):      __version__ = "0.05"      __pattern__ = r'http://(?:www\.)?c1neon\.com/.+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """C1neon.com decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/ChipDe.py b/module/plugins/crypter/ChipDe.py index 133e5a005..6938a2225 100644 --- a/module/plugins/crypter/ChipDe.py +++ b/module/plugins/crypter/ChipDe.py @@ -1,17 +1,17 @@  # -*- coding: utf-8 -*-  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class ChipDe(Crypter):      __name__    = "ChipDe"      __type__    = "crypter" -    __version__ = "0.10" +    __version__ = "0.11"      __pattern__ = r'http://(?:www\.)?chip\.de/video/.+\.html' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Chip.de decrypter plugin"""      __license__     = "GPLv3" @@ -22,7 +22,7 @@ class ChipDe(Crypter):          self.html = self.load(pyfile.url)          try:              f = re.search(r'"(http://video\.chip\.de/.+)"', self.html) -        except: +        except Exception:              self.fail(_("Failed to find the URL"))          else:              self.urls = [f.group(1)] diff --git a/module/plugins/crypter/CloudzillaToFolder.py b/module/plugins/crypter/CloudzillaToFolder.py index c156d4de4..96d7245f1 100644 --- a/module/plugins/crypter/CloudzillaToFolder.py +++ b/module/plugins/crypter/CloudzillaToFolder.py @@ -1,8 +1,7 @@  # -*- coding: utf-8 -*-  import re - -from urlparse import urljoin +import urlparse  from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo @@ -10,7 +9,7 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  class CloudzillaToFolder(SimpleHoster):      __name__    = "CloudzillaToFolder"      __type__    = "crypter" -    __version__ = "0.01" +    __version__ = "0.02"      __pattern__ = r'http://(?:www\.)?cloudzilla\.to/share/folder/(?P<ID>[\w^_]+)' @@ -36,8 +35,4 @@ class CloudzillaToFolder(SimpleHoster):              self.retry(reason="Wrong password") -    def getLinks(self): -        return [urljoin("http://www.cloudzilla.to", link) for link in super(CloudzillaToFolder, self).getLinks()] - -  getInfo = create_getInfo(CloudzillaToFolder) diff --git a/module/plugins/crypter/CrockoComFolder.py b/module/plugins/crypter/CrockoComFolder.py index 57bb339ff..f56cc449a 100644 --- a/module/plugins/crypter/CrockoComFolder.py +++ b/module/plugins/crypter/CrockoComFolder.py @@ -9,15 +9,16 @@ class CrockoComFolder(SimpleCrypter):      __version__ = "0.01"      __pattern__ = r'http://(?:www\.)?crocko\.com/f/.+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Crocko.com folder decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] -    LINK_PATTERN = r'<td class="last"><a href="([^"]+)">download</a>' +    LINK_PATTERN = r'<td class="last"><a href="(.+?)">download</a>'  getInfo = create_getInfo(CrockoComFolder) diff --git a/module/plugins/crypter/CryptItCom.py b/module/plugins/crypter/CryptItCom.py index 2cf4e9f62..1c9e841b7 100644 --- a/module/plugins/crypter/CryptItCom.py +++ b/module/plugins/crypter/CryptItCom.py @@ -9,7 +9,7 @@ class CryptItCom(DeadCrypter):      __version__ = "0.11"      __pattern__ = r'http://(?:www\.)?crypt-it\.com/(s|e|d|c)/\w+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Crypt-it.com decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/CzshareComFolder.py b/module/plugins/crypter/CzshareComFolder.py index 5623a4093..5b5e6fd27 100644 --- a/module/plugins/crypter/CzshareComFolder.py +++ b/module/plugins/crypter/CzshareComFolder.py @@ -1,17 +1,17 @@  # -*- coding: utf-8 -*-  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class CzshareComFolder(Crypter):      __name__    = "CzshareComFolder"      __type__    = "crypter" -    __version__ = "0.20" +    __version__ = "0.21"      __pattern__ = r'http://(?:www\.)?(czshare|sdilej)\.(com|cz)/folders/.+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Czshare.com folder decrypter plugin, now Sdilej.cz"""      __license__     = "GPLv3" @@ -19,7 +19,7 @@ class CzshareComFolder(Crypter):      FOLDER_PATTERN = r'<tr class="subdirectory">\s*<td>\s*<table>(.*?)</table>' -    LINK_PATTERN = r'<td class="col2"><a href="([^"]+)">info</a></td>' +    LINK_PATTERN = r'<td class="col2"><a href="(.+?)">info</a></td>'      def decrypt(self, pyfile): diff --git a/module/plugins/crypter/DDLMusicOrg.py b/module/plugins/crypter/DDLMusicOrg.py deleted file mode 100644 index 55181e9ad..000000000 --- a/module/plugins/crypter/DDLMusicOrg.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from time import sleep - -from module.plugins.Crypter import Crypter - - -class DDLMusicOrg(Crypter): -    __name__    = "DDLMusicOrg" -    __type__    = "crypter" -    __version__ = "0.30" - -    __pattern__ = r'http://(?:www\.)?ddl-music\.org/captcha/ddlm_cr\d\.php\?\d+\?\d+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] - -    __description__ = """Ddl-music.org decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("mkaay", "mkaay@mkaay.de")] - - -    def setup(self): -        self.multiDL = False - - -    def decrypt(self, pyfile): -        html = self.load(pyfile.url, cookies=True) - -        if re.search(r"Wer dies nicht rechnen kann", html) is not None: -            self.offline() - -        math = re.search(r"(\d+) ([+-]) (\d+) =\s+<inp", self.html) -        id = re.search(r"name=\"id\" value=\"(\d+)\"", self.html).group(1) -        linknr = re.search(r"name=\"linknr\" value=\"(\d+)\"", self.html).group(1) - -        solve = "" -        if math.group(2) == "+": -            solve = int(math.group(1)) + int(math.group(3)) -        else: -            solve = int(math.group(1)) - int(math.group(3)) -        sleep(3) -        htmlwithlink = self.load(pyfile.url, cookies=True, -                                     post={"calc%s" % linknr: solve, "send%s" % linknr: "Send", "id": id, -                                           "linknr": linknr}) -        m = re.search(r"<form id=\"ff\" action=\"(.*?)\" method=\"post\">", htmlwithlink) -        if m: -            self.urls = [m.group(1)] -        else: -            self.retry() diff --git a/module/plugins/crypter/DailymotionBatch.py b/module/plugins/crypter/DailymotionComFolder.py index 8d4cb64df..2458b15b1 100644 --- a/module/plugins/crypter/DailymotionBatch.py +++ b/module/plugins/crypter/DailymotionComFolder.py @@ -1,22 +1,21 @@  # -*- coding: utf-8 -*-  import re - -from urlparse import urljoin +import urlparse  from module.common.json_layer import json_loads -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  from module.utils import save_join -class DailymotionBatch(Crypter): -    __name__    = "DailymotionBatch" +class DailymotionComFolder(Crypter): +    __name__    = "DailymotionComFolder"      __type__    = "crypter" -    __version__ = "0.01" +    __version__ = "0.02"      __pattern__ = r'https?://(?:www\.)?dailymotion\.com/((playlists/)?(?P<TYPE>playlist|user)/)?(?P<ID>[\w^_]+)(?(TYPE)|#)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Dailymotion.com channel & playlist decrypter"""      __license__     = "GPLv3" @@ -24,9 +23,9 @@ class DailymotionBatch(Crypter):      def api_response(self, ref, req=None): -        url = urljoin("https://api.dailymotion.com/", ref) -        page = self.load(url, get=req) -        return json_loads(page) +        url  = urlparse.urljoin("https://api.dailymotion.com/", ref) +        html = self.load(url, get=req) +        return json_loads(html)      def getPlaylistInfo(self, id): diff --git a/module/plugins/crypter/DataHuFolder.py b/module/plugins/crypter/DataHuFolder.py index a5602d6c6..c0fe26869 100644 --- a/module/plugins/crypter/DataHuFolder.py +++ b/module/plugins/crypter/DataHuFolder.py @@ -8,11 +8,12 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  class DataHuFolder(SimpleCrypter):      __name__    = "DataHuFolder"      __type__    = "crypter" -    __version__ = "0.06" +    __version__ = "0.07"      __pattern__ = r'http://(?:www\.)?data\.hu/dir/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Data.hu folder decrypter plugin"""      __license__     = "GPLv3" @@ -21,7 +22,7 @@ class DataHuFolder(SimpleCrypter):      LINK_PATTERN = r'<a href=\'(http://data\.hu/get/.+)\' target=\'_blank\'>\1</a>' -    NAME_PATTERN = ur'<title>(?P<N>.+) Let\xf6lt\xe9se</title>' +    NAME_PATTERN = ur'<title>(?P<N>.+?) Let\xf6lt\xe9se</title>'      def prepare(self): diff --git a/module/plugins/crypter/DdlstorageComFolder.py b/module/plugins/crypter/DdlstorageComFolder.py index e02e77fda..dc6ec1da5 100644 --- a/module/plugins/crypter/DdlstorageComFolder.py +++ b/module/plugins/crypter/DdlstorageComFolder.py @@ -9,7 +9,7 @@ class DdlstorageComFolder(DeadCrypter):      __version__ = "0.03"      __pattern__ = r'https?://(?:www\.)?ddlstorage\.com/folder/\w+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """DDLStorage.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/DepositfilesComFolder.py b/module/plugins/crypter/DepositfilesComFolder.py index 147f093c3..46ec265c3 100644 --- a/module/plugins/crypter/DepositfilesComFolder.py +++ b/module/plugins/crypter/DepositfilesComFolder.py @@ -9,15 +9,16 @@ class DepositfilesComFolder(SimpleCrypter):      __version__ = "0.01"      __pattern__ = r'http://(?:www\.)?depositfiles\.com/folders/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Depositfiles.com folder decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] -    LINK_PATTERN = r'<div class="progressName"[^>]*>\s*<a href="([^"]+)" title="[^"]*" target="_blank">' +    LINK_PATTERN = r'<div class="progressName".*?>\s*<a href="(.+?)" title=".+?" target="_blank">'  getInfo = create_getInfo(DepositfilesComFolder) diff --git a/module/plugins/crypter/Dereferer.py b/module/plugins/crypter/Dereferer.py index 0729c8cb6..5c73b2622 100644 --- a/module/plugins/crypter/Dereferer.py +++ b/module/plugins/crypter/Dereferer.py @@ -1,17 +1,40 @@  # -*- coding: utf-8 -*- -from module.plugins.internal.SimpleDereferer import SimpleDereferer +import re +from module.plugins.internal.SimpleCrypter import SimpleCrypter -class Dereferer(SimpleDereferer): + +class Dereferer(SimpleCrypter):      __name__    = "Dereferer"      __type__    = "crypter" -    __version__ = "0.11" +    __version__ = "0.16" -    __pattern__ = r'https?://([^/]+)/.*?(?P<LINK>(ht|f)tps?(://|%3A%2F%2F).+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __pattern__ = r'https?://(?:www\.)?(?:\w+\.)*?(?P<DOMAIN>(?:[\d.]+|[\w\-]{3,}(?:\.[a-zA-Z]{2,}){1,2})(?:\:\d+)?)/.*?(?P<LINK>(?:ht|f)tps?://.+)' +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Crypter for dereferers"""      __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] +    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    HOSTER_DOMAIN = None +    HOSTER_NAME   = None + + +    def _log(self, type, args): +        return super(Dereferer, self)._log(type, (self.HOSTER_NAME,) + args) + + +    def init(self): +        super(Dereferer, self).init() + +        self.__pattern__ = self.core.pluginManager.crypterPlugins[self.__name__]['pattern']  #@TODO: Recheck in 0.4.10 + +        self.HOSTER_DOMAIN = re.match(self.__pattern__, self.pyfile.url).group("DOMAIN").lower() +        self.HOSTER_NAME   = "".join(part.capitalize() for part in re.split(r'(\.|\d+)', self.HOSTER_DOMAIN) if part != '.') + + +    def getLinks(self): +        return [re.match(self.__pattern__, self.pyfile.url).group('LINK').strip()] diff --git a/module/plugins/crypter/DevhostStFolder.py b/module/plugins/crypter/DevhostStFolder.py index 5ac9d4faf..4d15e2058 100644 --- a/module/plugins/crypter/DevhostStFolder.py +++ b/module/plugins/crypter/DevhostStFolder.py @@ -4,8 +4,7 @@  # http://d-h.st/users/shine/?fld_id=37263#files  import re - -from urlparse import urljoin +import urlparse  from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo @@ -13,11 +12,12 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  class DevhostStFolder(SimpleCrypter):      __name__    = "DevhostStFolder"      __type__    = "crypter" -    __version__ = "0.03" +    __version__ = "0.05"      __pattern__ = r'http://(?:www\.)?d-h\.st/users/(?P<USER>\w+)(/\?fld_id=(?P<ID>\d+))?' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """d-h.st folder decrypter plugin"""      __license__     = "GPLv3" @@ -25,37 +25,41 @@ class DevhostStFolder(SimpleCrypter):                         ("Walter Purcaro", "vuolter@gmail.com")] -    LINK_PATTERN = r'(?:/> |;">)<a href="(.+?)"(?!>Back to \w+<)' +    LINK_PATTERN    = r'(?:/> |;">)<a href="(.+?)"(?!>Back to \w+<)'      OFFLINE_PATTERN = r'"/cHP">test\.png<' -    def getFileInfo(self): -        if re.search(self.OFFLINE_PATTERN, self.html): -            self.offline() +    def checkNameSize(self, getinfo=True): +        if not self.info or getinfo: +            self.logDebug("File info (BEFORE): %s" % self.info) +            self.info.update(self.getInfo(self.pyfile.url, self.html)) +            self.logDebug("File info (AFTER): %s"  % self.info)          try: -            id = re.match(self.__pattern__, self.pyfile.url).group('ID') -            if id == "0": +            if self.info['pattern']['ID'] == "0":                  raise              p = r'href="(.+?)">Back to \w+<'              m = re.search(p, self.html) -            html = self.load(urljoin("http://d-h.st", m.group(1)), +            html = self.load(urlparse.urljoin("http://d-h.st", m.group(1)),                               cookies=False) -            p = '\?fld_id=%s.*?">(.+?)<' % id +            p = '\?fld_id=%s.*?">(.+?)<' % self.info['pattern']['ID']              m = re.search(p, html) -            name = folder = m.group(1) +            self.pyfile.name = m.group(1)          except Exception, e:              self.logDebug(e) -            name = folder = re.match(self.__pattern__, self.pyfile.url).group('USER') +            self.pyfile.name = self.info['pattern']['USER'] -        return {'name': name, 'folder': folder} +        try: +            folder = self.info['folder'] = self.pyfile.name +        except Exception: +            pass -    def getLinks(self): -        return [urljoin("http://d-h.st", link) for link in re.findall(self.LINK_PATTERN, self.html)] +        self.logDebug("File name: %s"   % self.pyfile.name, +                      "File folder: %s" % self.pyfile.name)  getInfo = create_getInfo(DevhostStFolder) diff --git a/module/plugins/crypter/DlProtectCom.py b/module/plugins/crypter/DlProtectCom.py index 4a188aa83..a9f39c6f3 100644 --- a/module/plugins/crypter/DlProtectCom.py +++ b/module/plugins/crypter/DlProtectCom.py @@ -1,9 +1,9 @@  # -*- coding: utf-8 -*-  import re +import time  from base64 import urlsafe_b64encode -from time import time  from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo @@ -14,8 +14,9 @@ class DlProtectCom(SimpleCrypter):      __version__ = "0.03"      __pattern__ = r'https?://(?:www\.)?dl-protect\.com/((en|fr)/)?\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Dl-protect.com decrypter plugin"""      __license__     = "GPLv3" @@ -40,7 +41,7 @@ class DlProtectCom(SimpleCrypter):              self.wait(2)          else: -            mstime  = int(round(time() * 1000)) +            mstime  = int(round(time.time() * 1000))              b64time = "_" + urlsafe_b64encode(str(mstime)).replace("=", "%3D")              post_req.update({'i'         : b64time, diff --git a/module/plugins/crypter/DontKnowMe.py b/module/plugins/crypter/DontKnowMe.py deleted file mode 100644 index d656cde4c..000000000 --- a/module/plugins/crypter/DontKnowMe.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleDereferer import SimpleDereferer - - -class DontKnowMe(SimpleDereferer): -    __name__    = "DontKnowMe" -    __type__    = "crypter" -    __version__ = "0.11" - -    __pattern__ = r'http://(?:www\.)?dontknow\.me/at/\?(?P<LINK>.+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] - -    __description__ = """DontKnow.me decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("selaux", "")] diff --git a/module/plugins/crypter/DuckCryptInfo.py b/module/plugins/crypter/DuckCryptInfo.py index 07cc5cdc4..631ed00b7 100644 --- a/module/plugins/crypter/DuckCryptInfo.py +++ b/module/plugins/crypter/DuckCryptInfo.py @@ -4,17 +4,17 @@ import re  from BeautifulSoup import BeautifulSoup -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class DuckCryptInfo(Crypter):      __name__    = "DuckCryptInfo"      __type__    = "crypter" -    __version__ = "0.02" +    __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?duckcrypt\.info/(folder|wait|link)/(\w+)/?(\w*)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """DuckCrypt.info decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/DuploadOrgFolder.py b/module/plugins/crypter/DuploadOrgFolder.py index 066fbe3d7..d505806b7 100644 --- a/module/plugins/crypter/DuploadOrgFolder.py +++ b/module/plugins/crypter/DuploadOrgFolder.py @@ -9,7 +9,7 @@ class DuploadOrgFolder(DeadCrypter):      __version__ = "0.02"      __pattern__ = r'http://(?:www\.)?dupload\.org/folder/\d+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Dupload.org folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/EasybytezComFolder.py b/module/plugins/crypter/EasybytezComFolder.py index 04f9b853b..fdd3d4ff4 100644 --- a/module/plugins/crypter/EasybytezComFolder.py +++ b/module/plugins/crypter/EasybytezComFolder.py @@ -9,16 +9,14 @@ class EasybytezComFolder(XFSCrypter):      __version__ = "0.10"      __pattern__ = r'http://(?:www\.)?easybytez\.com/users/\d+/\d+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Easybytez.com folder decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("stickell", "l.stickell@yahoo.it")] -    HOSTER_DOMAIN = "easybytez.com" -      LOGIN_ACCOUNT = True diff --git a/module/plugins/crypter/EmbeduploadCom.py b/module/plugins/crypter/EmbeduploadCom.py index be3181793..221e365fa 100644 --- a/module/plugins/crypter/EmbeduploadCom.py +++ b/module/plugins/crypter/EmbeduploadCom.py @@ -1,27 +1,27 @@  # -*- coding: utf-8 -*-  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  from module.network.HTTPRequest import BadHeader  class EmbeduploadCom(Crypter):      __name__    = "EmbeduploadCom"      __type__    = "crypter" -    __version__ = "0.02" +    __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?embedupload\.com/\?d=.+' -    __config__ = [("use_subfolder", "bool", "Save package to subfolder", True), -                  ("subfolder_per_package", "bool", "Create a subfolder for each package", True), -                  ("preferedHoster", "str", "Prefered hoster list (bar-separated)", "embedupload"), -                  ("ignoredHoster", "str", "Ignored hoster list (bar-separated)", "")] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"           , True         ), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package" , True         ), +                   ("preferedHoster"    , "str" , "Prefered hoster list (bar-separated)", "embedupload"), +                   ("ignoredHoster"     , "str" , "Ignored hoster list (bar-separated)" , ""           )]      __description__ = """EmbedUpload.com decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] -    LINK_PATTERN = r'<div id="([^"]+)"[^>]*>\s*<a href="([^"]+)" target="_blank" (?:class="DownloadNow"|style="color:red")>' +    LINK_PATTERN = r'<div id="(.+?)".*?>\s*<a href="(.+?)" target="_blank" (?:class="DownloadNow"|style="color:red")>'      def decrypt(self, pyfile): @@ -30,21 +30,21 @@ class EmbeduploadCom(Crypter):          m = re.findall(self.LINK_PATTERN, self.html)          if m: -            prefered_set = set(self.getConfig("preferedHoster").split('|')) +            prefered_set = set(self.getConfig('preferedHoster').split('|'))              prefered_set = map(lambda s: s.lower().split('.')[0], prefered_set)              self.logDebug("PF: %s" % prefered_set) -            tmp_links.extend([x[1] for x in m if x[0] in prefered_set]) +            tmp_links.extend(x[1] for x in m if x[0] in prefered_set)              self.urls = self.getLocation(tmp_links)              if not self.urls: -                ignored_set = set(self.getConfig("ignoredHoster").split('|')) +                ignored_set = set(self.getConfig('ignoredHoster').split('|'))                  ignored_set = map(lambda s: s.lower().split('.')[0], ignored_set)                  self.logDebug("IG: %s" % ignored_set) -                tmp_links.extend([x[1] for x in m if x[0] not in ignored_set]) +                tmp_links.extend(x[1] for x in m if x[0] not in ignored_set)                  self.urls = self.getLocation(tmp_links) diff --git a/module/plugins/crypter/FilebeerInfoFolder.py b/module/plugins/crypter/FilebeerInfoFolder.py index a3c7ee74c..5b401c555 100644 --- a/module/plugins/crypter/FilebeerInfoFolder.py +++ b/module/plugins/crypter/FilebeerInfoFolder.py @@ -9,7 +9,7 @@ class FilebeerInfoFolder(DeadCrypter):      __version__ = "0.02"      __pattern__ = r'http://(?:www\.)?filebeer\.info/\d*~f\w+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Filebeer.info folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/FilecloudIoFolder.py b/module/plugins/crypter/FilecloudIoFolder.py index 83cce352d..f900f4910 100644 --- a/module/plugins/crypter/FilecloudIoFolder.py +++ b/module/plugins/crypter/FilecloudIoFolder.py @@ -9,8 +9,9 @@ class FilecloudIoFolder(SimpleCrypter):      __version__ = "0.03"      __pattern__ = r'https?://(?:www\.)?(filecloud\.io|ifile\.it)/_\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Filecloud.io folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/FilecryptCc.py b/module/plugins/crypter/FilecryptCc.py index af31dc743..2271a7b6d 100644 --- a/module/plugins/crypter/FilecryptCc.py +++ b/module/plugins/crypter/FilecryptCc.py @@ -1,20 +1,22 @@  # -*- coding: utf-8 -*- +# +# Test links: +#   http://filecrypt.cc/Container/64E039F859.html -import base64  import binascii  import re +import urlparse  from Crypto.Cipher import AES -from urlparse import urljoin -from module.plugins.Crypter import Crypter -from module.plugins.internal.CaptchaService import ReCaptcha +from module.plugins.internal.Crypter import Crypter +from module.plugins.internal.ReCaptcha import ReCaptcha  class FilecryptCc(Crypter):      __name__    = "FilecryptCc"      __type__    = "crypter" -    __version__ = "0.09" +    __version__ = "0.16"      __pattern__ = r'https?://(?:www\.)?filecrypt\.cc/Container/\w+' @@ -31,7 +33,7 @@ class FilecryptCc(Crypter):      CAPTCHA_PATTERN        = r'<img id="nc" src="(.+?)"'      CIRCLE_CAPTCHA_PATTERN = r'<input type="image" src="(.+?)"' -    MIRROR_PAGE_PATTERN = r'"[\w]*" href="(http://filecrypt.cc/Container/\w+\.html\?mirror=\d+)">' +    MIRROR_PAGE_PATTERN = r'"[\w]*" href="(https?://(?:www\.)?filecrypt.cc/Container/\w+\.html\?mirror=\d+)">'      def setup(self): @@ -39,7 +41,8 @@ class FilecryptCc(Crypter):      def decrypt(self, pyfile): -        self.html = self.load(pyfile.url, cookies=True) +        self.html = self.load(pyfile.url) +        self.base_url = self.pyfile.url.split("Container")[0]          if "content notfound" in self.html:  #@NOTE: "content notfound" is NOT a typo              self.offline() @@ -64,7 +67,7 @@ class FilecryptCc(Crypter):          self.logInfo(_("Found %d mirrors") % len(mirror))          for i in mirror[1:]: -            self.siteWithLinks = self.siteWithLinks + self.load(i, cookies=True).decode("utf-8", "replace") +            self.siteWithLinks = self.siteWithLinks + self.load(i).decode("utf-8", "replace")      def handlePasswordProtection(self): @@ -78,7 +81,7 @@ class FilecryptCc(Crypter):          if not password:              self.fail(_("Please enter the password in package section and try again")) -        self.html = self.load(self.pyfile.url, post={"password": password}, cookies=True) +        self.html = self.load(self.pyfile.url, post={"password": password})      def handleCaptcha(self): @@ -88,40 +91,37 @@ class FilecryptCc(Crypter):          if m:  #: normal captcha              self.logDebug("Captcha-URL: %s" % m.group(1)) -            captcha_code = self.decryptCaptcha(urljoin("http://filecrypt.cc", m.group(1)), +            captcha_code = self.decryptCaptcha(urlparse.urljoin(self.base_url, m.group(1)),                                                 forceUser=True,                                                 imgtype="gif")              self.siteWithLinks = self.load(self.pyfile.url,                                             post={'recaptcha_response_field': captcha_code}, -                                           cookies=True,                                             decode=True)          elif m2:  #: circle captcha              self.logDebug("Captcha-URL: %s" % m2.group(1)) -            captcha_code = self.decryptCaptcha(urljoin("http://filecrypt.cc", m2.group(1)), -                                               forceUser=True, -                                               imgtype="gif", +            captcha_code = self.decryptCaptcha('%s%s?c=abc' %(self.base_url, m2.group(1)),                                                 result_type='positional')              self.siteWithLinks = self.load(self.pyfile.url,                                             post={'button.x': captcha_code[0], 'button.y': captcha_code[1]}, -                                           cookies=True,                                             decode=True) +          else:              recaptcha   = ReCaptcha(self)              captcha_key = recaptcha.detect_key()              if captcha_key: -                self.siteWithLinks = self.load(self.pyfile.url, -                                               post={'g-recaptcha-response': recaptcha.challenge(captcha_key, True)}, -                                               cookies=True, -                                               decode=True) +                response, challenge = recaptcha.challenge(captcha_key) +                self.siteWithLinks  = self.load(self.pyfile.url, +                                                post={'g-recaptcha-response': response}, +                                                decode=True)              else: -                self.logDebug("No captcha found") +                self.logInfo(_("No captcha found"))                  self.siteWithLinks = self.html -        if "recaptcha_image" in self.siteWithLinks: +        if "recaptcha_image" in self.siteWithLinks or "data-sitekey" in self.siteWithLinks:              self.invalidCaptcha()              self.retry() @@ -133,7 +133,7 @@ class FilecryptCc(Crypter):              return          for i in dlc: -            self.links.append("http://filecrypt.cc/DLC/%s.dlc" % i) +            self.links.append("%s/DLC/%s.dlc" % (self.base_url, i))      def handleWeblinks(self): @@ -141,9 +141,9 @@ class FilecryptCc(Crypter):              weblinks = re.findall(self.WEBLINK_PATTERN, self.siteWithLinks)              for link in weblinks: -                res   = self.load("http://filecrypt.cc/Link/%s.html" % link, cookies=True) +                res   = self.load("%s/Link/%s.html" % (self.base_url, link))                  link2 = re.search('<iframe noresize src="(.*)"></iframe>', res) -                res2  = self.load(link2.group(1), just_header=True, cookies=True) +                res2  = self.load(link2.group(1), just_header=True)                  self.links.append(res2['location'])          except Exception, e: @@ -166,17 +166,14 @@ class FilecryptCc(Crypter):          # Get key          key = binascii.unhexlify(str(jk)) -        # Decode crypted -        crypted = base64.standard_b64decode(crypted) -          # Decrypt          Key  = key          IV   = key          obj  = AES.new(Key, AES.MODE_CBC, IV) -        text = obj.decrypt(crypted) +        text = obj.decrypt(crypted.decode('base64'))          # Extract links -        links = filter(lambda x: x != "", -                       text.replace("\x00", "").replace("\r", "").split("\n")) +        text  = text.replace("\x00", "").replace("\r", "") +        links = filter(bool, text.split('\n'))          return links diff --git a/module/plugins/crypter/FilefactoryComFolder.py b/module/plugins/crypter/FilefactoryComFolder.py index 261c7e01a..c0cd028cc 100644 --- a/module/plugins/crypter/FilefactoryComFolder.py +++ b/module/plugins/crypter/FilefactoryComFolder.py @@ -9,8 +9,9 @@ class FilefactoryComFolder(SimpleCrypter):      __version__ = "0.32"      __pattern__ = r'https?://(?:www\.)?filefactory\.com/(?:f|folder)/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Filefactory.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/FilerNetFolder.py b/module/plugins/crypter/FilerNetFolder.py index 00db173bb..e2b44e868 100644 --- a/module/plugins/crypter/FilerNetFolder.py +++ b/module/plugins/crypter/FilerNetFolder.py @@ -6,11 +6,12 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  class FilerNetFolder(SimpleCrypter):      __name__    = "FilerNetFolder"      __type__    = "crypter" -    __version__ = "0.41" +    __version__ = "0.42"      __pattern__ = r'https?://filer\.net/folder/\w{16}' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Filer.net decrypter plugin"""      __license__     = "GPLv3" @@ -19,11 +20,9 @@ class FilerNetFolder(SimpleCrypter):      LINK_PATTERN = r'href="(/get/\w{16})">(?!<)' -    NAME_PATTERN = r'<h3>(?P<N>.+?) - <small' - -    def getLinks(self): -        return ['http://filer.net%s' % link for link in re.findall(self.LINK_PATTERN, self.html)] +    NAME_PATTERN    = r'<h3>(?P<N>.+?) - <small' +    OFFLINE_PATTERN = r'Nicht gefunden'  getInfo = create_getInfo(FilerNetFolder) diff --git a/module/plugins/crypter/FileserveComFolder.py b/module/plugins/crypter/FileserveComFolder.py index e6b35fd36..edd7562df 100644 --- a/module/plugins/crypter/FileserveComFolder.py +++ b/module/plugins/crypter/FileserveComFolder.py @@ -2,17 +2,17 @@  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class FileserveComFolder(Crypter):      __name__    = "FileserveComFolder"      __type__    = "crypter" -    __version__ = "0.11" +    __version__ = "0.12"      __pattern__ = r'http://(?:www\.)?fileserve\.com/list/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """FileServe.com folder decrypter plugin"""      __license__     = "GPLv3" @@ -20,7 +20,7 @@ class FileserveComFolder(Crypter):      FOLDER_PATTERN = r'<table class="file_list">(.*?)</table>' -    LINK_PATTERN = r'<a href="([^"]+)" class="sheet_icon wbold">' +    LINK_PATTERN = r'<a href="(.+?)" class="sheet_icon wbold">'      def decrypt(self, pyfile): diff --git a/module/plugins/crypter/FilesonicComFolder.py b/module/plugins/crypter/FilesonicComFolder.py index d58516986..6cd4d8b8c 100644 --- a/module/plugins/crypter/FilesonicComFolder.py +++ b/module/plugins/crypter/FilesonicComFolder.py @@ -9,6 +9,7 @@ class FilesonicComFolder(DeadCrypter):      __version__ = "0.12"      __pattern__ = r'http://(?:www\.)?filesonic\.com/folder/\w+' +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Filesonic.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/FilestubeCom.py b/module/plugins/crypter/FilestubeCom.py index 16ebdda37..9e6b5c114 100644 --- a/module/plugins/crypter/FilestubeCom.py +++ b/module/plugins/crypter/FilestubeCom.py @@ -6,11 +6,12 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  class FilestubeCom(SimpleCrypter):      __name__    = "FilestubeCom"      __type__    = "crypter" -    __version__ = "0.05" +    __version__ = "0.06"      __pattern__ = r'http://(?:www\.)?filestube\.(?:com|to)/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Filestube.com decrypter plugin"""      __license__     = "GPLv3" @@ -18,7 +19,7 @@ class FilestubeCom(SimpleCrypter):      LINK_PATTERN = r'<a class=\"file-link-main(?: noref)?\" [^>]* href=\"(http://[^\"]+)' -    NAME_PATTERN = r'<h1\s*> (?P<N>.+)  download\s*</h1>' +    NAME_PATTERN = r'<h1\s*> (?P<N>.+?)  download\s*</h1>'  getInfo = create_getInfo(FilestubeCom) diff --git a/module/plugins/crypter/FiletramCom.py b/module/plugins/crypter/FiletramCom.py index 76530c589..b012d35bc 100644 --- a/module/plugins/crypter/FiletramCom.py +++ b/module/plugins/crypter/FiletramCom.py @@ -9,8 +9,9 @@ class FiletramCom(SimpleCrypter):      __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?filetram\.com/[^/]+/.+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Filetram.com decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/FiredriveComFolder.py b/module/plugins/crypter/FiredriveComFolder.py index 7d3a357fd..792f3198b 100644 --- a/module/plugins/crypter/FiredriveComFolder.py +++ b/module/plugins/crypter/FiredriveComFolder.py @@ -9,7 +9,7 @@ class FiredriveComFolder(DeadCrypter):      __version__ = "0.03"      __pattern__ = r'https?://(?:www\.)?(firedrive|putlocker)\.com/share/.+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Firedrive.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/FourChanOrg.py b/module/plugins/crypter/FourChanOrg.py index c3fe3db4b..f3195fe02 100644 --- a/module/plugins/crypter/FourChanOrg.py +++ b/module/plugins/crypter/FourChanOrg.py @@ -3,18 +3,19 @@  # Based on 4chandl by Roland Beermann (https://gist.github.com/enkore/3492599)  import re +import urlparse -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class FourChanOrg(Crypter):      __name__    = "FourChanOrg"      __type__    = "crypter" -    __version__ = "0.31" +    __version__ = "0.32"      __pattern__ = r'http://(?:www\.)?boards\.4chan\.org/\w+/res/(\d+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """4chan.org folder decrypter plugin"""      __license__     = "GPLv3" @@ -23,5 +24,5 @@ class FourChanOrg(Crypter):      def decrypt(self, pyfile):          pagehtml = self.load(pyfile.url) -        images = set(re.findall(r'(images\.4chan\.org/[^/]*/src/[^"<]*)', pagehtml)) -        self.urls = ["http://" + image for image in images] +        images = set(re.findall(r'(images\.4chan\.org/[^/]*/src/[^"<]+)', pagehtml)) +        self.urls = [urlparse.urljoin("http://", image) for image in images] diff --git a/module/plugins/crypter/FreakhareComFolder.py b/module/plugins/crypter/FreakhareComFolder.py index 7c1b7de2b..173660668 100644 --- a/module/plugins/crypter/FreakhareComFolder.py +++ b/module/plugins/crypter/FreakhareComFolder.py @@ -11,15 +11,16 @@ class FreakhareComFolder(SimpleCrypter):      __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?freakshare\.com/folder/.+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Freakhare.com folder decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("stickell", "l.stickell@yahoo.it")] -    LINK_PATTERN = r'<a href="(http://freakshare\.com/files/[^"]+)" target="_blank">' +    LINK_PATTERN = r'<a href="(http://freakshare\.com/files/.+?)" target="_blank">'      NAME_PATTERN = r'Folder:</b> (?P<N>.+)'      PAGES_PATTERN = r'Pages: +(\d+)' diff --git a/module/plugins/crypter/FreetexthostCom.py b/module/plugins/crypter/FreetexthostCom.py index c33c9ff64..cf6fbb8a4 100644 --- a/module/plugins/crypter/FreetexthostCom.py +++ b/module/plugins/crypter/FreetexthostCom.py @@ -11,8 +11,9 @@ class FreetexthostCom(SimpleCrypter):      __version__ = "0.01"      __pattern__ = r'http://(?:www\.)?freetexthost\.com/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Freetexthost.com decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/FshareVnFolder.py b/module/plugins/crypter/FshareVnFolder.py index 474364e40..bbee53337 100644 --- a/module/plugins/crypter/FshareVnFolder.py +++ b/module/plugins/crypter/FshareVnFolder.py @@ -9,15 +9,16 @@ class FshareVnFolder(SimpleCrypter):      __version__ = "0.01"      __pattern__ = r'http://(?:www\.)?fshare\.vn/folder/.+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Fshare.vn folder decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] -    LINK_PATTERN = r'<li class="w_80pc"><a href="([^"]+)" target="_blank">' +    LINK_PATTERN = r'<li class="w_80pc"><a href="(.+?)" target="_blank">'  getInfo = create_getInfo(FshareVnFolder) diff --git a/module/plugins/crypter/FurLy.py b/module/plugins/crypter/FurLy.py new file mode 100644 index 000000000..b8e9332e2 --- /dev/null +++ b/module/plugins/crypter/FurLy.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo + + +class FurLy(SimpleCrypter): +    __name__    = "FurLy" +    __type__    = "crypter" +    __version__ = "0.01" + +    __pattern__ = r'http://(?:www\.)?fur\.ly/(\d/)?\w+' + +    __description__ = """Fur.ly decrypter plugin""" +    __license__     = "GPLv3" +    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    URL_REPLACEMENTS = [(r'fur\.ly/', r'fur\.ly/bar/')] + +    LINK_PATTERN    = r'urls\[\d+\] = "(.+?)"' +    OFFLINE_PATTERN = r'var output;\s*var total' + + +getInfo = create_getInfo(FurLy) diff --git a/module/plugins/crypter/Go4UpCom.py b/module/plugins/crypter/Go4UpCom.py index 102bc32b5..22f31f6f6 100644 --- a/module/plugins/crypter/Go4UpCom.py +++ b/module/plugins/crypter/Go4UpCom.py @@ -1,8 +1,7 @@  # -*- coding: utf-8 -*-  import re - -from urlparse import urljoin +import urlparse  from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo @@ -10,9 +9,12 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  class Go4UpCom(SimpleCrypter):      __name__    = "Go4UpCom"      __type__    = "crypter" -    __version__ = "0.11" +    __version__ = "0.12"      __pattern__ = r'http://go4up\.com/(dl/\w{12}|rd/\w{12}/\d+)' +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Go4Up.com decrypter plugin"""      __license__     = "GPLv3" @@ -27,12 +29,12 @@ class Go4UpCom(SimpleCrypter):      OFFLINE_PATTERN = r'>\s*(404 Page Not Found|File not Found|Mirror does not exist)' -    def getLinks(self +    def getLinks(self):          links = [] -        m = re.search(r'(/download/gethosts/.+?)"') +        m = re.search(r'(/download/gethosts/.+?)"', self.html)          if m: -            self.html = self.load(urljoin("http://go4up.com/", m.group(1))) +            self.html = self.load(urlparse.urljoin("http://go4up.com/", m.group(1)))              pages = [self.load(url) for url in re.findall(self.LINK_PATTERN, self.html)]          else:              pages = [self.html] @@ -40,7 +42,7 @@ class Go4UpCom(SimpleCrypter):          for html in pages:              try:                  links.append(re.search(r'<b><a href="(.+?)"', html).group(1)) -            except: +            except Exception:                  continue          return links diff --git a/module/plugins/crypter/GooGl.py b/module/plugins/crypter/GooGl.py index d548a3375..b36e22884 100644 --- a/module/plugins/crypter/GooGl.py +++ b/module/plugins/crypter/GooGl.py @@ -1,32 +1,32 @@  # -*- coding: utf-8 -*- -from module.plugins.Crypter import Crypter +from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  from module.common.json_layer import json_loads -class GooGl(Crypter): +class GooGl(SimpleCrypter):      __name__    = "GooGl"      __type__    = "crypter" -    __version__ = "0.01" +    __version__ = "0.03" -    __pattern__ = r'https?://(?:www\.)?goo\.gl/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __pattern__ = r'https?://(?:www\.)?goo\.gl/([a-zA-Z]+/)?\w+'      __description__ = """Goo.gl decrypter plugin"""      __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it")] +    __authors__     = [("stickell"      , "l.stickell@yahoo.it"), +                       ("Walter Purcaro", "vuolter@gmail.com"  )]      API_URL = "https://www.googleapis.com/urlshortener/v1/url" +    OFFLINE_PATTERN = r'has been disabled|does not exist' -    def decrypt(self, pyfile): -        rep = self.load(self.API_URL, get={'shortUrl': pyfile.url}) + +    def getLinks(self): +        rep = self.load(self.API_URL, get={'shortUrl': self.pyfile.url})          self.logDebug("JSON data: " + rep)          rep = json_loads(rep) +        return [rep['longUrl']] if "longUrl" in rep else None + -        if 'longUrl' in rep: -            self.urls = [rep['longUrl']] -        else: -            self.fail(_("Unable to expand shortened link")) +getInfo = create_getInfo(GooGl) diff --git a/module/plugins/crypter/GoogledriveComFolder.py b/module/plugins/crypter/GoogledriveComFolder.py new file mode 100644 index 000000000..70898b313 --- /dev/null +++ b/module/plugins/crypter/GoogledriveComFolder.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -* + +from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo + + +class GoogledriveComFolder(SimpleCrypter): +    __name__    = "GoogledriveCom" +    __type__    = "crypter" +    __version__ = "0.01" + +    __pattern__ = r'https?://(?:www\.)?drive\.google\.com/folderview\?.*id=\w+' +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True),  #: Overrides core.config['general']['folder_per_package'] +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)] + +    __description__ = """Drive.google.com folder decrypter plugin""" +    __license__     = "GPLv3" +    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    NAME_PATTERN    = r"folderName: '(?P<N>.+?)'" +    LINK_PATTERN    = r'\[,"\w+"(?:,,".+?")?,"(.+?)"' +    OFFLINE_PATTERN = r'<TITLE>' + + +getInfo = create_getInfo(GoogledriveComFolder) diff --git a/module/plugins/crypter/HoerbuchIn.py b/module/plugins/crypter/HoerbuchIn.py index a347e4232..09749eba6 100644 --- a/module/plugins/crypter/HoerbuchIn.py +++ b/module/plugins/crypter/HoerbuchIn.py @@ -4,17 +4,17 @@ import re  from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class HoerbuchIn(Crypter):      __name__    = "HoerbuchIn"      __type__    = "crypter" -    __version__ = "0.60" +    __version__ = "0.61"      __pattern__ = r'http://(?:www\.)?hoerbuch\.in/(wp/horbucher/\d+/.+/|tp/out\.php\?.+|protection/folder_\d+\.html)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Hoerbuch.in decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/HotfileComFolder.py b/module/plugins/crypter/HotfileComFolder.py index 4f40587ad..f1dd56228 100644 --- a/module/plugins/crypter/HotfileComFolder.py +++ b/module/plugins/crypter/HotfileComFolder.py @@ -9,7 +9,7 @@ class HotfileComFolder(DeadCrypter):      __version__ = "0.30"      __pattern__ = r'https?://(?:www\.)?hotfile\.com/list/\w+/\w+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Hotfile.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/ILoadTo.py b/module/plugins/crypter/ILoadTo.py index f3415706d..4c7387739 100644 --- a/module/plugins/crypter/ILoadTo.py +++ b/module/plugins/crypter/ILoadTo.py @@ -9,7 +9,7 @@ class ILoadTo(DeadCrypter):      __version__ = "0.11"      __pattern__ = r'http://(?:www\.)?iload\.to/go/\d+-[\w.-]+/' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Iload.to decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/ImgurComAlbum.py b/module/plugins/crypter/ImgurComAlbum.py index 6c074f5f1..9ef7797af 100644 --- a/module/plugins/crypter/ImgurComAlbum.py +++ b/module/plugins/crypter/ImgurComAlbum.py @@ -10,8 +10,9 @@ class ImgurComAlbum(SimpleCrypter):      __version__ = "0.51"      __pattern__ = r'https?://(?:www\.|m\.)?imgur\.com/(a|gallery|)/?\w{5,7}' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Imgur.com decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/JunocloudMeFolder.py b/module/plugins/crypter/JunocloudMeFolder.py deleted file mode 100644 index 990f25902..000000000 --- a/module/plugins/crypter/JunocloudMeFolder.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.XFSCrypter import XFSCrypter, create_getInfo - - -class JunocloudMeFolder(XFSCrypter): -    __name__    = "JunocloudMeFolder" -    __type__    = "crypter" -    __version__ = "0.03" - -    __pattern__ = r'http://(?:www\.)?junocloud\.me/folders/(?P<ID>\d+/\w+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] - -    __description__ = """Junocloud.me folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("guidobelix", "guidobelix@hotmail.it")] - - -    HOSTER_DOMAIN = "junocloud.me" - - -getInfo = create_getInfo(JunocloudMeFolder) diff --git a/module/plugins/crypter/LetitbitNetFolder.py b/module/plugins/crypter/LetitbitNetFolder.py index 56ecbc7f8..e98b1ebc3 100644 --- a/module/plugins/crypter/LetitbitNetFolder.py +++ b/module/plugins/crypter/LetitbitNetFolder.py @@ -1,17 +1,17 @@  # -*- coding: utf-8 -*-  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class LetitbitNetFolder(Crypter):      __name__    = "LetitbitNetFolder"      __type__    = "crypter" -    __version__ = "0.10" +    __version__ = "0.11"      __pattern__ = r'http://(?:www\.)?letitbit\.net/folder/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Letitbit.net folder decrypter plugin"""      __license__     = "GPLv3" @@ -20,7 +20,7 @@ class LetitbitNetFolder(Crypter):      FOLDER_PATTERN = r'<table>(.*)</table>' -    LINK_PATTERN = r'<a href="([^"]+)" target="_blank">' +    LINK_PATTERN = r'<a href="(.+?)" target="_blank">'      def decrypt(self, pyfile): diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py index 996a92c7b..28c431e80 100644 --- a/module/plugins/crypter/LinkCryptWs.py +++ b/module/plugins/crypter/LinkCryptWs.py @@ -1,6 +1,5 @@  # -*- coding: utf-8 -*- -import base64  import binascii  import re @@ -8,14 +7,14 @@ import pycurl  from Crypto.Cipher import AES -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  from module.utils import html_unescape  class LinkCryptWs(Crypter):      __name__    = "LinkCryptWs"      __type__    = "crypter" -    __version__ = "0.08" +    __version__ = "0.09"      __pattern__ = r'http://(?:www\.)?linkcrypt\.ws/(dir|container)/(?P<ID>\w+)' @@ -92,7 +91,7 @@ class LinkCryptWs(Crypter):      def isOnline(self):          if "<title>Linkcrypt.ws // Error 404</title>" in self.html: -            self.logDebug("folder doesen't exist anymore") +            self.logDebug("Folder doesn't exist anymore")              return False          else:              return True @@ -132,7 +131,7 @@ class LinkCryptWs(Crypter):      def unlockCaptchaProtection(self): -        captcha_url  = re.search(r'<form.*?id\s*?=\s*?"captcha"[^>]*?>.*?<\s*?input.*?src="([^"]*?)"', self.html, re.I | re.S).group(1) +        captcha_url  = re.search(r'<form.*?id\s*?=\s*?"captcha"[^>]*?>.*?<\s*?input.*?src="(.+?)"', self.html, re.I | re.S).group(1)          captcha_code = self.decryptCaptcha(captcha_url, forceUser=True, imgtype="gif", result_type='positional')          self.html = self.load(self.pyfile.url, post={"x": captcha_code[0], "y": captcha_code[1]}) @@ -191,15 +190,13 @@ class LinkCryptWs(Crypter):          self.logDebug("Search for Web links ")          package_links = [] -        pattern = r'<form action="http://linkcrypt.ws/out.html"[^>]*?>.*?<input[^>]*?value="([^"]*?)"[^>]*?name="file"' +        pattern = r'<form action="http://linkcrypt.ws/out.html"[^>]*?>.*?<input[^>]*?value="(.+?)"[^>]*?name="file"'          ids = re.findall(pattern, self.html, re.I | re.S)          self.logDebug("Decrypting %d Web links" % len(ids))          for idx, weblink_id in enumerate(ids):              try: -                self.logDebug("Decrypting Web link %d, %s" % (idx + 1, weblink_id)) -                  res = self.load("http://linkcrypt.ws/out.html", post = {'file':weblink_id})                  indexs = res.find("window.location =") + 19 @@ -207,8 +204,6 @@ class LinkCryptWs(Crypter):                  link2 = res[indexs:indexe] -                self.logDebug(link2) -                  link2 = html_unescape(link2)                  package_links.append(link2) @@ -245,7 +240,7 @@ class LinkCryptWs(Crypter):          for line in self.container_html:              if type in line:                  jseval = self.handle_javascript(line) -                clink = re.search(r'href=["\']([^"\']*?)["\']',jseval,re.I) +                clink = re.search(r'href=["\'](["\']+)', jseval, re.I)                  if not clink:                      continue @@ -279,7 +274,7 @@ class LinkCryptWs(Crypter):              (vcrypted, vjk) = self._getCipherParams(cnl_section)              for (crypted, jk) in zip(vcrypted, vjk):                  package_links.extend(self._getLinks(crypted, jk)) -        except: +        except Exception:              self.logError(_("Unable to decrypt CNL links (JS Error) try to get over links"))              return self.handleWebLinks() @@ -307,19 +302,15 @@ class LinkCryptWs(Crypter):          self.logDebug("JsEngine returns value [%s]" % 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) +        text = obj.decrypt(crypted.decode('base64'))          # Extract links          text  = text.replace("\x00", "").replace("\r", "") -        links = text.split("\n") -        links = filter(lambda x: x != "", links) +        links = filter(bool, text.split('\n'))          # Log and return          self.logDebug("Package has %d links" % len(links)) diff --git a/module/plugins/crypter/LinkSaveIn.py b/module/plugins/crypter/LinkSaveIn.py index e96d0438e..dce74b689 100644 --- a/module/plugins/crypter/LinkSaveIn.py +++ b/module/plugins/crypter/LinkSaveIn.py @@ -1,16 +1,16 @@  # -*- coding: utf-8 -*- -from module.plugins.internal.SimpleDereferer import SimpleDereferer +from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo -class LinkSaveIn(SimpleDereferer): +class LinkSaveIn(SimpleCrypter):      __name__    = "LinkSaveIn"      __type__    = "crypter" -    __version__ = "2.03" +    __version__ = "2.05"      __pattern__ = r'https?://(?:www\.)?linksave\.in/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """LinkSave.in decrypter plugin"""      __license__     = "GPLv3" @@ -20,3 +20,6 @@ class LinkSaveIn(SimpleDereferer):      COOKIES = [("linksave.in", "Linksave_Language", "english")]      OFFLINE_PATTERN = r'>(Error )?404 -' + + +getInfo = create_getInfo(LinkSaveIn) diff --git a/module/plugins/crypter/LinkdecrypterCom.py b/module/plugins/crypter/LinkdecrypterCom.py index 7f24784c7..e12bf3359 100644 --- a/module/plugins/crypter/LinkdecrypterCom.py +++ b/module/plugins/crypter/LinkdecrypterCom.py @@ -1,17 +1,18 @@  # -*- coding: utf-8 -*-  import re -from module.plugins.Crypter import Crypter + +from module.plugins.internal.Crypter import Crypter  class LinkdecrypterCom(Crypter):      __name__    = "LinkdecrypterCom"      __type__    = "crypter" -    __version__ = "0.29" +    __version__ = "0.30"      __pattern__ = r'^unmatchable$' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Linkdecrypter.com decrypter plugin"""      __license__     = "GPLv3" @@ -34,10 +35,10 @@ class LinkdecrypterCom(Crypter):          retries = 5          post_dict = {"link_cache": "on", "pro_links": pyfile.url, "modo_links": "text"} -        self.html = self.load('http://linkdecrypter.com/', post=post_dict, cookies=True, decode=True) +        self.html = self.load('http://linkdecrypter.com/', post=post_dict, decode=True)          while retries: -            m = re.search(self.TEXTAREA_PATTERN, self.html, flags=re.S) +            m = re.search(self.TEXTAREA_PATTERN, self.html, re.S)              if m:                  self.urls = [x for x in m.group(1).splitlines() if '[LINK-ERROR]' not in x] @@ -65,4 +66,4 @@ class LinkdecrypterCom(Crypter):              else:                  retries -= 1 -                self.html = self.load('http://linkdecrypter.com/', cookies=True, decode=True) +                self.html = self.load('http://linkdecrypter.com/', decode=True) diff --git a/module/plugins/crypter/LixIn.py b/module/plugins/crypter/LixIn.py index d899d58c7..a4bd9df1e 100644 --- a/module/plugins/crypter/LixIn.py +++ b/module/plugins/crypter/LixIn.py @@ -1,18 +1,19 @@  # -*- coding: utf-8 -*-  import re +import urlparse -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class LixIn(Crypter):      __name__    = "LixIn"      __type__    = "crypter" -    __version__ = "0.22" +    __version__ = "0.23"      __pattern__ = r'http://(?:www\.)?lix\.in/(?P<ID>.+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Lix.in decrypter plugin"""      __license__     = "GPLv3" @@ -46,7 +47,7 @@ class LixIn(Crypter):                  m = re.search(self.CAPTCHA_PATTERN, self.html)                  if m:                      self.logDebug("Trying captcha") -                    captcharesult = self.decryptCaptcha("http://lix.in/" + m.group(1)) +                    captcharesult = self.decryptCaptcha(urlparse.urljoin("http://lix.in/", m.group(1)))                  self.html = self.load(url, decode=True,                                            post={"capt": captcharesult, "submit": "submit", "tiny": id})              else: diff --git a/module/plugins/crypter/LofCc.py b/module/plugins/crypter/LofCc.py index 3cac0fbf2..62e05f299 100644 --- a/module/plugins/crypter/LofCc.py +++ b/module/plugins/crypter/LofCc.py @@ -9,7 +9,7 @@ class LofCc(DeadCrypter):      __version__ = "0.21"      __pattern__ = r'http://(?:www\.)?lof\.cc/(.+)' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Lof.cc decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/MBLinkInfo.py b/module/plugins/crypter/MBLinkInfo.py index 82c2d9719..7ff400f7e 100644 --- a/module/plugins/crypter/MBLinkInfo.py +++ b/module/plugins/crypter/MBLinkInfo.py @@ -9,7 +9,7 @@ class MBLinkInfo(DeadCrypter):      __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?mblink\.info/?\?id=(\d+)' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """MBLink.info decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/MediafireComFolder.py b/module/plugins/crypter/MediafireComFolder.py index d1dc89518..c3b1c7e9f 100644 --- a/module/plugins/crypter/MediafireComFolder.py +++ b/module/plugins/crypter/MediafireComFolder.py @@ -1,7 +1,7 @@  # -*- coding: utf-8 -*-  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  from module.plugins.hoster.MediafireCom import checkHTMLHeader  from module.common.json_layer import json_loads @@ -9,11 +9,11 @@ from module.common.json_layer import json_loads  class MediafireComFolder(Crypter):      __name__    = "MediafireComFolder"      __type__    = "crypter" -    __version__ = "0.14" +    __version__ = "0.15"      __pattern__ = r'http://(?:www\.)?mediafire\.com/(folder/|\?sharekey=|\?\w{13}($|[/#]))' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Mediafire.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/MegaCoNzFolder.py b/module/plugins/crypter/MegaCoNzFolder.py index bec4eba22..517a6b239 100644 --- a/module/plugins/crypter/MegaCoNzFolder.py +++ b/module/plugins/crypter/MegaCoNzFolder.py @@ -8,11 +8,11 @@ from module.plugins.internal.Crypter import Crypter  class MegaCoNzFolder(Crypter):      __name__    = "MegaCoNzFolder"      __type__    = "crypter" -    __version__ = "0.03" +    __version__ = "0.05" -    __pattern__ = r'(?:https?://(?:www\.)?mega\.co\.nz/|mega:|chrome:.+?)#F!(?P<ID>[\w+^_])!(?P<KEY>[\w,\\-]+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __pattern__ = r'(https?://(?:www\.)?mega(\.co)?\.nz/|mega:|chrome:.+?)#F!(?P<ID>[\w^_]+)!(?P<KEY>[\w,\\-]+)' +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Mega.co.nz folder decrypter plugin"""      __license__     = "GPLv3" @@ -26,7 +26,7 @@ class MegaCoNzFolder(Crypter):      def decrypt(self, pyfile):          url       = "https://mega.co.nz/#F!%s!%s" % re.match(self.__pattern__, pyfile.url).groups()          self.html = self.load("http://rapidgen.org/linkfinder", post={'linklisturl': url}) -        self.urls = re.findall(r'(https://mega.co.nz/#N!.+?)<', self.html) +        self.urls = re.findall(r'(https://mega(\.co)?\.nz/#N!.+?)<', self.html)          if not self.urls:  #@TODO: Remove in 0.4.10 -            self.fail("No link grabbed") +            self.fail(_("No link grabbed")) diff --git a/module/plugins/crypter/MegaRapidCzFolder.py b/module/plugins/crypter/MegaRapidCzFolder.py index e7dff6c8a..fadd6dbed 100644 --- a/module/plugins/crypter/MegaRapidCzFolder.py +++ b/module/plugins/crypter/MegaRapidCzFolder.py @@ -9,15 +9,16 @@ class MegaRapidCzFolder(SimpleCrypter):      __version__ = "0.02"      __pattern__ = r'http://(?:www\.)?(share|mega)rapid\.cz/slozka/\d+/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Share-Rapid.com folder decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] -    LINK_PATTERN = r'<td class="soubor"[^>]*><a href="([^"]+)">' +    LINK_PATTERN = r'<td class="soubor".*?><a href="(.+?)">'  getInfo = create_getInfo(MegaRapidCzFolder) diff --git a/module/plugins/crypter/MegauploadComFolder.py b/module/plugins/crypter/MegauploadComFolder.py index 08f96700d..60e4af57e 100644 --- a/module/plugins/crypter/MegauploadComFolder.py +++ b/module/plugins/crypter/MegauploadComFolder.py @@ -9,6 +9,7 @@ class MegauploadComFolder(DeadCrypter):      __version__ = "0.02"      __pattern__ = r'http://(?:www\.)?megaupload\.com/(\?f|xml/folderfiles\.php\?.*&?folderid)=\w+' +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Megaupload.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2KTo.py index 76bf702ac..919d77c86 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2KTo.py @@ -9,7 +9,7 @@ class Movie2KTo(DeadCrypter):      __version__ = "0.51"      __pattern__ = r'http://(?:www\.)?movie2k\.to/(.+)\.html' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Movie2k.to decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/MultiUpOrg.py b/module/plugins/crypter/MultiUpOrg.py index 5209ebf09..b676c3029 100644 --- a/module/plugins/crypter/MultiUpOrg.py +++ b/module/plugins/crypter/MultiUpOrg.py @@ -1,7 +1,7 @@  # -*- coding: utf-8 -*-  import re -from urlparse import urljoin +import urlparse  from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo @@ -12,8 +12,9 @@ class MultiUpOrg(SimpleCrypter):      __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?multiup\.org/(en|fr)/(?P<TYPE>project|download|miror)/\w+(/\w+)?' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """MultiUp.org crypter plugin"""      __license__     = "GPLv3" @@ -32,7 +33,7 @@ class MultiUpOrg(SimpleCrypter):              pattern = r'style="width:97%;text-align:left".*\n.*href="(.*)"'              if m_type == "download":                  dl_pattern = r'href="(.*)">.*\n.*<h5>DOWNLOAD</h5>' -                miror_page = urljoin("http://www.multiup.org", re.search(dl_pattern, self.html).group(1)) +                miror_page = urlparse.urljoin("http://www.multiup.org", re.search(dl_pattern, self.html).group(1))                  self.html = self.load(miror_page)          return re.findall(pattern, self.html) diff --git a/module/plugins/crypter/MultiloadCz.py b/module/plugins/crypter/MultiloadCz.py index fa1eb02d7..10b5770fa 100644 --- a/module/plugins/crypter/MultiloadCz.py +++ b/module/plugins/crypter/MultiloadCz.py @@ -1,27 +1,27 @@  # -*- coding: utf-8 -*-  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class MultiloadCz(Crypter):      __name__    = "MultiloadCz"      __type__    = "crypter" -    __version__ = "0.40" +    __version__ = "0.41"      __pattern__ = r'http://(?:[^/]*\.)?multiload\.cz/(stahnout|slozka)/.+' -    __config__ = [("use_subfolder", "bool", "Save package to subfolder", True), -                  ("subfolder_per_package", "bool", "Create a subfolder for each package", True), -                  ("usedHoster", "str", "Prefered hoster list (bar-separated)", ""), -                  ("ignoredHoster", "str", "Ignored hoster list (bar-separated)", "")] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"           , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package" , True), +                   ("usedHoster"        , "str" , "Prefered hoster list (bar-separated)", ""  ), +                   ("ignoredHoster"     , "str" , "Ignored hoster list (bar-separated)" , ""  )]      __description__ = """Multiload.cz decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] -    FOLDER_PATTERN = r'<form action="" method="get"><textarea[^>]*>([^>]*)</textarea></form>' -    LINK_PATTERN = r'<p class="manager-server"><strong>([^<]+)</strong></p><p class="manager-linky"><a href="([^"]+)">' +    FOLDER_PATTERN = r'<form action="" method="get"><textarea.*?>([^>]*)</textarea></form>' +    LINK_PATTERN = r'<p class="manager-server"><strong>([^<]+)</strong></p><p class="manager-linky"><a href="(.+?)">'      def decrypt(self, pyfile): @@ -34,9 +34,9 @@ class MultiloadCz(Crypter):          else:              m = re.findall(self.LINK_PATTERN, self.html)              if m: -                prefered_set = set(self.getConfig("usedHoster").split('|')) -                self.urls.extend([x[1] for x in m if x[0] in prefered_set]) +                prefered_set = set(self.getConfig('usedHoster').split('|')) +                self.urls.extend(x[1] for x in m if x[0] in prefered_set)                  if not self.urls: -                    ignored_set = set(self.getConfig("ignoredHoster").split('|')) -                    self.urls.extend([x[1] for x in m if x[0] not in ignored_set]) +                    ignored_set = set(self.getConfig('ignoredHoster').split('|')) +                    self.urls.extend(x[1] for x in m if x[0] not in ignored_set) diff --git a/module/plugins/crypter/MultiuploadCom.py b/module/plugins/crypter/MultiuploadCom.py index 347b7e5af..d0679e118 100644 --- a/module/plugins/crypter/MultiuploadCom.py +++ b/module/plugins/crypter/MultiuploadCom.py @@ -9,9 +9,9 @@ class MultiuploadCom(DeadCrypter):      __version__ = "0.02"      __pattern__ = r'http://(?:www\.)?multiupload\.(com|nl)/\w+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10 -    __description__ = """ MultiUpload.com decrypter plugin """ +    __description__ = """MultiUpload.com decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] diff --git a/module/plugins/crypter/NCryptIn.py b/module/plugins/crypter/NCryptIn.py index 8b7214157..e85120f92 100644 --- a/module/plugins/crypter/NCryptIn.py +++ b/module/plugins/crypter/NCryptIn.py @@ -1,23 +1,22 @@  # -*- coding: utf-8 -*- -import base64  import binascii  import re  from Crypto.Cipher import AES -from module.plugins.Crypter import Crypter -from module.plugins.internal.CaptchaService import ReCaptcha +from module.plugins.internal.Crypter import Crypter +from module.plugins.internal.ReCaptcha import ReCaptcha  class NCryptIn(Crypter):      __name__    = "NCryptIn"      __type__    = "crypter" -    __version__ = "1.33" +    __version__ = "1.36"      __pattern__ = r'http://(?:www\.)?ncrypt\.in/(?P<TYPE>folder|link|frame)-([^/\?]+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """NCrypt.in decrypter plugin"""      __license__     = "GPLv3" @@ -28,7 +27,7 @@ class NCryptIn(Crypter):      JK_KEY = "jk"      CRYPTED_KEY = "crypted" -    NAME_PATTERN = r'<meta name="description" content="(?P<N>[^"]+)"' +    NAME_PATTERN = r'<meta name="description" content="(?P<N>.+?)"'      def setup(self): @@ -109,7 +108,7 @@ class NCryptIn(Crypter):      def isProtected(self):          form = re.search(r'<form.*?name.*?protected.*?>(.*?)</form>', self.cleanedHtml, re.S) -        if form is not None: +        if form:              content = form.group(1)              for keyword in ("password", "captcha"):                  if keyword in content: @@ -145,7 +144,7 @@ class NCryptIn(Crypter):          # Resolve anicaptcha          if "anicaptcha" in form:              self.logDebug("Captcha protected") -            captchaUri = re.search(r'src="(/temp/anicaptcha/[^"]+)', form).group(1) +            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 @@ -156,7 +155,7 @@ class NCryptIn(Crypter):              captcha_key = re.search(r'\?k=(.*?)"', form).group(1)              self.logDebug("Resolving ReCaptcha with key [%s]" % captcha_key)              recaptcha = ReCaptcha(self) -            challenge, response = recaptcha.challenge(captcha_key) +            response, challenge = recaptcha.challenge(captcha_key)              postData['recaptcha_challenge_field'] = challenge              postData['recaptcha_response_field']  = response @@ -205,7 +204,7 @@ class NCryptIn(Crypter):          elif link_source_type == "web":              return self.handleWebLinks()          else: -            self.error('Unknown source type "%s" (this is probably a bug)' % link_source_type) +            self.error(_('Unknown source type "%s"') % link_source_type)      def handleSingleLink(self): @@ -229,7 +228,7 @@ class NCryptIn(Crypter):                  (vcrypted, vjk) = self._getCipherParams()                  for (crypted, jk) in zip(vcrypted, vjk):                      package_links.extend(self._getLinks(crypted, jk)) -            except: +            except Exception:                  self.fail(_("Unable to decrypt CNL2 links"))          return package_links @@ -296,19 +295,15 @@ class NCryptIn(Crypter):          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) +        text = obj.decrypt(crypted.decode('base64'))          # Extract links          text = text.replace("\x00", "").replace("\r", "") -        links = text.split("\n") -        links = filter(lambda x: x != "", links) +        links = filter(bool, text.split('\n'))          # Log and return          self.logDebug("Block has %d links" % len(links)) diff --git a/module/plugins/crypter/NetfolderIn.py b/module/plugins/crypter/NetfolderIn.py index 62dc5c914..32d59af03 100644 --- a/module/plugins/crypter/NetfolderIn.py +++ b/module/plugins/crypter/NetfolderIn.py @@ -1,18 +1,15 @@  # -*- coding: utf-8 -*- -import re +from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - -class NetfolderIn(SimpleCrypter): +class NetfolderIn(DeadCrypter):      __name__    = "NetfolderIn"      __type__    = "crypter" -    __version__ = "0.72" +    __version__ = "0.73" -    __pattern__ = r'http://(?:www\.)?netfolder\.in/(folder\.php\?folder_id=)?(?P<ID>\w+)(?(1)|/\w+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __pattern__ = r'http://(?:www\.)?netfolder\.(in|me)/(folder\.php\?folder_id=)?(?P<ID>\w+)(?(1)|/\w+)' +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """NetFolder.in decrypter plugin"""      __license__     = "GPLv3" @@ -20,54 +17,4 @@ class NetfolderIn(SimpleCrypter):                         ("fragonib", "fragonib[AT]yahoo[DOT]es")] -    NAME_PATTERN = r'<div class="Text">Inhalt des Ordners <span.*>(?P<N>.+)</span></div>' - - -    def prepare(self): -        super(NetfolderIn, self).prepare() - -        # 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")) - - -    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 = m.group('ID') -        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 - -  getInfo = create_getInfo(NetfolderIn) diff --git a/module/plugins/crypter/NosvideoCom.py b/module/plugins/crypter/NosvideoCom.py index 1e280abd2..9808837c4 100644 --- a/module/plugins/crypter/NosvideoCom.py +++ b/module/plugins/crypter/NosvideoCom.py @@ -9,8 +9,9 @@ class NosvideoCom(SimpleCrypter):      __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?nosvideo\.com/\?v=\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Nosvideo.com decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/OneKhDe.py b/module/plugins/crypter/OneKhDe.py index 3e75d97b5..2d90afd96 100644 --- a/module/plugins/crypter/OneKhDe.py +++ b/module/plugins/crypter/OneKhDe.py @@ -4,17 +4,17 @@ import re  from module.unescape import unescape -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class OneKhDe(Crypter):      __name__    = "OneKhDe"      __type__    = "crypter" -    __version__ = "0.11" +    __version__ = "0.12"      __pattern__ = r'http://(?:www\.)?1kh\.de/f/' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """1kh.de decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/OronComFolder.py b/module/plugins/crypter/OronComFolder.py index 9e06bdf32..048af7d82 100755..100644 --- a/module/plugins/crypter/OronComFolder.py +++ b/module/plugins/crypter/OronComFolder.py @@ -9,7 +9,7 @@ class OronComFolder(DeadCrypter):      __version__ = "0.11"      __pattern__ = r'http://(?:www\.)?oron\.com/folder/\w+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Oron.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/PastebinCom.py b/module/plugins/crypter/PastebinCom.py index b3d5a4bea..af039a6ab 100644 --- a/module/plugins/crypter/PastebinCom.py +++ b/module/plugins/crypter/PastebinCom.py @@ -6,19 +6,22 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  class PastebinCom(SimpleCrypter):      __name__    = "PastebinCom"      __type__    = "crypter" -    __version__ = "0.03" +    __version__ = "0.04" -    __pattern__ = r'http://(?:www\.)?pastebin\.com/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __pattern__ = r'https://(?:www\.)?pastebin\.com/(.+i=)?(?P<ID>\w{8})' +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Pastebin.com decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("stickell", "l.stickell@yahoo.it")] -    LINK_PATTERN = r'<div class="de\d+">(https?://[^ <]+)(?:[^<]*)</div>' -    NAME_PATTERN = r'<div class="paste_box_line1" title="(?P<N>[^"]+)">' +    URL_REPLACEMENTS = [(__pattern__ + '.*', r'http://www.pastebin.com/\g<ID>')] + +    NAME_PATTERN = r'<div class="paste_box_line1" title="(?P<N>.+?)"' +    LINK_PATTERN = r'<div class="de\d+">(.+?)<'  getInfo = create_getInfo(PastebinCom) diff --git a/module/plugins/crypter/PastedCo.py b/module/plugins/crypter/PastedCo.py new file mode 100644 index 000000000..8236345cc --- /dev/null +++ b/module/plugins/crypter/PastedCo.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +from module.plugins.internal.Crypter import Crypter + +import re + + +class PastedCo(Crypter): +    __name__    = "PastedCo" +    __type__    = "crypter" +    __version__ = "0.01" + +    __pattern__ = r'http://pasted\.co/\w+' + +    __description__ = """Pasted.co decrypter plugin""" +    __license__     = "GPLv3" +    __authors__     = [("Frederik Möllers", "fred-public@posteo.de")] + + +    NAME_PATTERN = r'<title>(?P<N>.+?) - .+</title>' +    NAME_PATTERN = r"'save_paste' href=\"(http://pasted.co/[0-9a-f]+)/info" + +    FS_URL_PREFIX = '<pre id=\'thepaste\' class="prettyprint">' +    FS_URL_SUFFIX = '</pre>' + +    def decrypt(self, pyfile): +        package = pyfile.package() +        package_name = package.name +        package_folder = package.folder +        html = self.load(pyfile.url, decode = True).splitlines() +        fs_url = None +        FS_URL_RE = re.compile('%s/fullscreen\.php\?hash=[0-9a-f]*' % pyfile.url) +        for line in html: +            match = FS_URL_RE.search(line) +            if match: +                fs_url = match.group() +                break +        if not fs_url: +            raise Exception("Could not find pasted.co fullscreen URL!") +        urls = self.load(fs_url, decode = True) +        urls = urls[urls.find(PastedCo.FS_URL_PREFIX) + len(PastedCo.FS_URL_PREFIX):] +        urls = urls[:urls.find(PastedCo.FS_URL_SUFFIX)].splitlines() +        self.packages.append((package_name, urls, package_folder)) diff --git a/module/plugins/crypter/QuickshareCzFolder.py b/module/plugins/crypter/QuickshareCzFolder.py index 70666b55a..e1fdc22bc 100644 --- a/module/plugins/crypter/QuickshareCzFolder.py +++ b/module/plugins/crypter/QuickshareCzFolder.py @@ -1,24 +1,24 @@  # -*- coding: utf-8 -*-  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class QuickshareCzFolder(Crypter):      __name__    = "QuickshareCzFolder"      __type__    = "crypter" -    __version__ = "0.10" +    __version__ = "0.11"      __pattern__ = r'http://(?:www\.)?quickshare\.cz/slozka-\d+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Quickshare.cz folder decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] -    FOLDER_PATTERN = r'<textarea[^>]*>(.*?)</textarea>' +    FOLDER_PATTERN = r'<textarea.*?>(.*?)</textarea>'      LINK_PATTERN = r'(http://www\.quickshare\.cz/\S+)' diff --git a/module/plugins/crypter/RSLayerCom.py b/module/plugins/crypter/RSLayerCom.py index cc3b23bbc..6f078e9e4 100644 --- a/module/plugins/crypter/RSLayerCom.py +++ b/module/plugins/crypter/RSLayerCom.py @@ -9,7 +9,7 @@ class RSLayerCom(DeadCrypter):      __version__ = "0.21"      __pattern__ = r'http://(?:www\.)?rs-layer\.com/directory-' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """RS-Layer.com decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/RapidfileshareNetFolder.py b/module/plugins/crypter/RapidfileshareNetFolder.py deleted file mode 100644 index fc3d4241e..000000000 --- a/module/plugins/crypter/RapidfileshareNetFolder.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.XFSCrypter import XFSCrypter, create_getInfo - - -class RapidfileshareNetFolder(XFSCrypter): -    __name__    = "RapidfileshareNetFolder" -    __type__    = "crypter" -    __version__ = "0.03" - -    __pattern__ = r'http://(?:www\.)?rapidfileshare\.net/users/\w+/\d+/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] - -    __description__ = """Rapidfileshare.net folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("guidobelix", "guidobelix@hotmail.it")] - - -    HOSTER_DOMAIN = "rapidfileshare.net" - - -getInfo = create_getInfo(RapidfileshareNetFolder) diff --git a/module/plugins/crypter/RelinkUs.py b/module/plugins/crypter/RelinkUs.py index c5a3f1011..7dfb3876f 100644 --- a/module/plugins/crypter/RelinkUs.py +++ b/module/plugins/crypter/RelinkUs.py @@ -2,23 +2,23 @@  from __future__ import with_statement -import base64  import binascii  import re  import os  from Crypto.Cipher import AES -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter +from module.utils import save_join  class RelinkUs(Crypter):      __name__    = "RelinkUs"      __type__    = "crypter" -    __version__ = "3.11" +    __version__ = "3.13"      __pattern__ = r'http://(?:www\.)?relink\.us/(f/|((view|go)\.php\?id=))(?P<ID>.+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Relink.us decrypter plugin"""      __license__     = "GPLv3" @@ -153,7 +153,7 @@ class RelinkUs(Crypter):          # Try to get info from web          m = re.search(self.FILE_TITLE_REGEX, self.html) -        if m is not None: +        if m:              title = m.group(1).strip()              if not self.FILE_NOTITLE in title:                  name = folder = title @@ -191,20 +191,20 @@ class RelinkUs(Crypter):          elif source == 'web':              return self.handleWEBLinks()          else: -            self.error('Unknown source type "%s" (this is probably a bug)' % source) +            self.error(_('Unknown source type "%s"') % source)      def handleCNL2Links(self):          self.logDebug("Search for CNL2 links")          package_links = []          m = re.search(self.CNL2_FORM_REGEX, self.html, re.S) -        if m is not None: +        if m:              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: +            except Exception:                  self.logDebug("Unable to decrypt CNL2 links")          return package_links @@ -213,18 +213,20 @@ class RelinkUs(Crypter):          self.logDebug("Search for DLC links")          package_links = []          m = re.search(self.DLC_LINK_REGEX, self.html) -        if m is not None: +        if m:              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) +                dlc_filepath = save_join(self.config['general']['download_folder'], dlc_filename)                  with open(dlc_filepath, "wb") as f:                      f.write(dlc)                  package_links.append(dlc_filepath) -            except: -                self.fail("Unable to download DLC container") + +            except Exception: +                self.fail(_("Unable to download DLC container")) +          return package_links @@ -276,19 +278,15 @@ class RelinkUs(Crypter):          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) +        text = obj.decrypt(crypted.decode('base64'))          # Extract links          text = text.replace("\x00", "").replace("\r", "") -        links = text.split("\n") -        links = filter(lambda x: x != "", links) +        links = filter(bool, text.split('\n'))          # Log and return          self.logDebug("Package has %d links" % len(links)) diff --git a/module/plugins/crypter/SafelinkingNet.py b/module/plugins/crypter/SafelinkingNet.py index a56a0a44c..3ebb5f22d 100644 --- a/module/plugins/crypter/SafelinkingNet.py +++ b/module/plugins/crypter/SafelinkingNet.py @@ -2,23 +2,21 @@  import re -from pycurl import FOLLOWLOCATION -  from BeautifulSoup import BeautifulSoup  from module.common.json_layer import json_loads -from module.plugins.Crypter import Crypter -from module.plugins.internal.CaptchaService import SolveMedia +from module.plugins.internal.Crypter import Crypter +from module.plugins.internal.SolveMedia import SolveMedia  class SafelinkingNet(Crypter):      __name__    = "SafelinkingNet"      __type__    = "crypter" -    __version__ = "0.13" +    __version__ = "0.16"      __pattern__ = r'https?://(?:www\.)?safelinking\.net/([pd])/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Safelinking.net decrypter plugin"""      __license__     = "GPLv3" @@ -57,7 +55,7 @@ class SafelinkingNet(Crypter):                      else:                          self.fail(_("Error parsing captcha")) -                    challenge, response = captcha.challenge(captchaKey) +                    response, challenge = captcha.challenge(captchaKey)                      postData['adcopy_challenge'] = challenge                      postData['adcopy_response']  = response diff --git a/module/plugins/crypter/SecuredIn.py b/module/plugins/crypter/SecuredIn.py index cbfa919ac..a2eac4f13 100644 --- a/module/plugins/crypter/SecuredIn.py +++ b/module/plugins/crypter/SecuredIn.py @@ -9,7 +9,7 @@ class SecuredIn(DeadCrypter):      __version__ = "0.21"      __pattern__ = r'http://(?:www\.)?secured\.in/download-[\d]+-\w{8}\.html' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Secured.in decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/SexuriaCom.py b/module/plugins/crypter/SexuriaCom.py index 3c952fd6b..b2101e92a 100644 --- a/module/plugins/crypter/SexuriaCom.py +++ b/module/plugins/crypter/SexuriaCom.py @@ -2,30 +2,30 @@  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class SexuriaCom(Crypter):      __name__    = "SexuriaCom"      __type__    = "crypter" -    __version__ = "0.01" +    __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?sexuria\.com/(v1/)?(Pornos_Kostenlos_.+?_(\d+)\.html|dl_links_\d+_\d+\.html|id=\d+\&part=\d+\&link=\d+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Sexuria.com decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("NETHead", "NETHead.AT.gmx.DOT.net")] -    PATTERN_SUPPORTED_MAIN     = re.compile(r'http://(www\.)?sexuria\.com/(v1/)?Pornos_Kostenlos_.+?_(\d+)\.html', flags=re.I) -    PATTERN_SUPPORTED_CRYPT    = re.compile(r'http://(www\.)?sexuria\.com/(v1/)?dl_links_\d+_(?P<ID>\d+)\.html', flags=re.I) -    PATTERN_SUPPORTED_REDIRECT = re.compile(r'http://(www\.)?sexuria\.com/out\.php\?id=(?P<ID>\d+)\&part=\d+\&link=\d+', flags=re.I) -    PATTERN_TITLE              = re.compile(r'<title> - (?P<TITLE>.*) Sexuria - Kostenlose Pornos - Rapidshare XXX Porn</title>', flags=re.I) -    PATTERN_PASSWORD           = re.compile(r'<strong>Passwort: </strong></div></td>.*?bgcolor="#EFEFEF">(?P<PWD>.*?)</td>', flags=re.I | re.S) -    PATTERN_DL_LINK_PAGE       = re.compile(r'"(dl_links_\d+_\d+\.html)"', flags=re.I) -    PATTERN_REDIRECT_LINKS     = re.compile(r'value="(http://sexuria\.com/out\.php\?id=\d+\&part=\d+\&link=\d+)" readonly', flags=re.I) +    PATTERN_SUPPORTED_MAIN     = r'http://(www\.)?sexuria\.com/(v1/)?Pornos_Kostenlos_.+?_(\d+)\.html' +    PATTERN_SUPPORTED_CRYPT    = r'http://(www\.)?sexuria\.com/(v1/)?dl_links_\d+_(?P<ID>\d+)\.html' +    PATTERN_SUPPORTED_REDIRECT = r'http://(www\.)?sexuria\.com/out\.php\?id=(?P<ID>\d+)\&part=\d+\&link=\d+' +    PATTERN_TITLE              = r'<title> - (?P<TITLE>.*) Sexuria - Kostenlose Pornos - Rapidshare XXX Porn</title>' +    PATTERN_PASSWORD           = r'<strong>Passwort: </strong></div></td>.*?bgcolor="#EFEFEF">(?P<PWD>.*?)</td>' +    PATTERN_DL_LINK_PAGE       = r'"(dl_links_\d+_\d+\.html)"' +    PATTERN_REDIRECT_LINKS     = r'value="(http://sexuria\.com/out\.php\?id=\d+\&part=\d+\&link=\d+)" readonly'      def decrypt(self, pyfile): @@ -40,49 +40,49 @@ class SexuriaCom(Crypter):      def decryptLinks(self, url):          linklist = [] -        name = self.package.name -        folder = self.package.folder +        name     = self.package.name +        folder   = self.package.folder          password = None -        if re.match(self.PATTERN_SUPPORTED_MAIN, url): +        if re.match(self.PATTERN_SUPPORTED_MAIN, url, re.I):              # Processing main page              html = self.load(url) -            links = re.findall(self.PATTERN_DL_LINK_PAGE, html) +            links = re.findall(self.PATTERN_DL_LINK_PAGE, html, re.I)              for link in links:                  linklist.append("http://sexuria.com/v1/" + link) -        elif re.match(self.PATTERN_SUPPORTED_REDIRECT, url): +        elif re.match(self.PATTERN_SUPPORTED_REDIRECT, url, re.I):              # Processing direct redirect link (out.php), redirecting to main page -            id = re.search(self.PATTERN_SUPPORTED_REDIRECT, url).group('ID') +            id = re.search(self.PATTERN_SUPPORTED_REDIRECT, url, re.I).group('ID')              if id:                  linklist.append("http://sexuria.com/v1/Pornos_Kostenlos_liebe_%s.html" % id) -        elif re.match(self.PATTERN_SUPPORTED_CRYPT, url): +        elif re.match(self.PATTERN_SUPPORTED_CRYPT, url, re.I):              # Extract info from main file -            id = re.search(self.PATTERN_SUPPORTED_CRYPT, url).group('ID') +            id = re.search(self.PATTERN_SUPPORTED_CRYPT, url, re.I).group('ID')              html = self.load("http://sexuria.com/v1/Pornos_Kostenlos_info_%s.html" % id, decode=True) -            title = re.search(self.PATTERN_TITLE, html).group('TITLE').strip() +            title = re.search(self.PATTERN_TITLE, html, re.I).group('TITLE').strip()              if title:                  name = folder = title                  self.logDebug("Package info found, name [%s] and folder [%s]" % (name, folder)) -            pwd = re.search(self.PATTERN_PASSWORD, html).group('PWD') -            if pwd: +            pwd = re.search(self.PATTERN_PASSWORD, html, re.I | re.S).group('PWD') +            if pwd and pwd not in ("Kein Passwort", "-"):                  password = pwd.strip()                  self.logDebug("Password info [%s] found" % password)              # Process link (dl_link)              html = self.load(url) -            links = re.findall(self.PATTERN_REDIRECT_LINKS, html) +            links = re.findall(self.PATTERN_REDIRECT_LINKS, html, re.I)              if len(links) == 0: -                self.LogError("Broken for link %s" % link) +                self.logError("Broken for link %s" % link)              else:                  for link in links:                      link = link.replace("http://sexuria.com/", "http://www.sexuria.com/")                      finallink = self.load(link, just_header=True)['location']                      if not finallink or "sexuria.com/" in finallink: -                        self.LogError("Broken for link %s" % link) +                        self.logError("Broken for link %s" % link)                      else:                          linklist.append(finallink) diff --git a/module/plugins/crypter/ShSt.py b/module/plugins/crypter/ShSt.py new file mode 100644 index 000000000..c50a437db --- /dev/null +++ b/module/plugins/crypter/ShSt.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +from module.plugins.internal.Crypter import Crypter + +import re + + +class ShSt(Crypter): +    __name__    = "ShSt" +    __type__    = "crypter" +    __version__ = "0.01" + +    __pattern__ = r'http://sh\.st/\w+' + +    __description__ = """Sh.St decrypter plugin""" +    __license__     = "GPLv3" +    __authors__     = [("Frederik Möllers", "fred-public@posteo.de")] + + +    NAME_PATTERN = r'<title>(?P<N>.+?) - .+</title>' + + +    def decrypt(self, pyfile): +        package = pyfile.package() +        package_name = package.name +        package_folder = package.folder +        html = self.load("http://deadlockers.com/submit.php", post = { "deadlock" : self.pyfile.url }, decode = True) +        self.packages.append((package_name, [html], package_folder)) diff --git a/module/plugins/crypter/ShareLinksBiz.py b/module/plugins/crypter/ShareLinksBiz.py index d2e8138f6..aab898813 100644 --- a/module/plugins/crypter/ShareLinksBiz.py +++ b/module/plugins/crypter/ShareLinksBiz.py @@ -1,21 +1,20 @@  # -*- coding: utf-8 -*- -import base64  import binascii  import re  from Crypto.Cipher import AES -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class ShareLinksBiz(Crypter):      __name__    = "ShareLinksBiz"      __type__    = "crypter" -    __version__ = "1.14" +    __version__ = "1.15"      __pattern__ = r'http://(?:www\.)?(share-links|s2l)\.biz/(?P<ID>_?\w+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Share-Links.biz decrypter plugin"""      __license__     = "GPLv3" @@ -165,7 +164,7 @@ class ShareLinksBiz(Crypter):          # Extract from web package header          title_re = r'<h2><img.*?/>(.*)</h2>'          m = re.search(title_re, self.html, re.S) -        if m is not None: +        if m:              title = m.group(1).strip()              if 'unnamed' not in title:                  name = folder = title @@ -235,7 +234,7 @@ class ShareLinksBiz(Crypter):              try:                  (crypted, jk) = self._getCipherParams()                  package_links.extend(self._getLinks(crypted, jk)) -            except: +            except Exception:                  self.fail(_("Unable to decrypt CNL2 links"))          return package_links @@ -248,14 +247,12 @@ class ShareLinksBiz(Crypter):          params = res.split(";;")          # Get jk -        strlist = list(base64.standard_b64decode(params[1])) -        strlist.reverse() -        jk = ''.join(strlist) +        strlist = list(params[1].decode('base64')) +        jk      = ''.join(strlist[::-1])          # Get crypted -        strlist = list(base64.standard_b64decode(params[2])) -        strlist.reverse() -        crypted = ''.join(strlist) +        strlist = list(params[2].decode('base64')) +        crypted = ''.join(strlist[::-1])          # Log and return          return crypted, jk @@ -267,19 +264,15 @@ class ShareLinksBiz(Crypter):          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) +        text = obj.decrypt(crypted.decode('base64'))          # Extract links          text = text.replace("\x00", "").replace("\r", "") -        links = text.split("\n") -        links = filter(lambda x: x != "", links) +        links = filter(bool, text.split('\n'))          # Log and return          self.logDebug("Block has %d links" % len(links)) diff --git a/module/plugins/crypter/SharingmatrixComFolder.py b/module/plugins/crypter/SharingmatrixComFolder.py index e16bdf814..eb1b4d8a6 100644 --- a/module/plugins/crypter/SharingmatrixComFolder.py +++ b/module/plugins/crypter/SharingmatrixComFolder.py @@ -9,6 +9,7 @@ class SharingmatrixComFolder(DeadCrypter):      __version__ = "0.01"      __pattern__ = r'http://(?:www\.)?sharingmatrix\.com/folder/\w+' +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Sharingmatrix.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/SpeedLoadOrgFolder.py b/module/plugins/crypter/SpeedLoadOrgFolder.py index ddde7dec2..af768ef7b 100644 --- a/module/plugins/crypter/SpeedLoadOrgFolder.py +++ b/module/plugins/crypter/SpeedLoadOrgFolder.py @@ -9,7 +9,7 @@ class SpeedLoadOrgFolder(DeadCrypter):      __version__ = "0.30"      __pattern__ = r'http://(?:www\.)?speedload\.org/(\d+~f$|folder/\d+/)' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Speedload decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/StealthTo.py b/module/plugins/crypter/StealthTo.py index 5173421f1..551468980 100644 --- a/module/plugins/crypter/StealthTo.py +++ b/module/plugins/crypter/StealthTo.py @@ -9,7 +9,7 @@ class StealthTo(DeadCrypter):      __version__ = "0.20"      __pattern__ = r'http://(?:www\.)?stealth\.to/folder/.+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Stealth.to decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/TNTVillageScambioeticoOrg.py b/module/plugins/crypter/TNTVillageScambioeticoOrg.py new file mode 100644 index 000000000..5606b8a7f --- /dev/null +++ b/module/plugins/crypter/TNTVillageScambioeticoOrg.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo + + +class TNTVillageScambioeticoOrg(SimpleCrypter): +    __name__    = "TNTVillageScambioeticoOrg" +    __type__    = "crypter" +    __version__ = "0.01" + +    __pattern__ = r'http://(?:www\.)?forum\.tntvillage\.scambioetico\.org/index\.php\?.*showtopic=\d+' +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True),  #: Overrides core.config['general']['folder_per_package'] +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)] + +    __description__ = """TNTVillage.scambioetico.org decrypter plugin""" +    __license__     = "GPLv3" +    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    LINK_PATTERNS = [r'<th class="titlemedium"><a href=\'(.+?)\'', r"<a href='(\./index\.php\?act.+?)'"] + + +    def getLinks(self): +        for p in self.LINK_PATTERNS: +            self.LINK_PATTERN = p +            links = super(TNTVillageScambioeticoOrg, self).getLinks() +            if links: +                return links + + +getInfo = create_getInfo(TNTVillageScambioeticoOrg) diff --git a/module/plugins/crypter/TinyurlCom.py b/module/plugins/crypter/TinyurlCom.py new file mode 100644 index 000000000..e2cf50358 --- /dev/null +++ b/module/plugins/crypter/TinyurlCom.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo + + +class TinyurlCom(SimpleCrypter): +    __name__    = "TinyurlCom" +    __type__    = "crypter" +    __version__ = "0.02" + +    __pattern__ = r'https?://(?:www\.)?(preview\.)?tinyurl\.com/[\w-]+' + +    __description__ = """Tinyurl.com decrypter plugin""" +    __license__     = "GPLv3" +    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    URL_REPLACEMENTS = [(r'preview\.', r'')] + +    OFFLINE_PATTERN = r">Error: Unable to find site's URL to redirect to" + + +getInfo = create_getInfo(TinyurlCom) diff --git a/module/plugins/crypter/TnyCz.py b/module/plugins/crypter/TnyCz.py index d36128550..f3b245118 100644 --- a/module/plugins/crypter/TnyCz.py +++ b/module/plugins/crypter/TnyCz.py @@ -8,18 +8,19 @@ import re  class TnyCz(SimpleCrypter):      __name__    = "TnyCz"      __type__    = "crypter" -    __version__ = "0.03" +    __version__ = "0.04"      __pattern__ = r'http://(?:www\.)?tny\.cz/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Tny.cz decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] -    NAME_PATTERN = r'<title>(?P<N>.+) - .+</title>' +    NAME_PATTERN = r'<title>(?P<N>.+?) - .+</title>'      def getLinks(self): diff --git a/module/plugins/crypter/TrailerzoneInfo.py b/module/plugins/crypter/TrailerzoneInfo.py index 10780dd45..6f1c90612 100644 --- a/module/plugins/crypter/TrailerzoneInfo.py +++ b/module/plugins/crypter/TrailerzoneInfo.py @@ -9,7 +9,7 @@ class TrailerzoneInfo(DeadCrypter):      __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?trailerzone\.info/.+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """TrailerZone.info decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/TurbobitNetFolder.py b/module/plugins/crypter/TurbobitNetFolder.py index c6734c997..dcbd6a5d7 100644 --- a/module/plugins/crypter/TurbobitNetFolder.py +++ b/module/plugins/crypter/TurbobitNetFolder.py @@ -12,8 +12,9 @@ class TurbobitNetFolder(SimpleCrypter):      __version__ = "0.05"      __pattern__ = r'http://(?:www\.)?turbobit\.net/download/folder/(?P<ID>\w+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Turbobit.net folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/TusfilesNetFolder.py b/module/plugins/crypter/TusfilesNetFolder.py index 20bed0ab1..1cc505b81 100644 --- a/module/plugins/crypter/TusfilesNetFolder.py +++ b/module/plugins/crypter/TusfilesNetFolder.py @@ -2,7 +2,7 @@  import math  import re -from urlparse import urljoin +import urlparse  from module.plugins.internal.XFSCrypter import XFSCrypter, create_getInfo @@ -13,8 +13,8 @@ class TusfilesNetFolder(XFSCrypter):      __version__ = "0.08"      __pattern__ = r'https?://(?:www\.)?tusfiles\.net/go/(?P<ID>\w+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Tusfiles.net folder decrypter plugin"""      __license__     = "GPLv3" @@ -22,15 +22,13 @@ class TusfilesNetFolder(XFSCrypter):                         ("stickell", "l.stickell@yahoo.it")] -    HOSTER_DOMAIN = "tusfiles.net" -      PAGES_PATTERN = r'>\((\d+) \w+\)<'      URL_REPLACEMENTS = [(__pattern__ + ".*", r'https://www.tusfiles.net/go/\g<ID>/')]      def loadPage(self, page_n): -        return self.load(urljoin(self.pyfile.url, str(page_n)), decode=True) +        return self.load(urlparse.urljoin(self.pyfile.url, str(page_n)), decode=True)      def handlePages(self, pyfile): diff --git a/module/plugins/crypter/UlozToFolder.py b/module/plugins/crypter/UlozToFolder.py index a1f3ed5ea..6e2c15c87 100644 --- a/module/plugins/crypter/UlozToFolder.py +++ b/module/plugins/crypter/UlozToFolder.py @@ -1,17 +1,17 @@  # -*- coding: utf-8 -*-  import re -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class UlozToFolder(Crypter):      __name__    = "UlozToFolder"      __type__    = "crypter" -    __version__ = "0.20" +    __version__ = "0.21"      __pattern__ = r'http://(?:www\.)?(uloz\.to|ulozto\.(cz|sk|net)|bagruj\.cz|zachowajto\.pl)/(m|soubory)/.+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Uloz.to folder decrypter plugin"""      __license__     = "GPLv3" @@ -19,8 +19,8 @@ class UlozToFolder(Crypter):      FOLDER_PATTERN = r'<ul class="profile_files">(.*?)</ul>' -    LINK_PATTERN = r'<br /><a href="/([^"]+)">[^<]+</a>' -    NEXT_PAGE_PATTERN = r'<a class="next " href="/([^"]+)"> </a>' +    LINK_PATTERN = r'<br /><a href="/(.+?)">.+?</a>' +    NEXT_PAGE_PATTERN = r'<a class="next " href="/(.+?)"> </a>'      def decrypt(self, pyfile): diff --git a/module/plugins/crypter/UploadableChFolder.py b/module/plugins/crypter/UploadableChFolder.py index 22f9ca2ed..849aaceea 100644 --- a/module/plugins/crypter/UploadableChFolder.py +++ b/module/plugins/crypter/UploadableChFolder.py @@ -9,10 +9,11 @@ class UploadableChFolder(SimpleCrypter):      __version__ = "0.03"      __pattern__ = r'http://(?:www\.)?uploadable\.ch/list/\w+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_premium"       , "bool", "Use premium account if available"   , True), +                   ("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)] -    __description__ = """ Uploadable.ch folder decrypter plugin """ +    __description__ = """Uploadable.ch folder decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("guidobelix", "guidobelix@hotmail.it"),                         ("Walter Purcaro", "vuolter@gmail.com")] diff --git a/module/plugins/crypter/UploadedToFolder.py b/module/plugins/crypter/UploadedToFolder.py index 0a71add70..384168030 100644 --- a/module/plugins/crypter/UploadedToFolder.py +++ b/module/plugins/crypter/UploadedToFolder.py @@ -1,8 +1,7 @@  # -*- coding: utf-8 -*-  import re - -from urlparse import urljoin +import urlparse  from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo @@ -10,28 +9,22 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo  class UploadedToFolder(SimpleCrypter):      __name__    = "UploadedToFolder"      __type__    = "crypter" -    __version__ = "0.42" +    __version__ = "0.43" -    __pattern__ = r'http://(?:www\.)?(uploaded|ul)\.(to|net)/(f|folder|list)/(?P<ID>\w+)' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __pattern__ = r'https?://(?:www\.)?(uploaded|ul)\.(to|net)/(f|folder|list)/\w+' +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """UploadedTo decrypter plugin"""      __license__     = "GPLv3"      __authors__     = [("stickell", "l.stickell@yahoo.it")] -    PLAIN_PATTERN = r'<small class="date"><a href="([\w/]+)" onclick=' -    NAME_PATTERN = r'<title>(?P<N>.+?)<' - - -    def getLinks(self): -        m = re.search(self.PLAIN_PATTERN, self.html) -        if m is None: -            self.error(_("PLAIN_PATTERN not found")) +    NAME_PATTERN         = r'<title>(?P<N>.+?)<' +    OFFLINE_PATTERN      = r'>Page not found' +    TEMP_OFFLINE_PATTERN = r'<title>uploaded\.net - Maintenance' -        plain_link = urljoin("http://uploaded.net/", m.group(1)) -        return self.load(plain_link).split('\n')[:-1] +    LINK_PATTERN = r'<h2><a href="(.+?)"'  getInfo = create_getInfo(UploadedToFolder) diff --git a/module/plugins/crypter/WiiReloadedOrg.py b/module/plugins/crypter/WiiReloadedOrg.py index c3c5b8222..eddc0e5d1 100644 --- a/module/plugins/crypter/WiiReloadedOrg.py +++ b/module/plugins/crypter/WiiReloadedOrg.py @@ -9,7 +9,7 @@ class WiiReloadedOrg(DeadCrypter):      __version__ = "0.11"      __pattern__ = r'http://(?:www\.)?wii-reloaded\.org/protect/get\.php\?i=.+' -    __config__  = [] +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Wii-Reloaded.org decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/WuploadComFolder.py b/module/plugins/crypter/WuploadComFolder.py index 873c71fad..dece467a2 100644 --- a/module/plugins/crypter/WuploadComFolder.py +++ b/module/plugins/crypter/WuploadComFolder.py @@ -9,6 +9,7 @@ class WuploadComFolder(DeadCrypter):      __version__ = "0.01"      __pattern__ = r'http://(?:www\.)?wupload\.com/folder/\w+' +    __config__  = []  #@TODO: Remove in 0.4.10      __description__ = """Wupload.com folder decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/XFileSharingProFolder.py b/module/plugins/crypter/XFileSharingProFolder.py index 55cd41931..70e7365dd 100644 --- a/module/plugins/crypter/XFileSharingProFolder.py +++ b/module/plugins/crypter/XFileSharingProFolder.py @@ -8,11 +8,11 @@ from module.plugins.internal.XFSCrypter import XFSCrypter, create_getInfo  class XFileSharingProFolder(XFSCrypter):      __name__    = "XFileSharingProFolder"      __type__    = "crypter" -    __version__ = "0.04" +    __version__ = "0.08" -    __pattern__ = r'^unmatchable$' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __pattern__ = r'https?://(?:www\.)?(?:\w+\.)*?(?P<DOMAIN>(?:[\d.]+|[\w\-^_]{3,}(?:\.[a-zA-Z]{2,}){1,2})(?:\:\d+)?)/(?:user|folder)s?/\w+' +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """XFileSharingPro dummy folder decrypter plugin for hook"""      __license__     = "GPLv3" @@ -20,9 +20,7 @@ class XFileSharingProFolder(XFSCrypter):      def _log(self, type, args): -        msg = " | ".join([str(a).strip() for a in args if a]) -        logger = getattr(self.log, type) -        logger("%s: %s: %s" % (self.__name__, self.HOSTER_NAME, msg or _("%s MARK" % type.upper()))) +        return super(XFileSharingProFolder, self)._log(type, (self.HOSTER_NAME,) + args)      def init(self): @@ -31,10 +29,7 @@ class XFileSharingProFolder(XFSCrypter):          self.__pattern__ = self.core.pluginManager.crypterPlugins[self.__name__]['pattern']          self.HOSTER_DOMAIN = re.match(self.__pattern__, self.pyfile.url).group("DOMAIN").lower() -        self.HOSTER_NAME   = "".join([part.capitalize() for part in re.split(r'(\.|\d+)', self.HOSTER_DOMAIN) if part != '.']) - -        if self.HOSTER_NAME[0].isdigit(): -            self.HOSTER_NAME = 'X' + self.HOSTER_NAME +        self.HOSTER_NAME   = "".join(part.capitalize() for part in re.split(r'(\.|\d+)', self.HOSTER_DOMAIN) if part != '.')          account = self.core.accountManager.getAccountPlugin(self.HOSTER_NAME) diff --git a/module/plugins/crypter/XupPl.py b/module/plugins/crypter/XupPl.py index f2ecbee5a..9dff23215 100644 --- a/module/plugins/crypter/XupPl.py +++ b/module/plugins/crypter/XupPl.py @@ -1,16 +1,16 @@  # -*- coding: utf-8 -*- -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  class XupPl(Crypter):      __name__    = "XupPl"      __type__    = "crypter" -    __version__ = "0.10" +    __version__ = "0.11"      __pattern__ = r'https?://(?:[^/]*\.)?xup\.pl/.+' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)]      __description__ = """Xup.pl decrypter plugin"""      __license__     = "GPLv3" diff --git a/module/plugins/crypter/YoutubeBatch.py b/module/plugins/crypter/YoutubeComFolder.py index 73ebf5fb3..bcaa7effe 100644 --- a/module/plugins/crypter/YoutubeBatch.py +++ b/module/plugins/crypter/YoutubeComFolder.py @@ -1,25 +1,24 @@  # -*- coding: utf-8 -*-  import re - -from urlparse import urljoin +import urlparse  from module.common.json_layer import json_loads -from module.plugins.Crypter import Crypter +from module.plugins.internal.Crypter import Crypter  from module.utils import save_join -class YoutubeBatch(Crypter): -    __name__    = "YoutubeBatch" +class YoutubeComFolder(Crypter): +    __name__    = "YoutubeComFolder"      __type__    = "crypter" -    __version__ = "1.01" +    __version__ = "1.02"      __pattern__ = r'https?://(?:www\.|m\.)?youtube\.com/(?P<TYPE>user|playlist|view_play_list)(/|.*?[?&](?:list|p)=)(?P<ID>[\w-]+)' -    __config__ = [("use_subfolder", "bool", "Save package to subfolder", True), -                  ("subfolder_per_package", "bool", "Create a subfolder for each package", True), -                  ("likes", "bool", "Grab user (channel) liked videos", False), -                  ("favorites", "bool", "Grab user (channel) favorite videos", False), -                  ("uploads", "bool", "Grab channel unplaylisted videos", True)] +    __config__  = [("use_subfolder"     , "bool", "Save package to subfolder"          , True ), +                   ("subfolder_per_pack", "bool", "Create a subfolder for each package", True ), +                   ("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"""      __license__     = "GPLv3" @@ -31,9 +30,9 @@ class YoutubeBatch(Crypter):      def api_response(self, ref, req):          req.update({"key": self.API_KEY}) -        url = urljoin("https://www.googleapis.com/youtube/v3/", ref) -        page = self.load(url, get=req) -        return json_loads(page) +        url  = urlparse.urljoin("https://www.googleapis.com/youtube/v3/", ref) +        html = self.load(url, get=req) +        return json_loads(html)      def getChannel(self, user): | 
