diff options
Diffstat (limited to 'module/plugins/crypter')
84 files changed, 0 insertions, 4166 deletions
| diff --git a/module/plugins/crypter/BitshareComFolder.py b/module/plugins/crypter/BitshareComFolder.py deleted file mode 100644 index c70a849b6..000000000 --- a/module/plugins/crypter/BitshareComFolder.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class BitshareComFolder(SimpleCrypter): -    __name__    = "BitshareComFolder" -    __type__    = "crypter" -    __version__ = "0.03" - -    __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)] - -    __description__ = """Bitshare.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it")] - - -    LINK_PATTERN = r'<a href="(http://bitshare\.com/files/.+)">.+</a></td>' -    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 deleted file mode 100644 index 926633ff7..000000000 --- a/module/plugins/crypter/C1NeonCom.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class C1NeonCom(DeadCrypter): -    __name__    = "C1NeonCom" -    __type__    = "crypter" -    __version__ = "0.05" - -    __pattern__ = r'http://(?:www\.)?c1neon\.com/.+' -    __config__  = [] - -    __description__ = """C1neon.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("godofdream", "soilfiction@gmail.com")] - - -getInfo = create_getInfo(C1NeonCom) diff --git a/module/plugins/crypter/ChipDe.py b/module/plugins/crypter/ChipDe.py deleted file mode 100644 index 2fc36c355..000000000 --- a/module/plugins/crypter/ChipDe.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - - -class ChipDe(Crypter): -    __name__    = "ChipDe" -    __type__    = "crypter" -    __version__ = "0.10" - -    __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)] - -    __description__ = """Chip.de decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("4Christopher", "4Christopher@gmx.de")] - - -    def decrypt(self, pyfile): -        self.html = self.load(pyfile.url) -        try: -            f = re.search(r'"(http://video\.chip\.de/.+)"', self.html) -        except Exception: -            self.fail(_("Failed to find the URL")) -        else: -            self.urls = [f.group(1)] -            self.logDebug("The file URL is %s" % self.urls[0]) diff --git a/module/plugins/crypter/CloudzillaToFolder.py b/module/plugins/crypter/CloudzillaToFolder.py deleted file mode 100644 index 76019d928..000000000 --- a/module/plugins/crypter/CloudzillaToFolder.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from urlparse import urljoin - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class CloudzillaToFolder(SimpleHoster): -    __name__    = "CloudzillaToFolder" -    __type__    = "crypter" -    __version__ = "0.02" - -    __pattern__ = r'http://(?:www\.)?cloudzilla\.to/share/folder/(?P<ID>[\w^_]+)' - -    __description__ = """Cloudzilla.to folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    INFO_PATTERN    = r'<span class="name" title="(?P<N>.+?)"' -    OFFLINE_PATTERN = r'>File not found...<' - -    LINK_PATTERN = r'<a href="(.+?)" class="item_href">' - -    PASSWORD_PATTERN = r'<div id="pwd_protected">' - - -    def checkErrors(self): -        m = re.search(self.PASSWORD_PATTERN, self.html) -        if m: -            self.html = self.load(self.pyfile.url, get={'key': self.getPassword()}) - -        if re.search(self.PASSWORD_PATTERN, self.html): -            self.retry(reason="Wrong password") - - -getInfo = create_getInfo(CloudzillaToFolder) diff --git a/module/plugins/crypter/CrockoComFolder.py b/module/plugins/crypter/CrockoComFolder.py deleted file mode 100644 index 57bb339ff..000000000 --- a/module/plugins/crypter/CrockoComFolder.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class CrockoComFolder(SimpleCrypter): -    __name__    = "CrockoComFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """Crocko.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -    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 deleted file mode 100644 index 2cf4e9f62..000000000 --- a/module/plugins/crypter/CryptItCom.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class CryptItCom(DeadCrypter): -    __name__    = "CryptItCom" -    __type__    = "crypter" -    __version__ = "0.11" - -    __pattern__ = r'http://(?:www\.)?crypt-it\.com/(s|e|d|c)/\w+' -    __config__  = [] - -    __description__ = """Crypt-it.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("jeix", "jeix@hasnomail.de")] - - -getInfo = create_getInfo(CryptItCom) diff --git a/module/plugins/crypter/CzshareComFolder.py b/module/plugins/crypter/CzshareComFolder.py deleted file mode 100644 index 5623a4093..000000000 --- a/module/plugins/crypter/CzshareComFolder.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - - -class CzshareComFolder(Crypter): -    __name__    = "CzshareComFolder" -    __type__    = "crypter" -    __version__ = "0.20" - -    __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)] - -    __description__ = """Czshare.com folder decrypter plugin, now Sdilej.cz""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -    FOLDER_PATTERN = r'<tr class="subdirectory">\s*<td>\s*<table>(.*?)</table>' -    LINK_PATTERN = r'<td class="col2"><a href="([^"]+)">info</a></td>' - - -    def decrypt(self, pyfile): -        html = self.load(pyfile.url) - -        m = re.search(self.FOLDER_PATTERN, html, re.S) -        if m is None: -            self.error(_("FOLDER_PATTERN not found")) - -        self.urls.extend(re.findall(self.LINK_PATTERN, m.group(1))) 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/DailymotionBatch.py deleted file mode 100644 index 82b80ab2f..000000000 --- a/module/plugins/crypter/DailymotionBatch.py +++ /dev/null @@ -1,106 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from urlparse import urljoin - -from module.common.json_layer import json_loads -from module.plugins.Crypter import Crypter -from module.utils import save_join - - -class DailymotionBatch(Crypter): -    __name__    = "DailymotionBatch" -    __type__    = "crypter" -    __version__ = "0.01" - -    __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)] - -    __description__ = """Dailymotion.com channel & playlist decrypter""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    def api_response(self, ref, req=None): -        url  = urljoin("https://api.dailymotion.com/", ref) -        html = self.load(url, get=req) -        return json_loads(html) - - -    def getPlaylistInfo(self, id): -        ref = "playlist/" + id -        req = {"fields": "name,owner.screenname"} -        playlist = self.api_response(ref, req) - -        if "error" in playlist: -            return - -        name = playlist['name'] -        owner = playlist['owner.screenname'] -        return name, owner - - -    def _getPlaylists(self, user_id, page=1): -        ref = "user/%s/playlists" % user_id -        req = {"fields": "id", "page": page, "limit": 100} -        user = self.api_response(ref, req) - -        if "error" in user: -            return - -        for playlist in user['list']: -            yield playlist['id'] - -        if user['has_more']: -            for item in self._getPlaylists(user_id, page + 1): -                yield item - - -    def getPlaylists(self, user_id): -        return [(id,) + self.getPlaylistInfo(id) for id in self._getPlaylists(user_id)] - - -    def _getVideos(self, id, page=1): -        ref = "playlist/%s/videos" % id -        req = {"fields": "url", "page": page, "limit": 100} -        playlist = self.api_response(ref, req) - -        if "error" in playlist: -            return - -        for video in playlist['list']: -            yield video['url'] - -        if playlist['has_more']: -            for item in self._getVideos(id, page + 1): -                yield item - - -    def getVideos(self, playlist_id): -        return list(self._getVideos(playlist_id))[::-1] - - -    def decrypt(self, pyfile): -        m = re.match(self.__pattern__, pyfile.url) -        m_id = m.group('ID') -        m_type = m.group('TYPE') - -        if m_type == "playlist": -            self.logDebug("Url recognized as Playlist") -            p_info = self.getPlaylistInfo(m_id) -            playlists = [(m_id,) + p_info] if p_info else None -        else: -            self.logDebug("Url recognized as Channel") -            playlists = self.getPlaylists(m_id) -            self.logDebug("%s playlist\s found on channel \"%s\"" % (len(playlists), m_id)) - -        if not playlists: -            self.fail(_("No playlist available")) - -        for p_id, p_name, p_owner in playlists: -            p_videos = self.getVideos(p_id) -            p_folder = save_join(self.config['general']['download_folder'], p_owner, p_name) -            self.logDebug("%s video\s found on playlist \"%s\"" % (len(p_videos), p_name)) -            self.packages.append((p_name, p_videos, p_folder))  #: folder is NOT recognized by pyload 0.4.9! diff --git a/module/plugins/crypter/DataHuFolder.py b/module/plugins/crypter/DataHuFolder.py deleted file mode 100644 index a5602d6c6..000000000 --- a/module/plugins/crypter/DataHuFolder.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class DataHuFolder(SimpleCrypter): -    __name__    = "DataHuFolder" -    __type__    = "crypter" -    __version__ = "0.06" - -    __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)] - -    __description__ = """Data.hu folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("crash", None), -                       ("stickell", "l.stickell@yahoo.it")] - - -    LINK_PATTERN = r'<a href=\'(http://data\.hu/get/.+)\' target=\'_blank\'>\1</a>' -    NAME_PATTERN = ur'<title>(?P<N>.+) Let\xf6lt\xe9se</title>' - - -    def prepare(self): -        super(DataHuFolder, self).prepare() - -        if u'K\xe9rlek add meg a jelsz\xf3t' in self.html:  # Password protected -            password = self.getPassword() -            if not password: -                self.fail(_("Password required")) - -            self.logDebug("The folder is password protected', 'Using password: " + password) - -            self.html = self.load(self.pyfile.url, post={'mappa_pass': password}, decode=True) - -            if u'Hib\xe1s jelsz\xf3' in self.html:  # Wrong password -                self.fail(_("Wrong password")) - - -getInfo = create_getInfo(DataHuFolder) diff --git a/module/plugins/crypter/DdlstorageComFolder.py b/module/plugins/crypter/DdlstorageComFolder.py deleted file mode 100644 index e02e77fda..000000000 --- a/module/plugins/crypter/DdlstorageComFolder.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class DdlstorageComFolder(DeadCrypter): -    __name__    = "DdlstorageComFolder" -    __type__    = "crypter" -    __version__ = "0.03" - -    __pattern__ = r'https?://(?:www\.)?ddlstorage\.com/folder/\w+' -    __config__  = [] - -    __description__ = """DDLStorage.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("godofdream", "soilfiction@gmail.com"), -                       ("stickell", "l.stickell@yahoo.it")] - - -getInfo = create_getInfo(DdlstorageComFolder) diff --git a/module/plugins/crypter/DepositfilesComFolder.py b/module/plugins/crypter/DepositfilesComFolder.py deleted file mode 100644 index 147f093c3..000000000 --- a/module/plugins/crypter/DepositfilesComFolder.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class DepositfilesComFolder(SimpleCrypter): -    __name__    = "DepositfilesComFolder" -    __type__    = "crypter" -    __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)] - -    __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">' - - -getInfo = create_getInfo(DepositfilesComFolder) diff --git a/module/plugins/crypter/Dereferer.py b/module/plugins/crypter/Dereferer.py deleted file mode 100644 index 0729c8cb6..000000000 --- a/module/plugins/crypter/Dereferer.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleDereferer import SimpleDereferer - - -class Dereferer(SimpleDereferer): -    __name__    = "Dereferer" -    __type__    = "crypter" -    __version__ = "0.11" - -    __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)] - -    __description__ = """Crypter for dereferers""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] diff --git a/module/plugins/crypter/DevhostStFolder.py b/module/plugins/crypter/DevhostStFolder.py deleted file mode 100644 index 8779cae5e..000000000 --- a/module/plugins/crypter/DevhostStFolder.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Test links: -# http://d-h.st/users/shine/?fld_id=37263#files - -import re - -from urlparse import urljoin - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class DevhostStFolder(SimpleCrypter): -    __name__    = "DevhostStFolder" -    __type__    = "crypter" -    __version__ = "0.04" - -    __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)] - -    __description__ = """d-h.st folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zapp-brannigan", "fuerst.reinje@web.de"), -                       ("Walter Purcaro", "vuolter@gmail.com")] - - -    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() - -        try: -            id = re.match(self.__pattern__, self.pyfile.url).group('ID') -            if 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)), -                             cookies=False) - -            p = '\?fld_id=%s.*?">(.+?)<' % id -            m = re.search(p, html) -            name = folder = m.group(1) - -        except Exception, e: -            self.logDebug(e) -            name = folder = re.match(self.__pattern__, self.pyfile.url).group('USER') - -        return {'name': name, 'folder': folder} - - -getInfo = create_getInfo(DevhostStFolder) diff --git a/module/plugins/crypter/DlProtectCom.py b/module/plugins/crypter/DlProtectCom.py deleted file mode 100644 index 4a188aa83..000000000 --- a/module/plugins/crypter/DlProtectCom.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from base64 import urlsafe_b64encode -from time import time - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class DlProtectCom(SimpleCrypter): -    __name__    = "DlProtectCom" -    __type__    = "crypter" -    __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)] - -    __description__ = """Dl-protect.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    COOKIES = [("dl-protect.com", "l", "en")] - -    OFFLINE_PATTERN = r'Unfortunately, the link you are looking for is not found' - - -    def getLinks(self): -        # Direct link with redirect -        if not re.match(r"https?://(?:www\.)?dl-protect\.com/.+", self.req.http.lastEffectiveURL): -            return [self.req.http.lastEffectiveURL] - -        post_req = {'key'       : re.search(r'name="key" value="(.+?)"', self.html).group(1), -                    'submitform': ""} - -        if "Please click on continue to see the content" in self.html: -            post_req['submitform'] = "Continue" -            self.wait(2) - -        else: -            mstime  = int(round(time() * 1000)) -            b64time = "_" + urlsafe_b64encode(str(mstime)).replace("=", "%3D") - -            post_req.update({'i'         : b64time, -                             'submitform': "Decrypt+link"}) - -            if "Password :" in self.html: -                post_req['pwd'] = self.getPassword() - -            if "Security Code" in self.html: -                captcha_id   = re.search(r'/captcha\.php\?uid=(.+?)"', self.html).group(1) -                captcha_url  = "http://www.dl-protect.com/captcha.php?uid=" + captcha_id -                captcha_code = self.decryptCaptcha(captcha_url, imgtype="gif") - -                post_req['secure'] = captcha_code - -        self.html = self.load(self.pyfile.url, post=post_req) - -        for errmsg in ("The password is incorrect", "The security code is incorrect"): -            if errmsg in self.html: -                self.fail(_(errmsg[1:])) - -        return re.findall(r'<a href="([^/].+?)" target="_blank">', self.html) - - -getInfo = create_getInfo(DlProtectCom) 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 deleted file mode 100644 index 07cc5cdc4..000000000 --- a/module/plugins/crypter/DuckCryptInfo.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from BeautifulSoup import BeautifulSoup - -from module.plugins.Crypter import Crypter - - -class DuckCryptInfo(Crypter): -    __name__    = "DuckCryptInfo" -    __type__    = "crypter" -    __version__ = "0.02" - -    __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)] - -    __description__ = """DuckCrypt.info decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("godofdream", "soilfiction@gmail.com")] - - -    TIMER_PATTERN = r'<span id="timer">(.*)</span>' - - -    def decrypt(self, pyfile): -        url = pyfile.url - -        m = re.match(self.__pattern__, url) -        if m is None: -            self.fail(_("Weird error in link")) -        if str(m.group(1)) == "link": -            self.handleLink(url) -        else: -            self.handleFolder(m) - - -    def handleFolder(self, m): -        html = self.load("http://duckcrypt.info/ajax/auth.php?hash=" + str(m.group(2))) -        m = re.match(self.__pattern__, html) -        self.logDebug("Redirectet to " + str(m.group(0))) -        html = self.load(str(m.group(0))) -        soup = BeautifulSoup(html) -        cryptlinks = soup.findAll("div", attrs={"class": "folderbox"}) -        self.logDebug("Redirectet to " + str(cryptlinks)) -        if not cryptlinks: -            self.error(_("No link found")) -        for clink in cryptlinks: -            if clink.find("a"): -                self.handleLink(clink.find("a")['href']) - - -    def handleLink(self, url): -        html = self.load(url) -        soup = BeautifulSoup(html) -        self.urls = [soup.find("iframe")['src']] -        if not self.urls: -            self.logInfo(_("No link found")) diff --git a/module/plugins/crypter/DuploadOrgFolder.py b/module/plugins/crypter/DuploadOrgFolder.py deleted file mode 100644 index 066fbe3d7..000000000 --- a/module/plugins/crypter/DuploadOrgFolder.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class DuploadOrgFolder(DeadCrypter): -    __name__    = "DuploadOrgFolder" -    __type__    = "crypter" -    __version__ = "0.02" - -    __pattern__ = r'http://(?:www\.)?dupload\.org/folder/\d+' -    __config__  = [] - -    __description__ = """Dupload.org folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it")] - - -getInfo = create_getInfo(DuploadOrgFolder) diff --git a/module/plugins/crypter/EasybytezComFolder.py b/module/plugins/crypter/EasybytezComFolder.py deleted file mode 100644 index 6c643e83f..000000000 --- a/module/plugins/crypter/EasybytezComFolder.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.XFSCrypter import XFSCrypter, create_getInfo - - -class EasybytezComFolder(XFSCrypter): -    __name__    = "EasybytezComFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """Easybytez.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it")] - - -    LOGIN_ACCOUNT = True - - -getInfo = create_getInfo(EasybytezComFolder) diff --git a/module/plugins/crypter/EmbeduploadCom.py b/module/plugins/crypter/EmbeduploadCom.py deleted file mode 100644 index 456e48a32..000000000 --- a/module/plugins/crypter/EmbeduploadCom.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter -from module.network.HTTPRequest import BadHeader - - -class EmbeduploadCom(Crypter): -    __name__    = "EmbeduploadCom" -    __type__    = "crypter" -    __version__ = "0.02" - -    __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)", "")] - -    __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")>' - - -    def decrypt(self, pyfile): -        self.html = self.load(pyfile.url, decode=True) -        tmp_links = [] - -        m = re.findall(self.LINK_PATTERN, self.html) -        if m: -            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) -            self.urls = self.getLocation(tmp_links) - -            if not self.urls: -                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) -                self.urls = self.getLocation(tmp_links) - - -    def getLocation(self, tmp_links): -        new_links = [] -        for link in tmp_links: -            try: -                header = self.load(link, just_header=True) -                if 'location' in header: -                    new_links.append(header['location']) -            except BadHeader: -                pass -        return new_links diff --git a/module/plugins/crypter/FilebeerInfoFolder.py b/module/plugins/crypter/FilebeerInfoFolder.py deleted file mode 100644 index a3c7ee74c..000000000 --- a/module/plugins/crypter/FilebeerInfoFolder.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class FilebeerInfoFolder(DeadCrypter): -    __name__    = "FilebeerInfoFolder" -    __type__    = "crypter" -    __version__ = "0.02" - -    __pattern__ = r'http://(?:www\.)?filebeer\.info/\d*~f\w+' -    __config__  = [] - -    __description__ = """Filebeer.info folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -getInfo = create_getInfo(FilebeerInfoFolder) diff --git a/module/plugins/crypter/FilecloudIoFolder.py b/module/plugins/crypter/FilecloudIoFolder.py deleted file mode 100644 index 83cce352d..000000000 --- a/module/plugins/crypter/FilecloudIoFolder.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class FilecloudIoFolder(SimpleCrypter): -    __name__    = "FilecloudIoFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """Filecloud.io folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    LINK_PATTERN = r'href="(http://filecloud\.io/\w+)" title' -    NAME_PATTERN = r'>(?P<N>.+?) - filecloud\.io<' - - -getInfo = create_getInfo(FilecloudIoFolder) diff --git a/module/plugins/crypter/FilecryptCc.py b/module/plugins/crypter/FilecryptCc.py deleted file mode 100644 index d15d2ae4b..000000000 --- a/module/plugins/crypter/FilecryptCc.py +++ /dev/null @@ -1,180 +0,0 @@ -# -*- coding: utf-8 -*- -# http://filecrypt.cc/Container/64E039F859.html - -import binascii -import re - -from Crypto.Cipher import AES -from urlparse import urljoin - -from module.plugins.Crypter import Crypter -from module.plugins.internal.CaptchaService import ReCaptcha - - -class FilecryptCc(Crypter): -    __name__    = "FilecryptCc" -    __type__    = "crypter" -    __version__ = "0.11" - -    __pattern__ = r'https?://(?:www\.)?filecrypt\.cc/Container/\w+' - -    __description__ = """Filecrypt.cc decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zapp-brannigan", "")] - - -    # URL_REPLACEMENTS  = [(r'.html$', ""), (r'$', ".html")]  #@TODO: Extend SimpleCrypter - -    DLC_LINK_PATTERN = r'<button class="dlcdownload" type="button" title="Download \*.dlc" onclick="DownloadDLC\(\'(.+)\'\);"><i></i><span>dlc<' -    WEBLINK_PATTERN  = r"openLink.?'([\w_-]*)'," - -    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+)">' - - -    def setup(self): -        self.links = [] - - -    def decrypt(self, pyfile): -        self.html = self.load(pyfile.url, cookies=True) - -        if "content notfound" in self.html:  #@NOTE: "content notfound" is NOT a typo -            self.offline() - -        self.handlePasswordProtection() -        self.handleCaptcha() -        self.handleMirrorPages() - -        for handle in (self.handleCNL, self.handleWeblinks, self.handleDlcContainer): -            handle() -            if self.links: -                self.packages = [(pyfile.package().name, self.links, pyfile.package().name)] -                return - - -    def handleMirrorPages(self): -        if "mirror=" not in self.siteWithLinks: -            return - -        mirror = re.findall(self.MIRROR_PAGE_PATTERN, self.siteWithLinks) - -        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") - - -    def handlePasswordProtection(self): -        if '<input type="text" name="password"' not in self.html: -            return - -        self.logInfo(_("Folder is password protected")) - -        password = self.getPassword() - -        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) - - -    def handleCaptcha(self): -        m  = re.search(self.CAPTCHA_PATTERN, self.html) -        m2 = re.search(self.CIRCLE_CAPTCHA_PATTERN, self.html) - -        if m:  #: normal captcha -            self.logDebug("Captcha-URL: %s" % m.group(1)) - -            captcha_code = self.decryptCaptcha(urljoin("http://filecrypt.cc", 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", -                                               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: -                response, challenge = recaptcha.challenge(captcha_key) -                self.siteWithLinks  = self.load(self.pyfile.url, -                                                post={'g-recaptcha-response': response}, -                                                decode=True) -            else: -                self.logInfo(_("No captcha found")) -                self.siteWithLinks = self.html - -        if "recaptcha_image" in self.siteWithLinks or "data-sitekey" in self.siteWithLinks: -            self.invalidCaptcha() -            self.retry() - - -    def handleDlcContainer(self): -        dlc = re.findall(self.DLC_LINK_PATTERN, self.siteWithLinks) - -        if not dlc: -            return - -        for i in dlc: -            self.links.append("http://filecrypt.cc/DLC/%s.dlc" % i) - - -    def handleWeblinks(self): -        try: -            weblinks = re.findall(self.WEBLINK_PATTERN, self.siteWithLinks) - -            for link in weblinks: -                res   = self.load("http://filecrypt.cc/Link/%s.html" % link, cookies=True) -                link2 = re.search('<iframe noresize src="(.*)"></iframe>', res) -                res2  = self.load(link2.group(1), just_header=True, cookies=True) -                self.links.append(res2['location']) - -        except Exception, e: -            self.logDebug("Error decrypting weblinks: %s" % e) - - -    def handleCNL(self): -        try: -            vjk = re.findall('<input type="hidden" name="jk" value="function f\(\){ return \'(.*)\';}">', self.siteWithLinks) -            vcrypted = re.findall('<input type="hidden" name="crypted" value="(.*)">', self.siteWithLinks) - -            for i in xrange(len(vcrypted)): -                self.links.extend(self._getLinks(vcrypted[i], vjk[i])) - -        except Exception, e: -            self.logDebug("Error decrypting CNL: %s" % e) - - -    def _getLinks(self, crypted, jk): -        # Get key -        key = binascii.unhexlify(str(jk)) - -        # Decrypt -        Key  = key -        IV   = key -        obj  = AES.new(Key, AES.MODE_CBC, IV) -        text = obj.decrypt(crypted.decode('base64')) - -        # Extract links -        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 deleted file mode 100644 index 261c7e01a..000000000 --- a/module/plugins/crypter/FilefactoryComFolder.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class FilefactoryComFolder(SimpleCrypter): -    __name__    = "FilefactoryComFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """Filefactory.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it")] - - -    COOKIES = [("filefactory.com", "locale", "en_US.utf8")] - -    LINK_PATTERN  = r'<td>\s*<a href="(.+?)"' -    NAME_PATTERN  = r'<h1>Files in <span>(?P<N>.+?)<' -    PAGES_PATTERN = r'data-paginator-totalPages="(\d+)' - - -    def loadPage(self, page_n): -        return self.load(self.pyfile.url, get={'page': page_n, 'show': 100}) - - -getInfo = create_getInfo(FilefactoryComFolder) diff --git a/module/plugins/crypter/FilerNetFolder.py b/module/plugins/crypter/FilerNetFolder.py deleted file mode 100644 index d33e26ee8..000000000 --- a/module/plugins/crypter/FilerNetFolder.py +++ /dev/null @@ -1,27 +0,0 @@ -import re - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class FilerNetFolder(SimpleCrypter): -    __name__    = "FilerNetFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """Filer.net decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("nath_schwarz", "nathan.notwhite@gmail.com"), -                       ("stickell", "l.stickell@yahoo.it")] - - -    LINK_PATTERN = r'href="(/get/\w{16})">(?!<)' - -    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 deleted file mode 100644 index e6b35fd36..000000000 --- a/module/plugins/crypter/FileserveComFolder.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.Crypter import Crypter - - -class FileserveComFolder(Crypter): -    __name__    = "FileserveComFolder" -    __type__    = "crypter" -    __version__ = "0.11" - -    __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)] - -    __description__ = """FileServe.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("fionnc", "fionnc@gmail.com")] - - -    FOLDER_PATTERN = r'<table class="file_list">(.*?)</table>' -    LINK_PATTERN = r'<a href="([^"]+)" class="sheet_icon wbold">' - - -    def decrypt(self, pyfile): -        html = self.load(pyfile.url) - -        new_links = [] - -        folder = re.search(self.FOLDER_PATTERN, html, re.S) -        if folder is None: -            self.error(_("FOLDER_PATTERN not found")) - -        new_links.extend(re.findall(self.LINK_PATTERN, folder.group(1))) - -        if new_links: -            self.urls = [map(lambda s: "http://fileserve.com%s" % s, new_links)] diff --git a/module/plugins/crypter/FilesonicComFolder.py b/module/plugins/crypter/FilesonicComFolder.py deleted file mode 100644 index d58516986..000000000 --- a/module/plugins/crypter/FilesonicComFolder.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class FilesonicComFolder(DeadCrypter): -    __name__    = "FilesonicComFolder" -    __type__    = "crypter" -    __version__ = "0.12" - -    __pattern__ = r'http://(?:www\.)?filesonic\.com/folder/\w+' - -    __description__ = """Filesonic.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -getInfo = create_getInfo(FilesonicComFolder) diff --git a/module/plugins/crypter/FilestubeCom.py b/module/plugins/crypter/FilestubeCom.py deleted file mode 100644 index 16ebdda37..000000000 --- a/module/plugins/crypter/FilestubeCom.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class FilestubeCom(SimpleCrypter): -    __name__    = "FilestubeCom" -    __type__    = "crypter" -    __version__ = "0.05" - -    __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)] - -    __description__ = """Filestube.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it")] - - -    LINK_PATTERN = r'<a class=\"file-link-main(?: noref)?\" [^>]* href=\"(http://[^\"]+)' -    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 deleted file mode 100644 index 76530c589..000000000 --- a/module/plugins/crypter/FiletramCom.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class FiletramCom(SimpleCrypter): -    __name__    = "FiletramCom" -    __type__    = "crypter" -    __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)] - -    __description__ = """Filetram.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("igel", "igelkun@myopera.com"), -                       ("stickell", "l.stickell@yahoo.it")] - - -    LINK_PATTERN = r'\s+(http://.+)' -    NAME_PATTERN = r'<title>(?P<N>.+?) - Free Download' - - -getInfo = create_getInfo(FiletramCom) diff --git a/module/plugins/crypter/FiredriveComFolder.py b/module/plugins/crypter/FiredriveComFolder.py deleted file mode 100644 index 7d3a357fd..000000000 --- a/module/plugins/crypter/FiredriveComFolder.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class FiredriveComFolder(DeadCrypter): -    __name__    = "FiredriveComFolder" -    __type__    = "crypter" -    __version__ = "0.03" - -    __pattern__ = r'https?://(?:www\.)?(firedrive|putlocker)\.com/share/.+' -    __config__  = [] - -    __description__ = """Firedrive.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -getInfo = create_getInfo(FiredriveComFolder) diff --git a/module/plugins/crypter/FourChanOrg.py b/module/plugins/crypter/FourChanOrg.py deleted file mode 100644 index c3fe3db4b..000000000 --- a/module/plugins/crypter/FourChanOrg.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Based on 4chandl by Roland Beermann (https://gist.github.com/enkore/3492599) - -import re - -from module.plugins.Crypter import Crypter - - -class FourChanOrg(Crypter): -    __name__    = "FourChanOrg" -    __type__    = "crypter" -    __version__ = "0.31" - -    __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)] - -    __description__ = """4chan.org folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [] - - -    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] diff --git a/module/plugins/crypter/FreakhareComFolder.py b/module/plugins/crypter/FreakhareComFolder.py deleted file mode 100644 index 7c1b7de2b..000000000 --- a/module/plugins/crypter/FreakhareComFolder.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class FreakhareComFolder(SimpleCrypter): -    __name__    = "FreakhareComFolder" -    __type__    = "crypter" -    __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)] - -    __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">' -    NAME_PATTERN = r'Folder:</b> (?P<N>.+)' -    PAGES_PATTERN = r'Pages: +(\d+)' - - -    def loadPage(self, page_n): -        if not hasattr(self, 'f_id') and not hasattr(self, 'f_md5'): -            m = re.search(r'http://freakshare.com/\?x=folder&f_id=(\d+)&f_md5=(\w+)', self.html) -            if m: -                self.f_id = m.group(1) -                self.f_md5 = m.group(2) -        return self.load('http://freakshare.com/', get={'x': 'folder', -                                                        'f_id': self.f_id, -                                                        'f_md5': self.f_md5, -                                                        'entrys': '20', -                                                        'page': page_n - 1, -                                                        'order': ''}, decode=True) - - -getInfo = create_getInfo(FreakhareComFolder) diff --git a/module/plugins/crypter/FreetexthostCom.py b/module/plugins/crypter/FreetexthostCom.py deleted file mode 100644 index c33c9ff64..000000000 --- a/module/plugins/crypter/FreetexthostCom.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class FreetexthostCom(SimpleCrypter): -    __name__    = "FreetexthostCom" -    __type__    = "crypter" -    __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)] - -    __description__ = """Freetexthost.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it")] - - -    def getLinks(self): -        m = re.search(r'<div id="contentsinner">\s*(.+)<div class="viewcount">', self.html, re.S) -        if m is None: -            self.error(_("Unable to extract links")) -        links = m.group(1) -        return links.strip().split("<br />\r\n") - - -getInfo = create_getInfo(FreetexthostCom) diff --git a/module/plugins/crypter/FshareVnFolder.py b/module/plugins/crypter/FshareVnFolder.py deleted file mode 100644 index 474364e40..000000000 --- a/module/plugins/crypter/FshareVnFolder.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class FshareVnFolder(SimpleCrypter): -    __name__    = "FshareVnFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """Fshare.vn folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -    LINK_PATTERN = r'<li class="w_80pc"><a href="([^"]+)" target="_blank">' - - -getInfo = create_getInfo(FshareVnFolder) diff --git a/module/plugins/crypter/Go4UpCom.py b/module/plugins/crypter/Go4UpCom.py deleted file mode 100644 index a7e16c0ab..000000000 --- a/module/plugins/crypter/Go4UpCom.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from urlparse import urljoin - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class Go4UpCom(SimpleCrypter): -    __name__    = "Go4UpCom" -    __type__    = "crypter" -    __version__ = "0.11" - -    __pattern__ = r'http://go4up\.com/(dl/\w{12}|rd/\w{12}/\d+)' - -    __description__ = """Go4Up.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("rlindner81", "rlindner81@gmail.com"), -                       ("Walter Purcaro", "vuolter@gmail.com")] - - -    LINK_PATTERN = r'(http://go4up\.com/rd/.+?)<' - -    NAME_PATTERN = r'<title>Download (.+?)<' - -    OFFLINE_PATTERN = r'>\s*(404 Page Not Found|File not Found|Mirror does not exist)' - - -    def getLinks(self -        links = [] - -        m = re.search(r'(/download/gethosts/.+?)"') -        if m: -            self.html = self.load(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] - -        for html in pages: -            try: -                links.append(re.search(r'<b><a href="(.+?)"', html).group(1)) -            except Exception: -                continue - -        return links - - -getInfo = create_getInfo(Go4UpCom) diff --git a/module/plugins/crypter/GooGl.py b/module/plugins/crypter/GooGl.py deleted file mode 100644 index d548a3375..000000000 --- a/module/plugins/crypter/GooGl.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.Crypter import Crypter -from module.common.json_layer import json_loads - - -class GooGl(Crypter): -    __name__    = "GooGl" -    __type__    = "crypter" -    __version__ = "0.01" - -    __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)] - -    __description__ = """Goo.gl decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it")] - - -    API_URL = "https://www.googleapis.com/urlshortener/v1/url" - - -    def decrypt(self, pyfile): -        rep = self.load(self.API_URL, get={'shortUrl': pyfile.url}) -        self.logDebug("JSON data: " + rep) -        rep = json_loads(rep) - -        if 'longUrl' in rep: -            self.urls = [rep['longUrl']] -        else: -            self.fail(_("Unable to expand shortened link")) diff --git a/module/plugins/crypter/HoerbuchIn.py b/module/plugins/crypter/HoerbuchIn.py deleted file mode 100644 index a347e4232..000000000 --- a/module/plugins/crypter/HoerbuchIn.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup - -from module.plugins.Crypter import Crypter - - -class HoerbuchIn(Crypter): -    __name__    = "HoerbuchIn" -    __type__    = "crypter" -    __version__ = "0.60" - -    __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)] - -    __description__ = """Hoerbuch.in decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("spoob", "spoob@pyload.org"), -                       ("mkaay", "mkaay@mkaay.de")] - - -    article = re.compile("http://(?:www\.)?hoerbuch\.in/wp/horbucher/\d+/.+/") -    protection = re.compile("http://(?:www\.)?hoerbuch\.in/protection/folder_\d+.html") - - -    def decrypt(self, pyfile): -        self.pyfile = pyfile - -        if self.article.match(pyfile.url): -            html = self.load(pyfile.url) -            soup = BeautifulSoup(html, convertEntities=BeautifulStoneSoup.HTML_ENTITIES) - -            abookname = soup.find("a", attrs={"rel": "bookmark"}).text -            for a in soup.findAll("a", attrs={"href": self.protection}): -                package = "%s (%s)" % (abookname, a.previousSibling.previousSibling.text[:-1]) -                links = self.decryptFolder(a['href']) - -                self.packages.append((package, links, package)) -        else: -            self.urls = self.decryptFolder(pyfile.url) - - -    def decryptFolder(self, url): -        m = self.protection.search(url) -        if m is None: -            self.fail(_("Bad URL")) -        url = m.group(0) - -        self.pyfile.url = url -        html = self.load(url, post={"viewed": "adpg"}) - -        links = [] -        pattern = re.compile("http://www\.hoerbuch\.in/protection/(\w+)/(.*?)\"") -        for hoster, lid in pattern.findall(html): -            self.req.lastURL = url -            self.load("http://www.hoerbuch.in/protection/%s/%s" % (hoster, lid)) -            links.append(self.req.lastEffectiveURL) - -        return links diff --git a/module/plugins/crypter/HotfileComFolder.py b/module/plugins/crypter/HotfileComFolder.py deleted file mode 100644 index 4f40587ad..000000000 --- a/module/plugins/crypter/HotfileComFolder.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class HotfileComFolder(DeadCrypter): -    __name__    = "HotfileComFolder" -    __type__    = "crypter" -    __version__ = "0.30" - -    __pattern__ = r'https?://(?:www\.)?hotfile\.com/list/\w+/\w+' -    __config__  = [] - -    __description__ = """Hotfile.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("RaNaN", "RaNaN@pyload.org")] - - -getInfo = create_getInfo(HotfileComFolder) diff --git a/module/plugins/crypter/ILoadTo.py b/module/plugins/crypter/ILoadTo.py deleted file mode 100644 index f3415706d..000000000 --- a/module/plugins/crypter/ILoadTo.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class ILoadTo(DeadCrypter): -    __name__    = "ILoadTo" -    __type__    = "crypter" -    __version__ = "0.11" - -    __pattern__ = r'http://(?:www\.)?iload\.to/go/\d+-[\w.-]+/' -    __config__  = [] - -    __description__ = """Iload.to decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("hzpz", None)] - - -getInfo = create_getInfo(ILoadTo) diff --git a/module/plugins/crypter/ImgurComAlbum.py b/module/plugins/crypter/ImgurComAlbum.py deleted file mode 100644 index 6c074f5f1..000000000 --- a/module/plugins/crypter/ImgurComAlbum.py +++ /dev/null @@ -1,30 +0,0 @@ -import re - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo -from module.utils import uniqify - - -class ImgurComAlbum(SimpleCrypter): -    __name__    = "ImgurComAlbum" -    __type__    = "crypter" -    __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)] - -    __description__ = """Imgur.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("nath_schwarz", "nathan.notwhite@gmail.com")] - - -    NAME_PATTERN = r'(?P<N>.+?) - Imgur' -    LINK_PATTERN = r'i\.imgur\.com/\w{7}s?\.(?:jpeg|jpg|png|gif|apng)' - - -    def getLinks(self): -        f = lambda url: "http://" + re.sub(r'(\w{7})s\.', r'\1.', url) -        return uniqify(map(f, re.findall(self.LINK_PATTERN, self.html))) - - -getInfo = create_getInfo(ImgurComAlbum) diff --git a/module/plugins/crypter/LetitbitNetFolder.py b/module/plugins/crypter/LetitbitNetFolder.py deleted file mode 100644 index 56ecbc7f8..000000000 --- a/module/plugins/crypter/LetitbitNetFolder.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - - -class LetitbitNetFolder(Crypter): -    __name__    = "LetitbitNetFolder" -    __type__    = "crypter" -    __version__ = "0.10" - -    __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)] - -    __description__ = """Letitbit.net folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("DHMH", "webmaster@pcProfil.de"), -                       ("z00nx", "z00nx0@gmail.com")] - - -    FOLDER_PATTERN = r'<table>(.*)</table>' -    LINK_PATTERN = r'<a href="([^"]+)" target="_blank">' - - -    def decrypt(self, pyfile): -        html = self.load(pyfile.url) - -        folder = re.search(self.FOLDER_PATTERN, html, re.S) -        if folder is None: -            self.error(_("FOLDER_PATTERN not found")) - -        self.urls.extend(re.findall(self.LINK_PATTERN, folder.group(0))) diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py deleted file mode 100644 index 018ed90ba..000000000 --- a/module/plugins/crypter/LinkCryptWs.py +++ /dev/null @@ -1,322 +0,0 @@ -# -*- coding: utf-8 -*- - -import binascii -import re - -import pycurl - -from Crypto.Cipher import AES - -from module.plugins.Crypter import Crypter -from module.utils import html_unescape - - -class LinkCryptWs(Crypter): -    __name__    = "LinkCryptWs" -    __type__    = "crypter" -    __version__ = "0.08" - -    __pattern__ = r'http://(?:www\.)?linkcrypt\.ws/(dir|container)/(?P<ID>\w+)' - -    __description__ = """LinkCrypt.ws decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("kagenoshin", "kagenoshin[AT]gmx[DOT]ch"), -                       ("glukgluk", None), -                       ("Gummibaer", None)] - - -    CRYPTED_KEY = "crypted" -    JK_KEY = "jk" - - -    def setup(self): -        self.captcha = False -        self.links   = [] -        self.sources = ['cnl', 'web', 'dlc', 'rsdf', 'ccf'] - - -    def prepare(self): -        # Init -        self.fileid = re.match(self.__pattern__, self.pyfile.url).group('ID') - -        self.req.cj.setCookie("linkcrypt.ws", "language", "en") - -        # Request package -        self.req.http.c.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko")  #: better chance to not get those key-captchas -        self.html = self.load(self.pyfile.url) - - -    def decrypt(self, pyfile): -        if not self.js: -            self.fail(_("Missing JS Engine")) - -        self.prepare() - -        if not self.isOnline(): -            self.offline() - -        if self.isKeyCaptchaProtected(): -            self.retry(8, 15, _("Can't handle Key-Captcha")) - -        if self.isCaptchaProtected(): -            self.captcha = True -            self.unlockCaptchaProtection() -            self.handleCaptchaErrors() - -        # Check for protection -        if self.isPasswordProtected(): -            self.unlockPasswordProtection() -            self.handleErrors() - -        # get unrar password -        self.getunrarpw() - -        # Get package name and folder -        package_name, folder_name = self.getPackageInfo() - -        #get the container definitions from script section -        self.get_container_html() - -        # Extract package links -        for type in self.sources: -            links = self.handleLinkSource(type) - -            if links: -                self.links.extend(links) -                break - -        if self.links: -            self.packages = [(package_name, self.links, folder_name)] - - -    def isOnline(self): -        if "<title>Linkcrypt.ws // Error 404</title>" in self.html: -            self.logDebug("folder doesen't exist anymore") -            return False -        else: -            return True - - -    def isPasswordProtected(self): -        if "Authorizing" in self.html: -            self.logDebug("Links are password protected") -            return True -        else: -            return False - - -    def isCaptchaProtected(self): -        if 'id="captcha">' in self.html: -            self.logDebug("Links are captcha protected") -            return True -        else: -            return False - - -    def isKeyCaptchaProtected(self): -        if re.search(r'>If the folder does not open after klick on <', self.html, re.I): -            return True -        else: -            return False - - -    def unlockPasswordProtection(self): -        password = self.getPassword() - -        if password: -            self.logDebug("Submitting password [%s] for protected links" % password) -            self.html = self.load(self.pyfile.url, post={"password": password, 'x': "0", 'y': "0"}) -        else: -            self.fail(_("Folder is password protected")) - - -    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_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]}) - - -    def getPackageInfo(self): -        name   = self.pyfile.package().name -        folder = self.pyfile.package().folder - -        self.logDebug("Defaulting to pyfile name [%s] and folder [%s] for package" % (name, folder)) - -        return name, folder - - -    def getunrarpw(self): -        sitein = self.html -        indexi = sitein.find("|source|") + 8 -        indexe = sitein.find("|",indexi) - -        unrarpw = sitein[indexi:indexe] - -        if not (unrarpw == "Password" or "Dateipasswort") : -            self.logDebug("File password set to: [%s]"% unrarpw) -            self.pyfile.package().password = unrarpw - - -    def handleErrors(self): -        if self.isPasswordProtected(): -            self.fail(_("Incorrect password")) - - -    def handleCaptchaErrors(self): -        if self.captcha: -            if "Your choice was wrong!" in self.html: -                self.invalidCaptcha() -                self.retry() -            else: -                self.correctCaptcha() - - -    def handleLinkSource(self, type): -        if type == 'cnl': -                return self.handleCNL2() - -        elif type == 'web': -                return self.handleWebLinks() - -        elif type in ('rsdf', 'ccf', 'dlc'): -                return self.handleContainer(type) - -        else: -            self.fail(_("Unknown source type: %s") % type)  #@TODO: Replace with self.error in 0.4.10 - - -    def handleWebLinks(self): -        self.logDebug("Search for Web links ") - -        package_links = [] -        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 -                indexe = res.find('"', indexs) - -                link2 = res[indexs:indexe] - -                self.logDebug(link2) - -                link2 = html_unescape(link2) -                package_links.append(link2) - -            except Exception, detail: -                self.logDebug("Error decrypting Web link %s, %s" % (weblink_id, detail)) - -        return package_links - - -    def get_container_html(self): -        self.container_html = [] - -        script = re.search(r'<div.*?id="ad_cont".*?<script.*?javascrip[^>]*?>(.*?)</script', self.html, re.I | re.S) - -        if script: -            container_html_text = script.group(1) -            container_html_text.strip() -            self.container_html = container_html_text.splitlines() - - -    def handle_javascript(self, line): -        return self.js.eval(line.replace('{}))',"{}).replace('document.open();document.write','').replace(';document.close();',''))")) - - -    def handleContainer(self, type): -        package_links = [] -        type = type.lower() - -        self.logDebug('Search for %s Container links' % type.upper()) - -        if not type.isalnum():  # check to prevent broken re-pattern (cnl2,rsdf,ccf,dlc,web are all alpha-numeric) -            self.fail(_("Unknown container type: %s") % type)  #@TODO: Replace with self.error in 0.4.10 - -        for line in self.container_html: -            if type in line: -                jseval = self.handle_javascript(line) -                clink = re.search(r'href=["\']([^"\']*?)["\']',jseval,re.I) - -                if not clink: -                    continue - -                self.logDebug("clink avaible") - -                package_name, folder_name = self.getPackageInfo() -                self.logDebug("Added package with name %s.%s and container link %s" %( package_name, type, clink.group(1))) -                self.core.api.uploadContainer( "%s.%s" %(package_name, type), self.load(clink.group(1))) -                return "Found it" - -        return package_links - - -    def handleCNL2(self): -        self.logDebug("Search for CNL links") - -        package_links = [] -        cnl_line = None - -        for line in self.container_html: -            if "cnl" in line: -                cnl_line = line -                break - -        if cnl_line: -            self.logDebug("cnl_line gefunden") - -        try: -            cnl_section = self.handle_javascript(cnl_line) -            (vcrypted, vjk) = self._getCipherParams(cnl_section) -            for (crypted, jk) in zip(vcrypted, vjk): -                package_links.extend(self._getLinks(crypted, jk)) -        except Exception: -            self.logError(_("Unable to decrypt CNL links (JS Error) try to get over links")) -            return self.handleWebLinks() - -        return package_links - - -    def _getCipherParams(self, cnl_section): -        # Get jk -        jk_re = r'<INPUT.*?NAME="%s".*?VALUE="(.*?)"' % LinkCryptWs.JK_KEY -        vjk = re.findall(jk_re, cnl_section) - -        # Get crypted -        crypted_re = r'<INPUT.*?NAME="%s".*?VALUE="(.*?)"' % LinkCryptWs.CRYPTED_KEY -        vcrypted = re.findall(crypted_re, cnl_section) - -        # Log and return -        self.logDebug("Detected %d crypted blocks" % len(vcrypted)) -        return vcrypted, vjk - - -    def _getLinks(self, crypted, jk): -        # Get key -        jreturn = self.js.eval("%s f()" % jk) -        key     = binascii.unhexlify(jreturn) - -        self.logDebug("JsEngine returns value [%s]" % jreturn) - -        # Decrypt -        Key  = key -        IV   = key -        obj  = AES.new(Key, AES.MODE_CBC, IV) -        text = obj.decrypt(crypted.decode('base64')) - -        # Extract links -        text  = text.replace("\x00", "").replace("\r", "") -        links = filter(bool, text.split('\n')) - -        # Log and return -        self.logDebug("Package has %d links" % len(links)) - -        return links diff --git a/module/plugins/crypter/LinkSaveIn.py b/module/plugins/crypter/LinkSaveIn.py deleted file mode 100644 index e96d0438e..000000000 --- a/module/plugins/crypter/LinkSaveIn.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleDereferer import SimpleDereferer - - -class LinkSaveIn(SimpleDereferer): -    __name__    = "LinkSaveIn" -    __type__    = "crypter" -    __version__ = "2.03" - -    __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)] - -    __description__ = """LinkSave.in decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    COOKIES = [("linksave.in", "Linksave_Language", "english")] - -    OFFLINE_PATTERN = r'>(Error )?404 -' diff --git a/module/plugins/crypter/LinkdecrypterCom.py b/module/plugins/crypter/LinkdecrypterCom.py deleted file mode 100644 index 7f24784c7..000000000 --- a/module/plugins/crypter/LinkdecrypterCom.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - - -class LinkdecrypterCom(Crypter): -    __name__    = "LinkdecrypterCom" -    __type__    = "crypter" -    __version__ = "0.29" - -    __pattern__ = r'^unmatchable$' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] - -    __description__ = """Linkdecrypter.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz"), -                       ("flowlee", None)] - - -    TEXTAREA_PATTERN = r'<textarea name="links" wrap="off" readonly="1" class="caja_des">(.+)</textarea>' -    PASSWORD_PATTERN = r'<input type="text" name="password"' -    CAPTCHA_PATTERN  = r'<img class="captcha" src="(.+?)"(.*?)>' -    REDIR_PATTERN    = r'<i>(Click <a href="./">here</a> if your browser does not redirect you).</i>' - - -    def setup(self): -        self.password = self.getPassword() -        self.req.setOption("timeout", 300) - - -    def decrypt(self, pyfile): -        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) - -        while retries: -            m = re.search(self.TEXTAREA_PATTERN, self.html, flags=re.S) -            if m: -                self.urls = [x for x in m.group(1).splitlines() if '[LINK-ERROR]' not in x] - -            m = re.search(self.CAPTCHA_PATTERN, self.html) -            if m: -                captcha_url = 'http://linkdecrypter.com/' + m.group(1) -                result_type = "positional" if "getPos" in m.group(2) else "textual" - -                m = re.search(r"<p><i><b>([^<]+)</b></i></p>", self.html) -                msg = m.group(1) if m else "" -                self.logInfo(_("Captcha protected link"), result_type, msg) - -                captcha = self.decryptCaptcha(captcha_url, result_type=result_type) -                if result_type == "positional": -                    captcha = "%d|%d" % captcha -                self.html = self.load('http://linkdecrypter.com/', post={"captcha": captcha}, decode=True) -                retries -= 1 - -            elif self.PASSWORD_PATTERN in self.html: -                if self.password: -                    self.logInfo(_("Password protected link")) -                    self.html = self.load('http://linkdecrypter.com/', post={'password': self.password}, decode=True) -                else: -                    self.fail(_("Missing password")) - -            else: -                retries -= 1 -                self.html = self.load('http://linkdecrypter.com/', cookies=True, decode=True) diff --git a/module/plugins/crypter/LixIn.py b/module/plugins/crypter/LixIn.py deleted file mode 100644 index d899d58c7..000000000 --- a/module/plugins/crypter/LixIn.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.Crypter import Crypter - - -class LixIn(Crypter): -    __name__    = "LixIn" -    __type__    = "crypter" -    __version__ = "0.22" - -    __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)] - -    __description__ = """Lix.in decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("spoob", "spoob@pyload.org")] - - -    CAPTCHA_PATTERN = r'<img src="(captcha_img\.php\?.*?)"' -    SUBMIT_PATTERN = r'value=\'continue.*?\'' -    LINK_PATTERN = r'name="ifram" src="(.*?)"' - - -    def decrypt(self, pyfile): -        url = pyfile.url - -        m = re.match(self.__pattern__, url) -        if m is None: -            self.error(_("Unable to identify file ID")) - -        id = m.group('ID') -        self.logDebug("File id is %s" % id) - -        self.html = self.load(url, decode=True) - -        m = re.search(self.SUBMIT_PATTERN, self.html) -        if m is None: -            self.error(_("Link doesn't seem valid")) - -        m = re.search(self.CAPTCHA_PATTERN, self.html) -        if m: -            for _i in xrange(5): -                m = re.search(self.CAPTCHA_PATTERN, self.html) -                if m: -                    self.logDebug("Trying captcha") -                    captcharesult = self.decryptCaptcha("http://lix.in/" + m.group(1)) -                self.html = self.load(url, decode=True, -                                          post={"capt": captcharesult, "submit": "submit", "tiny": id}) -            else: -                self.logDebug("No captcha/captcha solved") -        else: -            self.html = self.load(url, decode=True, post={"submit": "submit", "tiny": id}) - -        m = re.search(self.LINK_PATTERN, self.html) -        if m is None: -            self.error(_("Unable to find destination url")) -        else: -            self.urls = [m.group(1)] -            self.logDebug("Found link %s, adding to package" % self.urls[0]) diff --git a/module/plugins/crypter/LofCc.py b/module/plugins/crypter/LofCc.py deleted file mode 100644 index 3cac0fbf2..000000000 --- a/module/plugins/crypter/LofCc.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class LofCc(DeadCrypter): -    __name__    = "LofCc" -    __type__    = "crypter" -    __version__ = "0.21" - -    __pattern__ = r'http://(?:www\.)?lof\.cc/(.+)' -    __config__  = [] - -    __description__ = """Lof.cc decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("mkaay", "mkaay@mkaay.de")] - - -getInfo = create_getInfo(LofCc) diff --git a/module/plugins/crypter/MBLinkInfo.py b/module/plugins/crypter/MBLinkInfo.py deleted file mode 100644 index 82c2d9719..000000000 --- a/module/plugins/crypter/MBLinkInfo.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class MBLinkInfo(DeadCrypter): -    __name__    = "MBLinkInfo" -    __type__    = "crypter" -    __version__ = "0.03" - -    __pattern__ = r'http://(?:www\.)?mblink\.info/?\?id=(\d+)' -    __config__  = [] - -    __description__ = """MBLink.info decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Gummibaer", "Gummibaer@wiki-bierkiste.de"), -                       ("stickell", "l.stickell@yahoo.it")] - - -getInfo = create_getInfo(MBLinkInfo) diff --git a/module/plugins/crypter/MediafireComFolder.py b/module/plugins/crypter/MediafireComFolder.py deleted file mode 100644 index d1dc89518..000000000 --- a/module/plugins/crypter/MediafireComFolder.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter -from module.plugins.hoster.MediafireCom import checkHTMLHeader -from module.common.json_layer import json_loads - - -class MediafireComFolder(Crypter): -    __name__    = "MediafireComFolder" -    __type__    = "crypter" -    __version__ = "0.14" - -    __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)] - -    __description__ = """Mediafire.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -    FOLDER_KEY_PATTERN = r'var afI= \'(\w+)' -    LINK_PATTERN = r'<meta property="og:url" content="http://www\.mediafire\.com/\?(\w+)"/>' - - -    def decrypt(self, pyfile): -        url, result = checkHTMLHeader(pyfile.url) -        self.logDebug("Location (%d): %s" % (result, url)) - -        if result == 0: -            # load and parse html -            html = self.load(pyfile.url) -            m = re.search(self.LINK_PATTERN, html) -            if m: -                # file page -                self.urls.append("http://www.mediafire.com/file/%s" % m.group(1)) -            else: -                # folder page -                m = re.search(self.FOLDER_KEY_PATTERN, html) -                if m: -                    folder_key = m.group(1) -                    self.logDebug("FOLDER KEY: %s" % folder_key) - -                    json_resp = json_loads(self.load("http://www.mediafire.com/api/folder/get_info.php", -                                                     get={'folder_key'     : folder_key, -                                                          'response_format': "json", -                                                          'version'        : 1})) -                    #self.logInfo(json_resp) -                    if json_resp['response']['result'] == "Success": -                        for link in json_resp['response']['folder_info']['files']: -                            self.urls.append("http://www.mediafire.com/file/%s" % link['quickkey']) -                    else: -                        self.fail(json_resp['response']['message']) -        elif result == 1: -            self.offline() -        else: -            self.urls.append(url) diff --git a/module/plugins/crypter/MegaCoNzFolder.py b/module/plugins/crypter/MegaCoNzFolder.py deleted file mode 100644 index 4bef61f67..000000000 --- a/module/plugins/crypter/MegaCoNzFolder.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.Crypter import Crypter - - -class MegaCoNzFolder(Crypter): -    __name__    = "MegaCoNzFolder" -    __type__    = "crypter" -    __version__ = "0.04" - -    __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)] - -    __description__ = """Mega.co.nz folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    def setup(self): -        self.req.setOption("timeout", 300) - - -    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) - -        if not self.urls:  #@TODO: Remove in 0.4.10 -            self.fail(_("No link grabbed")) diff --git a/module/plugins/crypter/MegaRapidCzFolder.py b/module/plugins/crypter/MegaRapidCzFolder.py deleted file mode 100644 index e7dff6c8a..000000000 --- a/module/plugins/crypter/MegaRapidCzFolder.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class MegaRapidCzFolder(SimpleCrypter): -    __name__    = "MegaRapidCzFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """Share-Rapid.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -    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 deleted file mode 100644 index 08f96700d..000000000 --- a/module/plugins/crypter/MegauploadComFolder.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class MegauploadComFolder(DeadCrypter): -    __name__    = "MegauploadComFolder" -    __type__    = "crypter" -    __version__ = "0.02" - -    __pattern__ = r'http://(?:www\.)?megaupload\.com/(\?f|xml/folderfiles\.php\?.*&?folderid)=\w+' - -    __description__ = """Megaupload.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -getInfo = create_getInfo(MegauploadComFolder) diff --git a/module/plugins/crypter/Movie2KTo.py b/module/plugins/crypter/Movie2KTo.py deleted file mode 100644 index 76bf702ac..000000000 --- a/module/plugins/crypter/Movie2KTo.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class Movie2KTo(DeadCrypter): -    __name__    = "Movie2KTo" -    __type__    = "crypter" -    __version__ = "0.51" - -    __pattern__ = r'http://(?:www\.)?movie2k\.to/(.+)\.html' -    __config__  = [] - -    __description__ = """Movie2k.to decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("4Christopher", "4Christopher@gmx.de")] - - -getInfo = create_getInfo(Movie2KTo) diff --git a/module/plugins/crypter/MultiUpOrg.py b/module/plugins/crypter/MultiUpOrg.py deleted file mode 100644 index 5209ebf09..000000000 --- a/module/plugins/crypter/MultiUpOrg.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from urlparse import urljoin - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class MultiUpOrg(SimpleCrypter): -    __name__    = "MultiUpOrg" -    __type__    = "crypter" -    __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)] - -    __description__ = """MultiUp.org crypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    NAME_PATTERN = r'<title>.*(?:Project|Projet|ownload|élécharger) (?P<N>.+?) (\(|- )' - - -    def getLinks(self): -        m_type = re.match(self.__pattern__, self.pyfile.url).group('TYPE') - -        if m_type == "project": -            pattern = r'\n(http://www\.multiup\.org/(?:en|fr)/download/.*)' -        else: -            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)) -                self.html = self.load(miror_page) - -        return re.findall(pattern, self.html) - - -getInfo = create_getInfo(MultiUpOrg) diff --git a/module/plugins/crypter/MultiloadCz.py b/module/plugins/crypter/MultiloadCz.py deleted file mode 100644 index 55f424f36..000000000 --- a/module/plugins/crypter/MultiloadCz.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - - -class MultiloadCz(Crypter): -    __name__    = "MultiloadCz" -    __type__    = "crypter" -    __version__ = "0.40" - -    __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)", "")] - -    __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="([^"]+)">' - - -    def decrypt(self, pyfile): -        self.html = self.load(pyfile.url, decode=True) - -        if re.match(self.__pattern__, pyfile.url).group(1) == "slozka": -            m = re.search(self.FOLDER_PATTERN, self.html) -            if m: -                self.urls.extend(m.group(1).split()) -        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) - -                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) diff --git a/module/plugins/crypter/MultiuploadCom.py b/module/plugins/crypter/MultiuploadCom.py deleted file mode 100644 index 347b7e5af..000000000 --- a/module/plugins/crypter/MultiuploadCom.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class MultiuploadCom(DeadCrypter): -    __name__    = "MultiuploadCom" -    __type__    = "crypter" -    __version__ = "0.02" - -    __pattern__ = r'http://(?:www\.)?multiupload\.(com|nl)/\w+' -    __config__  = [] - -    __description__ = """ MultiUpload.com decrypter plugin """ -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -getInfo = create_getInfo(MultiuploadCom) diff --git a/module/plugins/crypter/NCryptIn.py b/module/plugins/crypter/NCryptIn.py deleted file mode 100644 index 20e7c72e2..000000000 --- a/module/plugins/crypter/NCryptIn.py +++ /dev/null @@ -1,310 +0,0 @@ -# -*- coding: utf-8 -*- - -import binascii -import re - -from Crypto.Cipher import AES - -from module.plugins.Crypter import Crypter -from module.plugins.internal.CaptchaService import ReCaptcha - - -class NCryptIn(Crypter): -    __name__    = "NCryptIn" -    __type__    = "crypter" -    __version__ = "1.34" - -    __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)] - -    __description__ = """NCrypt.in decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("fragonib", "fragonib[AT]yahoo[DOT]es"), -                       ("stickell", "l.stickell@yahoo.it")] - - -    JK_KEY = "jk" -    CRYPTED_KEY = "crypted" - -    NAME_PATTERN = r'<meta name="description" content="(?P<N>[^"]+)"' - - -    def setup(self): -        self.package = None -        self.cleanedHtml = None -        self.links_source_order = ["cnl2", "rsdf", "ccf", "dlc", "web"] -        self.protection_type = None - - -    def decrypt(self, pyfile): -        # Init -        self.package = pyfile.package() -        package_links = [] -        package_name = self.package.name -        folder_name = self.package.folder - -        # Deal with single links -        if self.isSingleLink(): -            package_links.extend(self.handleSingleLink()) - -        # Deal with folders -        else: - -            # Request folder home -            self.html = self.requestFolderHome() -            self.cleanedHtml = self.removeHtmlCrap(self.html) -            if not self.isOnline(): -                self.offline() - -            # Check for folder protection -            if self.isProtected(): -                self.html = self.unlockProtection() -                self.cleanedHtml = self.removeHtmlCrap(self.html) -                self.handleErrors() - -            # Prepare package name and folder -            (package_name, folder_name) = self.getPackageInfo() - -            # Extract package links -            for link_source_type in self.links_source_order: -                package_links.extend(self.handleLinkSource(link_source_type)) -                if package_links:  # use only first source which provides links -                    break -            package_links = set(package_links) - -        # Pack and return links -        if package_links: -            self.packages = [(package_name, package_links, folder_name)] - - -    def isSingleLink(self): -        link_type = re.match(self.__pattern__, self.pyfile.url).group('TYPE') -        return link_type in ("link", "frame") - - -    def requestFolderHome(self): -        return self.load(self.pyfile.url, decode=True) - - -    def removeHtmlCrap(self, content): -        patterns = (r'(type="hidden".*?(name=".*?")?.*?value=".*?")', -                    r'display:none;">(.*?)</(div|span)>', -                    r'<div\s+class="jdownloader"(.*?)</div>', -                    r'<table class="global">(.*?)</table>', -                    r'<iframe\s+style="display:none(.*?)</iframe>') -        for pattern in patterns: -            rexpr = re.compile(pattern, re.S) -            content = re.sub(rexpr, "", content) -        return content - - -    def isOnline(self): -        if "Your folder does not exist" in self.cleanedHtml: -            self.logDebug("File not m") -            return False -        return True - - -    def isProtected(self): -        form = re.search(r'<form.*?name.*?protected.*?>(.*?)</form>', self.cleanedHtml, re.S) -        if form is not None: -            content = form.group(1) -            for keyword in ("password", "captcha"): -                if keyword in content: -                    self.protection_type = keyword -                    self.logDebug("Links are %s protected" % self.protection_type) -                    return True -        return False - - -    def getPackageInfo(self): -        m = re.search(self.NAME_PATTERN, self.html) -        if m: -            name = folder = m.group('N').strip() -            self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) -        else: -            name = self.package.name -            folder = self.package.folder -            self.logDebug("Package info not m, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) -        return name, folder - - -    def unlockProtection(self): -        postData = {} - -        form = re.search(r'<form name="protected"(.*?)</form>', self.cleanedHtml, re.S).group(1) - -        # Submit package password -        if "password" in form: -            password = self.getPassword() -            self.logDebug("Submitting password [%s] for protected links" % password) -            postData['password'] = password - -        # Resolve anicaptcha -        if "anicaptcha" in form: -            self.logDebug("Captcha protected") -            captchaUri = re.search(r'src="(/temp/anicaptcha/[^"]+)', form).group(1) -            captcha = self.decryptCaptcha("http://ncrypt.in" + captchaUri) -            self.logDebug("Captcha resolved [%s]" % captcha) -            postData['captcha'] = captcha - -        # Resolve recaptcha -        if "recaptcha" in form: -            self.logDebug("ReCaptcha protected") -            captcha_key = re.search(r'\?k=(.*?)"', form).group(1) -            self.logDebug("Resolving ReCaptcha with key [%s]" % captcha_key) -            recaptcha = ReCaptcha(self) -            response, challenge = recaptcha.challenge(captcha_key) -            postData['recaptcha_challenge_field'] = challenge -            postData['recaptcha_response_field']  = response - -        # Resolve circlecaptcha -        if "circlecaptcha" in form: -            self.logDebug("CircleCaptcha protected") -            captcha_img_url = "http://ncrypt.in/classes/captcha/circlecaptcha.php" -            coords = self.decryptCaptcha(captcha_img_url, forceUser=True, imgtype="png", result_type='positional') -            self.logDebug("Captcha resolved, coords [%s]" % str(coords)) -            postData['circle.x'] = coords[0] -            postData['circle.y'] = coords[1] - -        # Unlock protection -        postData['submit_protected'] = 'Continue to folder' -        return self.load(self.pyfile.url, post=postData, decode=True) - - -    def handleErrors(self): -        if self.protection_type == "password": -            if "This password is invalid!" in self.cleanedHtml: -                self.logDebug("Incorrect password, please set right password on 'Edit package' form and retry") -                self.fail(_("Incorrect password, please set right password on 'Edit package' form and retry")) - -        if self.protection_type == "captcha": -            if "The securitycheck was wrong!" in self.cleanedHtml: -                self.invalidCaptcha() -                self.retry() -            else: -                self.correctCaptcha() - - -    def handleLinkSource(self, link_source_type): -        # Check for JS engine -        require_js_engine = link_source_type in ("cnl2", "rsdf", "ccf", "dlc") -        if require_js_engine and not self.js: -            self.logDebug("No JS engine available, skip %s links" % link_source_type) -            return [] - -        # Select suitable handler -        if link_source_type == 'single': -            return self.handleSingleLink() -        if link_source_type == 'cnl2': -            return self.handleCNL2() -        elif link_source_type in ("rsdf", "ccf", "dlc"): -            return self.handleContainer(link_source_type) -        elif link_source_type == "web": -            return self.handleWebLinks() -        else: -            self.error(_('Unknown source type "%s"') % link_source_type) - - -    def handleSingleLink(self): -        self.logDebug("Handling Single link") -        package_links = [] - -        # Decrypt single link -        decrypted_link = self.decryptLink(self.pyfile.url) -        if decrypted_link: -            package_links.append(decrypted_link) - -        return package_links - - -    def handleCNL2(self): -        self.logDebug("Handling CNL2 links") -        package_links = [] - -        if 'cnl2_output' in self.cleanedHtml: -            try: -                (vcrypted, vjk) = self._getCipherParams() -                for (crypted, jk) in zip(vcrypted, vjk): -                    package_links.extend(self._getLinks(crypted, jk)) -            except Exception: -                self.fail(_("Unable to decrypt CNL2 links")) - -        return package_links - - -    def handleContainers(self): -        self.logDebug("Handling Container links") -        package_links = [] - -        pattern = r'/container/(rsdf|dlc|ccf)/(\w+)' -        containersLinks = re.findall(pattern, self.html) -        self.logDebug("Decrypting %d Container links" % len(containersLinks)) -        for containerLink in containersLinks: -            link = "http://ncrypt.in/container/%s/%s.%s" % (containerLink[0], containerLink[1], containerLink[0]) -            package_links.append(link) - -        return package_links - - -    def handleWebLinks(self): -        self.logDebug("Handling Web links") -        pattern = r'(http://ncrypt\.in/link-.*?=)' -        links = re.findall(pattern, self.html) - -        package_links = [] -        self.logDebug("Decrypting %d Web links" % len(links)) -        for i, link in enumerate(links): -            self.logDebug("Decrypting Web link %d, %s" % (i + 1, link)) -            decrypted_link = self.decrypt(link) -            if decrypted_link: -                package_links.append(decrypted_link) - -        return package_links - - -    def decryptLink(self, link): -        try: -            url = link.replace("link-", "frame-") -            link = self.load(url, just_header=True)['location'] -            return link -        except Exception, detail: -            self.logDebug("Error decrypting link %s, %s" % (link, detail)) - - -    def _getCipherParams(self): -        pattern = r'<input.*?name="%s".*?value="(.*?)"' - -        # Get jk -        jk_re = pattern % NCryptIn.JK_KEY -        vjk = re.findall(jk_re, self.html) - -        # Get crypted -        crypted_re = pattern % NCryptIn.CRYPTED_KEY -        vcrypted = re.findall(crypted_re, self.html) - -        # Log and return -        self.logDebug("Detected %d crypted blocks" % len(vcrypted)) -        return vcrypted, vjk - - -    def _getLinks(self, crypted, jk): -        # Get key -        jreturn = self.js.eval("%s f()" % jk) -        self.logDebug("JsEngine returns value [%s]" % jreturn) -        key = binascii.unhexlify(jreturn) - -        # Decrypt -        Key = key -        IV = key -        obj = AES.new(Key, AES.MODE_CBC, IV) -        text = obj.decrypt(crypted.decode('base64')) - -        # Extract links -        text = text.replace("\x00", "").replace("\r", "") -        links = filter(bool, text.split('\n')) - -        # Log and return -        self.logDebug("Block has %d links" % len(links)) -        return links diff --git a/module/plugins/crypter/NetfolderIn.py b/module/plugins/crypter/NetfolderIn.py deleted file mode 100644 index 62dc5c914..000000000 --- a/module/plugins/crypter/NetfolderIn.py +++ /dev/null @@ -1,73 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class NetfolderIn(SimpleCrypter): -    __name__    = "NetfolderIn" -    __type__    = "crypter" -    __version__ = "0.72" - -    __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)] - -    __description__ = """NetFolder.in decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("RaNaN", "RaNaN@pyload.org"), -                       ("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 deleted file mode 100644 index 1e280abd2..000000000 --- a/module/plugins/crypter/NosvideoCom.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class NosvideoCom(SimpleCrypter): -    __name__    = "NosvideoCom" -    __type__    = "crypter" -    __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)] - -    __description__ = """Nosvideo.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("igel", "igelkun@myopera.com")] - - -    LINK_PATTERN = r'href="(http://(?:w{3}\.)?nosupload\.com/\?d=\w+)"' -    NAME_PATTERN = r'<[tT]itle>Watch (?P<N>.+?)<' - - -getInfo = create_getInfo(NosvideoCom) diff --git a/module/plugins/crypter/OneKhDe.py b/module/plugins/crypter/OneKhDe.py deleted file mode 100644 index 3e75d97b5..000000000 --- a/module/plugins/crypter/OneKhDe.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.unescape import unescape - -from module.plugins.Crypter import Crypter - - -class OneKhDe(Crypter): -    __name__    = "OneKhDe" -    __type__    = "crypter" -    __version__ = "0.11" - -    __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)] - -    __description__ = """1kh.de decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("spoob", "spoob@pyload.org")] - - -    def __init__(self, parent): -        Crypter.__init__(self, parent) -        self.parent = parent - - -    def file_exists(self): -        """ returns True or False -        """ -        return True - - -    def proceed(self, url, location): -        url = self.parent.url -        self.html = self.load(url) -        link_ids = re.findall(r"<a id=\"DownloadLink_(\d*)\" href=\"http://1kh.de/", self.html) -        for id in link_ids: -            new_link = unescape( -                re.search("width=\"100%\" src=\"(.*)\"></iframe>", self.load("http://1kh.de/l/" + id)).group(1)) -            self.urls.append(new_link) diff --git a/module/plugins/crypter/OronComFolder.py b/module/plugins/crypter/OronComFolder.py deleted file mode 100644 index 9e06bdf32..000000000 --- a/module/plugins/crypter/OronComFolder.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class OronComFolder(DeadCrypter): -    __name__    = "OronComFolder" -    __type__    = "crypter" -    __version__ = "0.11" - -    __pattern__ = r'http://(?:www\.)?oron\.com/folder/\w+' -    __config__  = [] - -    __description__ = """Oron.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("DHMH", "webmaster@pcProfil.de")] - - -getInfo = create_getInfo(OronComFolder) diff --git a/module/plugins/crypter/PastebinCom.py b/module/plugins/crypter/PastebinCom.py deleted file mode 100644 index b3d5a4bea..000000000 --- a/module/plugins/crypter/PastebinCom.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class PastebinCom(SimpleCrypter): -    __name__    = "PastebinCom" -    __type__    = "crypter" -    __version__ = "0.03" - -    __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)] - -    __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>[^"]+)">' - - -getInfo = create_getInfo(PastebinCom) diff --git a/module/plugins/crypter/QuickshareCzFolder.py b/module/plugins/crypter/QuickshareCzFolder.py deleted file mode 100644 index 70666b55a..000000000 --- a/module/plugins/crypter/QuickshareCzFolder.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - - -class QuickshareCzFolder(Crypter): -    __name__    = "QuickshareCzFolder" -    __type__    = "crypter" -    __version__ = "0.10" - -    __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)] - -    __description__ = """Quickshare.cz folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -    FOLDER_PATTERN = r'<textarea[^>]*>(.*?)</textarea>' -    LINK_PATTERN = r'(http://www\.quickshare\.cz/\S+)' - - -    def decrypt(self, pyfile): -        html = self.load(pyfile.url) - -        m = re.search(self.FOLDER_PATTERN, html, re.S) -        if m is None: -            self.error(_("FOLDER_PATTERN not found")) -        self.urls.extend(re.findall(self.LINK_PATTERN, m.group(1))) diff --git a/module/plugins/crypter/RSLayerCom.py b/module/plugins/crypter/RSLayerCom.py deleted file mode 100644 index cc3b23bbc..000000000 --- a/module/plugins/crypter/RSLayerCom.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class RSLayerCom(DeadCrypter): -    __name__    = "RSLayerCom" -    __type__    = "crypter" -    __version__ = "0.21" - -    __pattern__ = r'http://(?:www\.)?rs-layer\.com/directory-' -    __config__  = [] - -    __description__ = """RS-Layer.com decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("hzpz", None)] - - -getInfo = create_getInfo(RSLayerCom) diff --git a/module/plugins/crypter/RelinkUs.py b/module/plugins/crypter/RelinkUs.py deleted file mode 100644 index c50481af0..000000000 --- a/module/plugins/crypter/RelinkUs.py +++ /dev/null @@ -1,293 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -import binascii -import re -import os - -from Crypto.Cipher import AES -from module.plugins.Crypter import Crypter -from module.utils import save_join - - -class RelinkUs(Crypter): -    __name__    = "RelinkUs" -    __type__    = "crypter" -    __version__ = "3.12" - -    __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)] - -    __description__ = """Relink.us decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("fragonib", "fragonib[AT]yahoo[DOT]es"), -                       ("AndroKev", "neureither.kevin@gmail.com")] - - -    PREFERRED_LINK_SOURCES = ["cnl2", "dlc", "web"] - -    OFFLINE_TOKEN = r'<title>Tattooside' - -    PASSWORD_TOKEN = r'container_password.php' -    PASSWORD_ERROR_ROKEN = r'You have entered an incorrect password' -    PASSWORD_SUBMIT_URL = r'http://www.relink.us/container_password.php' - -    CAPTCHA_TOKEN = r'container_captcha.php' -    CAPTCHA_ERROR_ROKEN = r'You have solved the captcha wrong' -    CAPTCHA_IMG_URL = r'http://www.relink.us/core/captcha/circlecaptcha.php' -    CAPTCHA_SUBMIT_URL = r'http://www.relink.us/container_captcha.php' - -    FILE_TITLE_REGEX = r'<th>Title</th><td>(.*)</td></tr>' -    FILE_NOTITLE = r'No title' - -    CNL2_FORM_REGEX = r'<form id="cnl_form-(.*?)</form>' -    CNL2_FORMINPUT_REGEX = r'<input.*?name="%s".*?value="(.*?)"' -    CNL2_JK_KEY = "jk" -    CNL2_CRYPTED_KEY = "crypted" - -    DLC_LINK_REGEX = r'<a href=".*?" class="dlc_button" target="_blank">' -    DLC_DOWNLOAD_URL = r'http://www.relink.us/download.php' - -    WEB_FORWARD_REGEX = r'getFile\(\'(.+)\'\)' -    WEB_FORWARD_URL = r'http://www.relink.us/frame.php' -    WEB_LINK_REGEX = r'<iframe name="Container" height="100%" frameborder="no" width="100%" src="(.+)"></iframe>' - - -    def setup(self): -        self.fileid  = None -        self.package = None -        self.captcha = False - - -    def decrypt(self, pyfile): -        # Init -        self.initPackage(pyfile) - -        # Request package -        self.requestPackage() - -        # Check for online -        if not self.isOnline(): -            self.offline() - -        # Check for protection -        if self.isPasswordProtected(): -            self.unlockPasswordProtection() -            self.handleErrors() - -        if self.isCaptchaProtected(): -            self.captcha = True -            self.unlockCaptchaProtection() -            self.handleErrors() - -        # Get package name and folder -        (package_name, folder_name) = self.getPackageInfo() - -        # Extract package links -        package_links = [] -        for sources in self.PREFERRED_LINK_SOURCES: -            package_links.extend(self.handleLinkSource(sources)) -            if package_links:  # use only first source which provides links -                break -        package_links = set(package_links) - -        # Pack -        if package_links: -            self.packages = [(package_name, package_links, folder_name)] - - -    def initPackage(self, pyfile): -        self.fileid = re.match(self.__pattern__, pyfile.url).group('ID') -        self.package = pyfile.package() - - -    def requestPackage(self): -        self.html = self.load(self.pyfile.url, decode=True) - - -    def isOnline(self): -        if self.OFFLINE_TOKEN in self.html: -            self.logDebug("File not found") -            return False -        return True - - -    def isPasswordProtected(self): -        if self.PASSWORD_TOKEN in self.html: -            self.logDebug("Links are password protected") -            return True - - -    def isCaptchaProtected(self): -        if self.CAPTCHA_TOKEN in self.html: -            self.logDebug("Links are captcha protected") -            return True -        return False - - -    def unlockPasswordProtection(self): -        password = self.getPassword() - -        self.logDebug("Submitting password [%s] for protected links" % password) - -        if password: -            passwd_url = self.PASSWORD_SUBMIT_URL + "?id=%s" % self.fileid -            passwd_data = {'id': self.fileid, 'password': password, 'pw': 'submit'} -            self.html = self.load(passwd_url, post=passwd_data, decode=True) - - -    def unlockCaptchaProtection(self): -        self.logDebug("Request user positional captcha resolving") -        captcha_img_url = self.CAPTCHA_IMG_URL + "?id=%s" % self.fileid -        coords = self.decryptCaptcha(captcha_img_url, forceUser=True, imgtype="png", result_type='positional') -        self.logDebug("Captcha resolved, coords [%s]" % str(coords)) -        captcha_post_url = self.CAPTCHA_SUBMIT_URL + "?id=%s" % self.fileid -        captcha_post_data = {'button.x': coords[0], 'button.y': coords[1], 'captcha': 'submit'} -        self.html = self.load(captcha_post_url, post=captcha_post_data, decode=True) - - -    def getPackageInfo(self): -        name = folder = None - -        # Try to get info from web -        m = re.search(self.FILE_TITLE_REGEX, self.html) -        if m is not None: -            title = m.group(1).strip() -            if not self.FILE_NOTITLE in title: -                name = folder = title -                self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) - -        # Fallback to defaults -        if not name or not folder: -            name = self.package.name -            folder = self.package.folder -            self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) - -        # Return package info -        return name, folder - - -    def handleErrors(self): -        if self.PASSWORD_ERROR_ROKEN in self.html: -            msg = "Incorrect password, please set right password on 'Edit package' form and retry" -            self.logDebug(msg) -            self.fail(_(msg)) - -        if self.captcha: -            if self.CAPTCHA_ERROR_ROKEN in self.html: -                self.invalidCaptcha() -                self.retry() -            else: -                self.correctCaptcha() - - -    def handleLinkSource(self, source): -        if source == 'cnl2': -            return self.handleCNL2Links() -        elif source == 'dlc': -            return self.handleDLCLinks() -        elif source == 'web': -            return self.handleWEBLinks() -        else: -            self.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: -            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 Exception: -                self.logDebug("Unable to decrypt CNL2 links") -        return package_links - - -    def handleDLCLinks(self): -        self.logDebug("Search for DLC links") -        package_links = [] -        m = re.search(self.DLC_LINK_REGEX, self.html) -        if m is not None: -            container_url = self.DLC_DOWNLOAD_URL + "?id=%s&dlc=1" % self.fileid -            self.logDebug("Downloading DLC container link [%s]" % container_url) -            try: -                dlc = self.load(container_url) -                dlc_filename = self.fileid + ".dlc" -                dlc_filepath = 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 Exception: -                self.fail(_("Unable to download DLC container")) - -        return package_links - - -    def handleWEBLinks(self): -        self.logDebug("Search for WEB links") - -        package_links = [] -        params        = re.findall(self.WEB_FORWARD_REGEX, self.html) - -        self.logDebug("Decrypting %d Web links" % len(params)) - -        for index, param in enumerate(params): -            try: -                url = self.WEB_FORWARD_URL + "?%s" % param - -                self.logDebug("Decrypting Web link %d, %s" % (index + 1, url)) - -                res  = self.load(url, decode=True) -                link = re.search(self.WEB_LINK_REGEX, res).group(1) - -                package_links.append(link) - -            except Exception, detail: -                self.logDebug("Error decrypting Web link %s, %s" % (index, detail)) - -            self.setWait(4) -            self.wait() - -        return package_links - - -    def _getCipherParams(self, cnl2_form): -        # Get jk -        jk_re = self.CNL2_FORMINPUT_REGEX % self.CNL2_JK_KEY -        vjk = re.findall(jk_re, cnl2_form, re.I) - -        # Get crypted -        crypted_re = self.CNL2_FORMINPUT_REGEX % RelinkUs.CNL2_CRYPTED_KEY -        vcrypted = re.findall(crypted_re, cnl2_form, re.I) - -        # Log and return -        self.logDebug("Detected %d crypted blocks" % len(vcrypted)) -        return vcrypted, vjk - - -    def _getLinks(self, crypted, jk): -        # Get key -        jreturn = self.js.eval("%s f()" % jk) -        self.logDebug("JsEngine returns value [%s]" % jreturn) -        key = binascii.unhexlify(jreturn) - -        # Decrypt -        Key = key -        IV = key -        obj = AES.new(Key, AES.MODE_CBC, IV) -        text = obj.decrypt(crypted.decode('base64')) - -        # Extract links -        text = text.replace("\x00", "").replace("\r", "") -        links = filter(bool, text.split('\n')) - -        # Log and return -        self.logDebug("Package has %d links" % len(links)) -        return links diff --git a/module/plugins/crypter/SafelinkingNet.py b/module/plugins/crypter/SafelinkingNet.py deleted file mode 100644 index 8e46e1e41..000000000 --- a/module/plugins/crypter/SafelinkingNet.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- - -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 - - -class SafelinkingNet(Crypter): -    __name__    = "SafelinkingNet" -    __type__    = "crypter" -    __version__ = "0.14" - -    __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)] - -    __description__ = """Safelinking.net decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("quareevo", "quareevo@arcor.de")] - - -    SOLVEMEDIA_PATTERN = "solvemediaApiKey = '([\w.-]+)';" - - -    def decrypt(self, pyfile): -        url = pyfile.url - -        if re.match(self.__pattern__, url).group(1) == "d": - -            header = self.load(url, just_header=True) -            if 'location' in header: -                self.urls = [header['location']] -            else: -                self.error(_("Couldn't find forwarded Link")) - -        else: -            postData = {"post-protect": "1"} - -            self.html = self.load(url) - -            if "link-password" in self.html: -                postData['link-password'] = self.getPassword() - -            if "altcaptcha" in self.html: -                for _i in xrange(5): -                    m = re.search(self.SOLVEMEDIA_PATTERN, self.html) -                    if m: -                        captchaKey = m.group(1) -                        captcha = SolveMedia(self) -                        captchaProvider = "Solvemedia" -                    else: -                        self.fail(_("Error parsing captcha")) - -                    response, challenge = captcha.challenge(captchaKey) -                    postData['adcopy_challenge'] = challenge -                    postData['adcopy_response']  = response - -                    self.html = self.load(url, post=postData) -                    if "The password you entered was incorrect" in self.html: -                        self.fail(_("Incorrect Password")) -                    if not "The CAPTCHA code you entered was wrong" in self.html: -                        break - -            pyfile.package().password = "" -            soup = BeautifulSoup(self.html) -            scripts = soup.findAll("script") -            for s in scripts: -                if "d_links" in s.text: -                    break -            m = re.search('d_links":(\[.*?\])', s.text) -            if m: -                linkDict = json_loads(m.group(1)) -                for link in linkDict: -                    if not "http://" in link['full']: -                        self.urls.append("https://safelinking.net/d/" + link['full']) -                    else: -                        self.urls.append(link['full']) diff --git a/module/plugins/crypter/SecuredIn.py b/module/plugins/crypter/SecuredIn.py deleted file mode 100644 index cbfa919ac..000000000 --- a/module/plugins/crypter/SecuredIn.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class SecuredIn(DeadCrypter): -    __name__    = "SecuredIn" -    __type__    = "crypter" -    __version__ = "0.21" - -    __pattern__ = r'http://(?:www\.)?secured\.in/download-[\d]+-\w{8}\.html' -    __config__  = [] - -    __description__ = """Secured.in decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("mkaay", "mkaay@mkaay.de")] - - -getInfo = create_getInfo(SecuredIn) diff --git a/module/plugins/crypter/SexuriaCom.py b/module/plugins/crypter/SexuriaCom.py deleted file mode 100644 index 3c952fd6b..000000000 --- a/module/plugins/crypter/SexuriaCom.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.Crypter import Crypter - - -class SexuriaCom(Crypter): -    __name__    = "SexuriaCom" -    __type__    = "crypter" -    __version__ = "0.01" - -    __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)] - -    __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) - - -    def decrypt(self, pyfile): -        # Init -        self.pyfile = pyfile -        self.package = pyfile.package() - -        # Get package links -        package_name, self.links, folder_name, package_pwd = self.decryptLinks(self.pyfile.url) -        self.packages = [(package_name, self.links, folder_name)] - - -    def decryptLinks(self, url): -        linklist = [] -        name = self.package.name -        folder = self.package.folder -        password = None - -        if re.match(self.PATTERN_SUPPORTED_MAIN, url): -            # Processing main page -            html = self.load(url) -            links = re.findall(self.PATTERN_DL_LINK_PAGE, html) -            for link in links: -                linklist.append("http://sexuria.com/v1/" + link) - -        elif re.match(self.PATTERN_SUPPORTED_REDIRECT, url): -            # Processing direct redirect link (out.php), redirecting to main page -            id = re.search(self.PATTERN_SUPPORTED_REDIRECT, url).group('ID') -            if id: -                linklist.append("http://sexuria.com/v1/Pornos_Kostenlos_liebe_%s.html" % id) - -        elif re.match(self.PATTERN_SUPPORTED_CRYPT, url): -            # Extract info from main file -            id = re.search(self.PATTERN_SUPPORTED_CRYPT, url).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() -            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: -                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) -            if len(links) == 0: -                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) -                    else: -                        linklist.append(finallink) - -        # Debug log -        self.logDebug("%d supported links" % len(linklist)) -        for i, link in enumerate(linklist): -            self.logDebug("Supported link %d, %s" % (i + 1, link)) - -        return name, linklist, folder, password diff --git a/module/plugins/crypter/ShareLinksBiz.py b/module/plugins/crypter/ShareLinksBiz.py deleted file mode 100644 index 00a037b2e..000000000 --- a/module/plugins/crypter/ShareLinksBiz.py +++ /dev/null @@ -1,279 +0,0 @@ -# -*- coding: utf-8 -*- - -import binascii -import re - -from Crypto.Cipher import AES -from module.plugins.Crypter import Crypter - - -class ShareLinksBiz(Crypter): -    __name__    = "ShareLinksBiz" -    __type__    = "crypter" -    __version__ = "1.14" - -    __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)] - -    __description__ = """Share-Links.biz decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("fragonib", "fragonib[AT]yahoo[DOT]es")] - - -    def setup(self): -        self.baseUrl = None -        self.fileId = None -        self.package = None -        self.captcha = False - - -    def decrypt(self, pyfile): -        # Init -        self.initFile(pyfile) - -        # Request package -        url = self.baseUrl + '/' + self.fileId -        self.html = self.load(url, decode=True) - -        # Unblock server (load all images) -        self.unblockServer() - -        # Check for protection -        if self.isPasswordProtected(): -            self.unlockPasswordProtection() -            self.handleErrors() - -        if self.isCaptchaProtected(): -            self.captcha = True -            self.unlockCaptchaProtection() -            self.handleErrors() - -        # Extract package links -        package_links = [] -        package_links.extend(self.handleWebLinks()) -        package_links.extend(self.handleContainers()) -        package_links.extend(self.handleCNL2()) -        package_links = set(package_links) - -        # Get package info -        package_name, package_folder = self.getPackageInfo() - -        # Pack -        self.packages = [(package_name, package_links, package_folder)] - - -    def initFile(self, pyfile): -        url = pyfile.url -        if 's2l.biz' in url: -            url = self.load(url, just_header=True)['location'] -        self.baseUrl = "http://www.%s.biz" % re.match(self.__pattern__, url).group(1) -        self.fileId = re.match(self.__pattern__, url).group('ID') -        self.package = pyfile.package() - - -    def isOnline(self): -        if "No usable content was found" in self.html: -            self.logDebug("File not found") -            return False -        return True - - -    def isPasswordProtected(self): -        if re.search(r'''<form.*?id="passwordForm".*?>''', self.html): -            self.logDebug("Links are protected") -            return True -        return False - - -    def isCaptchaProtected(self): -        if '<map id="captchamap"' in self.html: -            self.logDebug("Links are captcha protected") -            return True -        return False - - -    def unblockServer(self): -        imgs = re.findall(r"(/template/images/.*?\.gif)", self.html) -        for img in imgs: -            self.load(self.baseUrl + img) - - -    def unlockPasswordProtection(self): -        password = self.getPassword() -        self.logDebug("Submitting password [%s] for protected links" % password) -        post = {"password": password, 'login': 'Submit form'} -        url = self.baseUrl + '/' + self.fileId -        self.html = self.load(url, post=post, decode=True) - - -    def unlockCaptchaProtection(self): -        # Get captcha map -        captchaMap = self._getCaptchaMap() -        self.logDebug("Captcha map with [%d] positions" % len(captchaMap.keys())) - -        # Request user for captcha coords -        m = re.search(r'<img src="/captcha.gif\?d=(.*?)&PHPSESSID=(.*?)&legend=1"', self.html) -        captchaUrl = self.baseUrl + '/captcha.gif?d=%s&PHPSESSID=%s' % (m.group(1), m.group(2)) -        self.logDebug("Waiting user for correct position") -        coords = self.decryptCaptcha(captchaUrl, forceUser=True, imgtype="gif", result_type='positional') -        self.logDebug("Captcha resolved, coords [%s]" % str(coords)) - -        # Resolve captcha -        href = self._resolveCoords(coords, captchaMap) -        if href is None: -            self.invalidCaptcha() -            self.retry(wait_time=5) -        url = self.baseUrl + href -        self.html = self.load(url, decode=True) - - -    def _getCaptchaMap(self): -        mapp = {} -        for m in re.finditer(r'<area shape="rect" coords="(.*?)" href="(.*?)"', self.html): -            rect = eval('(' + m.group(1) + ')') -            href = m.group(2) -            mapp[rect] = href -        return mapp - - -    def _resolveCoords(self, coords, captchaMap): -        x, y = coords -        for rect, href in captchaMap.iteritems(): -            x1, y1, x2, y2 = rect -            if (x >= x1 and x <= x2) and (y >= y1 and y <= y2): -                return href - - -    def handleErrors(self): -        if "The inserted password was wrong" in self.html: -            self.logDebug("Incorrect password, please set right password on 'Edit package' form and retry") -            self.fail(_("Incorrect password, please set right password on 'Edit package' form and retry")) - -        if self.captcha: -            if "Your choice was wrong" in self.html: -                self.invalidCaptcha() -                self.retry(wait_time=5) -            else: -                self.correctCaptcha() - - -    def getPackageInfo(self): -        name = folder = None - -        # Extract from web package header -        title_re = r'<h2><img.*?/>(.*)</h2>' -        m = re.search(title_re, self.html, re.S) -        if m is not None: -            title = m.group(1).strip() -            if 'unnamed' not in title: -                name = folder = title -                self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) - -        # Fallback to defaults -        if not name or not folder: -            name = self.package.name -            folder = self.package.folder -            self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) - -        # Return package info -        return name, folder - - -    def handleWebLinks(self): -        package_links = [] -        self.logDebug("Handling Web links") - -        #@TODO: Gather paginated web links -        pattern = r'javascript:_get\(\'(.*?)\', \d+, \'\'\)' -        ids = re.findall(pattern, self.html) -        self.logDebug("Decrypting %d Web links" % len(ids)) -        for i, ID in enumerate(ids): -            try: -                self.logDebug("Decrypting Web link %d, [%s]" % (i + 1, ID)) - -                dwLink = self.baseUrl + "/get/lnk/" + ID -                res = self.load(dwLink) - -                code = re.search(r'frm/(\d+)', res).group(1) -                fwLink = self.baseUrl + "/get/frm/" + code -                res = self.load(fwLink) - -                jscode = re.search(r'<script language="javascript">\s*eval\((.*)\)\s*</script>', res, re.S).group(1) -                jscode = self.js.eval("f = %s" % jscode) -                jslauncher = "window=''; parent={frames:{Main:{location:{href:''}}},location:''}; %s; parent.frames.Main.location.href" - -                dlLink = self.js.eval(jslauncher % jscode) - -                self.logDebug("JsEngine returns value [%s] for redirection link" % dlLink) - -                package_links.append(dlLink) -            except Exception, detail: -                self.logDebug("Error decrypting Web link [%s], %s" % (ID, detail)) -        return package_links - - -    def handleContainers(self): -        package_links = [] -        self.logDebug("Handling Container links") - -        pattern = r'javascript:_get\(\'(.*?)\', 0, \'(rsdf|ccf|dlc)\'\)' -        containersLinks = re.findall(pattern, self.html) -        self.logDebug("Decrypting %d Container links" % len(containersLinks)) -        for containerLink in containersLinks: -            link = "%s/get/%s/%s" % (self.baseUrl, containerLink[1], containerLink[0]) -            package_links.append(link) -        return package_links - - -    def handleCNL2(self): -        package_links = [] -        self.logDebug("Handling CNL2 links") - -        if '/lib/cnl2/ClicknLoad.swf' in self.html: -            try: -                (crypted, jk) = self._getCipherParams() -                package_links.extend(self._getLinks(crypted, jk)) -            except Exception: -                self.fail(_("Unable to decrypt CNL2 links")) -        return package_links - - -    def _getCipherParams(self): -        # Request CNL2 -        code   = re.search(r'ClicknLoad.swf\?code=(.*?)"', self.html).group(1) -        url    = "%s/get/cnl2/%s" % (self.baseUrl, code) -        res    = self.load(url) -        params = res.split(";;") - -        # Get jk -        strlist = list(params[1].decode('base64')) -        jk      = ''.join(strlist[::-1]) - -        # Get crypted -        strlist = list(params[2].decode('base64')) -        crypted = ''.join(strlist[::-1]) - -        # Log and return -        return crypted, jk - - -    def _getLinks(self, crypted, jk): -        # Get key -        jreturn = self.js.eval("%s f()" % jk) -        self.logDebug("JsEngine returns value [%s]" % jreturn) -        key = binascii.unhexlify(jreturn) - -        # Decrypt -        Key = key -        IV = key -        obj = AES.new(Key, AES.MODE_CBC, IV) -        text = obj.decrypt(crypted.decode('base64')) - -        # Extract links -        text = text.replace("\x00", "").replace("\r", "") -        links = filter(bool, text.split('\n')) - -        # Log and return -        self.logDebug("Block has %d links" % len(links)) -        return links diff --git a/module/plugins/crypter/SharingmatrixComFolder.py b/module/plugins/crypter/SharingmatrixComFolder.py deleted file mode 100644 index e16bdf814..000000000 --- a/module/plugins/crypter/SharingmatrixComFolder.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class SharingmatrixComFolder(DeadCrypter): -    __name__    = "SharingmatrixComFolder" -    __type__    = "crypter" -    __version__ = "0.01" - -    __pattern__ = r'http://(?:www\.)?sharingmatrix\.com/folder/\w+' - -    __description__ = """Sharingmatrix.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -getInfo = create_getInfo(SharingmatrixComFolder) diff --git a/module/plugins/crypter/SpeedLoadOrgFolder.py b/module/plugins/crypter/SpeedLoadOrgFolder.py deleted file mode 100644 index ddde7dec2..000000000 --- a/module/plugins/crypter/SpeedLoadOrgFolder.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class SpeedLoadOrgFolder(DeadCrypter): -    __name__    = "SpeedLoadOrgFolder" -    __type__    = "crypter" -    __version__ = "0.30" - -    __pattern__ = r'http://(?:www\.)?speedload\.org/(\d+~f$|folder/\d+/)' -    __config__  = [] - -    __description__ = """Speedload decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it")] - - -getInfo = create_getInfo(SpeedLoadOrgFolder) diff --git a/module/plugins/crypter/StealthTo.py b/module/plugins/crypter/StealthTo.py deleted file mode 100644 index 5173421f1..000000000 --- a/module/plugins/crypter/StealthTo.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class StealthTo(DeadCrypter): -    __name__    = "StealthTo" -    __type__    = "crypter" -    __version__ = "0.20" - -    __pattern__ = r'http://(?:www\.)?stealth\.to/folder/.+' -    __config__  = [] - -    __description__ = """Stealth.to decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("spoob", "spoob@pyload.org")] - - -getInfo = create_getInfo(StealthTo) diff --git a/module/plugins/crypter/TnyCz.py b/module/plugins/crypter/TnyCz.py deleted file mode 100644 index d36128550..000000000 --- a/module/plugins/crypter/TnyCz.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - -import re - - -class TnyCz(SimpleCrypter): -    __name__    = "TnyCz" -    __type__    = "crypter" -    __version__ = "0.03" - -    __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)] - -    __description__ = """Tny.cz decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    NAME_PATTERN = r'<title>(?P<N>.+) - .+</title>' - - -    def getLinks(self): -        m = re.search(r'<a id=\'save_paste\' href="(.+save\.php\?hash=.+)">', self.html) -        return re.findall(".+", self.load(m.group(1), decode=True)) if m else None - - -getInfo = create_getInfo(TnyCz) diff --git a/module/plugins/crypter/TrailerzoneInfo.py b/module/plugins/crypter/TrailerzoneInfo.py deleted file mode 100644 index 10780dd45..000000000 --- a/module/plugins/crypter/TrailerzoneInfo.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class TrailerzoneInfo(DeadCrypter): -    __name__    = "TrailerzoneInfo" -    __type__    = "crypter" -    __version__ = "0.03" - -    __pattern__ = r'http://(?:www\.)?trailerzone\.info/.+' -    __config__  = [] - -    __description__ = """TrailerZone.info decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("godofdream", "soilfiction@gmail.com")] - - -getInfo = create_getInfo(TrailerzoneInfo) diff --git a/module/plugins/crypter/TurbobitNetFolder.py b/module/plugins/crypter/TurbobitNetFolder.py deleted file mode 100644 index c6734c997..000000000 --- a/module/plugins/crypter/TurbobitNetFolder.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo -from module.common.json_layer import json_loads - - -class TurbobitNetFolder(SimpleCrypter): -    __name__    = "TurbobitNetFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """Turbobit.net folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("stickell", "l.stickell@yahoo.it"), -                       ("Walter Purcaro", "vuolter@gmail.com")] - - -    NAME_PATTERN = r'src=\'/js/lib/grid/icon/folder.png\'> <span>(?P<N>.+?)</span>' - - -    def _getLinks(self, id, page=1): -        gridFile = self.load("http://turbobit.net/downloadfolder/gridFile", -                             get={"rootId": id, "rows": 200, "page": page}, decode=True) -        grid = json_loads(gridFile) - -        if grid['rows']: -            for i in grid['rows']: -                yield i['id'] -            for id in self._getLinks(id, page + 1): -                yield id -        else: -            return - - -    def getLinks(self): -        id = re.match(self.__pattern__, self.pyfile.url).group('ID') -        fixurl = lambda id: "http://turbobit.net/%s.html" % id -        return map(fixurl, self._getLinks(id)) - - -getInfo = create_getInfo(TurbobitNetFolder) diff --git a/module/plugins/crypter/TusfilesNetFolder.py b/module/plugins/crypter/TusfilesNetFolder.py deleted file mode 100644 index cb8efc9a8..000000000 --- a/module/plugins/crypter/TusfilesNetFolder.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- - -import math -import re -from urlparse import urljoin - -from module.plugins.internal.XFSCrypter import XFSCrypter, create_getInfo - - -class TusfilesNetFolder(XFSCrypter): -    __name__    = "TusfilesNetFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """Tusfiles.net folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com"), -                       ("stickell", "l.stickell@yahoo.it")] - - -    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) - - -    def handlePages(self, pyfile): -        pages = re.search(self.PAGES_PATTERN, self.html) -        if pages: -            pages = int(math.ceil(int(pages.group('pages')) / 25.0)) -        else: -            return - -        for p in xrange(2, pages + 1): -            self.html = self.loadPage(p) -            self.links += self.getLinks() - - -getInfo = create_getInfo(TusfilesNetFolder) diff --git a/module/plugins/crypter/UlozToFolder.py b/module/plugins/crypter/UlozToFolder.py deleted file mode 100644 index a1f3ed5ea..000000000 --- a/module/plugins/crypter/UlozToFolder.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - - -class UlozToFolder(Crypter): -    __name__    = "UlozToFolder" -    __type__    = "crypter" -    __version__ = "0.20" - -    __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)] - -    __description__ = """Uloz.to folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -    FOLDER_PATTERN = r'<ul class="profile_files">(.*?)</ul>' -    LINK_PATTERN = r'<br /><a href="/([^"]+)">[^<]+</a>' -    NEXT_PAGE_PATTERN = r'<a class="next " href="/([^"]+)"> </a>' - - -    def decrypt(self, pyfile): -        html = self.load(pyfile.url) - -        new_links = [] -        for i in xrange(1, 100): -            self.logInfo(_("Fetching links from page %i") % i) -            m = re.search(self.FOLDER_PATTERN, html, re.S) -            if m is None: -                self.error(_("FOLDER_PATTERN not found")) - -            new_links.extend(re.findall(self.LINK_PATTERN, m.group(1))) -            m = re.search(self.NEXT_PAGE_PATTERN, html) -            if m: -                html = self.load("http://ulozto.net/" + m.group(1)) -            else: -                break -        else: -            self.logInfo(_("Limit of 99 pages reached, aborting")) - -        if new_links: -            self.urls = [map(lambda s: "http://ulozto.net/%s" % s, new_links)] diff --git a/module/plugins/crypter/UploadableChFolder.py b/module/plugins/crypter/UploadableChFolder.py deleted file mode 100644 index 22f9ca2ed..000000000 --- a/module/plugins/crypter/UploadableChFolder.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class UploadableChFolder(SimpleCrypter): -    __name__    = "UploadableChFolder" -    __type__    = "crypter" -    __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)] - -    __description__ = """ Uploadable.ch folder decrypter plugin """ -    __license__     = "GPLv3" -    __authors__     = [("guidobelix", "guidobelix@hotmail.it"), -                       ("Walter Purcaro", "vuolter@gmail.com")] - - -    LINK_PATTERN = r'"(.+?)" class="icon_zipfile">' -    NAME_PATTERN = r'<div class="folder"><span> </span>(?P<N>.+?)</div>' -    OFFLINE_PATTERN = r'We are sorry... The URL you entered cannot be found on the server.' -    TEMP_OFFLINE_PATTERN = r'<div class="icon_err">' - - -getInfo = create_getInfo(UploadableChFolder) diff --git a/module/plugins/crypter/UploadedToFolder.py b/module/plugins/crypter/UploadedToFolder.py deleted file mode 100644 index 0a71add70..000000000 --- a/module/plugins/crypter/UploadedToFolder.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from urlparse import urljoin - -from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo - - -class UploadedToFolder(SimpleCrypter): -    __name__    = "UploadedToFolder" -    __type__    = "crypter" -    __version__ = "0.42" - -    __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)] - -    __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")) - -        plain_link = urljoin("http://uploaded.net/", m.group(1)) -        return self.load(plain_link).split('\n')[:-1] - - -getInfo = create_getInfo(UploadedToFolder) diff --git a/module/plugins/crypter/WiiReloadedOrg.py b/module/plugins/crypter/WiiReloadedOrg.py deleted file mode 100644 index c3c5b8222..000000000 --- a/module/plugins/crypter/WiiReloadedOrg.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class WiiReloadedOrg(DeadCrypter): -    __name__    = "WiiReloadedOrg" -    __type__    = "crypter" -    __version__ = "0.11" - -    __pattern__ = r'http://(?:www\.)?wii-reloaded\.org/protect/get\.php\?i=.+' -    __config__  = [] - -    __description__ = """Wii-Reloaded.org decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("hzpz", None)] - - -getInfo = create_getInfo(WiiReloadedOrg) diff --git a/module/plugins/crypter/WuploadComFolder.py b/module/plugins/crypter/WuploadComFolder.py deleted file mode 100644 index 873c71fad..000000000 --- a/module/plugins/crypter/WuploadComFolder.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.DeadCrypter import DeadCrypter, create_getInfo - - -class WuploadComFolder(DeadCrypter): -    __name__    = "WuploadComFolder" -    __type__    = "crypter" -    __version__ = "0.01" - -    __pattern__ = r'http://(?:www\.)?wupload\.com/folder/\w+' - -    __description__ = """Wupload.com folder decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("zoidberg", "zoidberg@mujmail.cz")] - - -getInfo = create_getInfo(WuploadComFolder) diff --git a/module/plugins/crypter/XFileSharingProFolder.py b/module/plugins/crypter/XFileSharingProFolder.py deleted file mode 100644 index 1d001772d..000000000 --- a/module/plugins/crypter/XFileSharingProFolder.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.XFSCrypter import XFSCrypter, create_getInfo - - -class XFileSharingProFolder(XFSCrypter): -    __name__    = "XFileSharingProFolder" -    __type__    = "crypter" -    __version__ = "0.04" - -    __pattern__ = r'^unmatchable$' -    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True), -                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] - -    __description__ = """XFileSharingPro dummy folder decrypter plugin for hook""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    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()))) - - -    def init(self): -        super(XFileSharingProFolder, self).init() - -        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 - -        account = self.core.accountManager.getAccountPlugin(self.HOSTER_NAME) - -        if account and account.canUse(): -            self.account = account - -        elif self.account: -            self.account.HOSTER_DOMAIN = self.HOSTER_DOMAIN - -        else: -            return - -        self.user, data = self.account.selectAccount() -        self.req        = self.account.getAccountRequest(self.user) -        self.premium    = self.account.isPremium(self.user) - - -getInfo = create_getInfo(XFileSharingProFolder) diff --git a/module/plugins/crypter/XupPl.py b/module/plugins/crypter/XupPl.py deleted file mode 100644 index f2ecbee5a..000000000 --- a/module/plugins/crypter/XupPl.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.Crypter import Crypter - - -class XupPl(Crypter): -    __name__    = "XupPl" -    __type__    = "crypter" -    __version__ = "0.10" - -    __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)] - -    __description__ = """Xup.pl decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("z00nx", "z00nx0@gmail.com")] - - -    def decrypt(self, pyfile): -        header = self.load(pyfile.url, just_header=True) -        if 'location' in header: -            self.urls = [header['location']] -        else: -            self.fail(_("Unable to find link")) diff --git a/module/plugins/crypter/YoutubeBatch.py b/module/plugins/crypter/YoutubeBatch.py deleted file mode 100644 index 40b4eedd2..000000000 --- a/module/plugins/crypter/YoutubeBatch.py +++ /dev/null @@ -1,148 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from urlparse import urljoin - -from module.common.json_layer import json_loads -from module.plugins.Crypter import Crypter -from module.utils import save_join - - -class YoutubeBatch(Crypter): -    __name__    = "YoutubeBatch" -    __type__    = "crypter" -    __version__ = "1.01" - -    __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)] - -    __description__ = """Youtube.com channel & playlist decrypter plugin""" -    __license__     = "GPLv3" -    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] - - -    API_KEY = "AIzaSyCKnWLNlkX-L4oD1aEzqqhRw1zczeD6_k0" - - -    def api_response(self, ref, req): -        req.update({"key": self.API_KEY}) -        url  = urljoin("https://www.googleapis.com/youtube/v3/", ref) -        html = self.load(url, get=req) -        return json_loads(html) - - -    def getChannel(self, user): -        channels = self.api_response("channels", {"part": "id,snippet,contentDetails", "forUsername": user, "maxResults": "50"}) -        if channels['items']: -            channel = channels['items'][0] -            return {"id": channel['id'], -                    "title": channel['snippet']['title'], -                    "relatedPlaylists": channel['contentDetails']['relatedPlaylists'], -                    "user": user}  # One lone channel for user? - - -    def getPlaylist(self, p_id): -        playlists = self.api_response("playlists", {"part": "snippet", "id": p_id}) -        if playlists['items']: -            playlist = playlists['items'][0] -            return {"id": p_id, -                    "title": playlist['snippet']['title'], -                    "channelId": playlist['snippet']['channelId'], -                    "channelTitle": playlist['snippet']['channelTitle']} - - -    def _getPlaylists(self, id, token=None): -        req = {"part": "id", "maxResults": "50", "channelId": id} -        if token: -            req.update({"pageToken": token}) - -        playlists = self.api_response("playlists", req) - -        for playlist in playlists['items']: -            yield playlist['id'] - -        if "nextPageToken" in playlists: -            for item in self._getPlaylists(id, playlists['nextPageToken']): -                yield item - - -    def getPlaylists(self, ch_id): -        return map(self.getPlaylist, self._getPlaylists(ch_id)) - - -    def _getVideosId(self, id, token=None): -        req = {"part": "contentDetails", "maxResults": "50", "playlistId": id} -        if token: -            req.update({"pageToken": token}) - -        playlist = self.api_response("playlistItems", req) - -        for item in playlist['items']: -            yield item['contentDetails']['videoId'] - -        if "nextPageToken" in playlist: -            for item in self._getVideosId(id, playlist['nextPageToken']): -                yield item - - -    def getVideosId(self, p_id): -        return list(self._getVideosId(p_id)) - - -    def decrypt(self, pyfile): -        m = re.match(self.__pattern__, pyfile.url) -        m_id = m.group('ID') -        m_type = m.group('TYPE') - -        if m_type == "user": -            self.logDebug("Url recognized as Channel") -            user = m_id -            channel = self.getChannel(user) - -            if channel: -                playlists = self.getPlaylists(channel['id']) -                self.logDebug("%s playlist\s found on channel \"%s\"" % (len(playlists), channel['title'])) - -                relatedplaylist = {p_name: self.getPlaylist(p_id) for p_name, p_id in channel['relatedPlaylists'].iteritems()} -                self.logDebug("Channel's related playlists found = %s" % relatedplaylist.keys()) - -                relatedplaylist['uploads']['title'] = "Unplaylisted videos" -                relatedplaylist['uploads']['checkDups'] = True  #: checkDups flag - -                for p_name, p_data in relatedplaylist.iteritems(): -                    if self.getConfig(p_name): -                        p_data['title'] += " of " + user -                        playlists.append(p_data) -            else: -                playlists = [] -        else: -            self.logDebug("Url recognized as Playlist") -            playlists = [self.getPlaylist(m_id)] - -        if not playlists: -            self.fail(_("No playlist available")) - -        addedvideos = [] -        urlize = lambda x: "https://www.youtube.com/watch?v=" + x -        for p in playlists: -            p_name = p['title'] -            p_videos = self.getVideosId(p['id']) -            p_folder = save_join(self.config['general']['download_folder'], p['channelTitle'], p_name) -            self.logDebug("%s video\s found on playlist \"%s\"" % (len(p_videos), p_name)) - -            if not p_videos: -                continue -            elif "checkDups" in p: -                p_urls = [urlize(v_id) for v_id in p_videos if v_id not in addedvideos] -                self.logDebug("%s video\s available on playlist \"%s\" after duplicates cleanup" % (len(p_urls), p_name)) -            else: -                p_urls = map(urlize, p_videos) - -            self.packages.append((p_name, p_urls, p_folder))  #: folder is NOT recognized by pyload 0.4.9! - -            addedvideos.extend(p_videos) diff --git a/module/plugins/crypter/__init__.py b/module/plugins/crypter/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/module/plugins/crypter/__init__.py +++ /dev/null | 
