From 80527abdc69f3fb4c5cf5518b215594146cde0f5 Mon Sep 17 00:00:00 2001 From: zoidberg10 Date: Sun, 30 Sep 2012 18:44:20 +0200 Subject: filebeer folder crypter, multihoster unload fix --- module/plugins/crypter/FilebeerInfoFolder.py | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 module/plugins/crypter/FilebeerInfoFolder.py (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/FilebeerInfoFolder.py b/module/plugins/crypter/FilebeerInfoFolder.py new file mode 100644 index 000000000..f45144f14 --- /dev/null +++ b/module/plugins/crypter/FilebeerInfoFolder.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +import re +from module.plugins.Crypter import Crypter + +class FilebeerInfoFolder(Crypter): + __name__ = "FilebeerInfoFolder" + __type__ = "crypter" + __pattern__ = r"http://(?:www\.)?filebeer\.info/(\d+~f).*" + __version__ = "0.01" + __description__ = """Filebeer.info Folder Plugin""" + __author_name__ = ("zoidberg") + __author_mail__ = ("zoidberg@mujmail.cz") + + LINK_PATTERN = r'' + PAGE_COUNT_PATTERN = r'

\s*Total Pages (\d+)' + + def decrypt(self, pyfile): + pyfile.url = re.sub(self.__pattern__, r'http://filebeer.info/\1?page=1', pyfile.url) + html = self.load(pyfile.url) + + page_count = int(re.search(self.PAGE_COUNT_PATTERN, html).group(1)) + new_links = [] + + for i in range(1, page_count + 1): + self.logInfo("Fetching links from page %i" % i) + new_links.extend(re.findall(self.LINK_PATTERN, html)) + + if i < page_count: + html = self.load("%s?page=%d" % (pyfile.url, i+1)) + + if new_links: + self.core.files.addLinks(new_links, self.pyfile.package().id) + else: + self.fail('Could not extract any links') \ No newline at end of file -- cgit v1.2.3 From 611034705079e9c0e432efbabbadb5a9292a383f Mon Sep 17 00:00:00 2001 From: godofdream Date: Wed, 3 Oct 2012 19:00:25 +0200 Subject: Fix DuckcryptInfo and NowDownloadEu --- module/plugins/crypter/DuckCryptInfo.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/DuckCryptInfo.py b/module/plugins/crypter/DuckCryptInfo.py index 6e7166ff8..4886d24db 100644 --- a/module/plugins/crypter/DuckCryptInfo.py +++ b/module/plugins/crypter/DuckCryptInfo.py @@ -8,7 +8,7 @@ class DuckCryptInfo(Crypter): __name__ = "DuckCryptInfo" __type__ = "container" __pattern__ = r"http://(?:www\.)?duckcrypt.info/(folder|wait|link)/(\w+)/?(\w*)" - __version__ = "0.01" + __version__ = "0.02" __description__ = """DuckCrypt.Info Container Plugin""" __author_name__ = ("godofdream") __author_mail__ = ("soilfiction@gmail.com") @@ -39,12 +39,13 @@ class DuckCryptInfo(Crypter): self.logDebug("Redirectet to " + str(found.group(0))) src = self.load(str(found.group(0))) soup = BeautifulSoup(src) - cryptlinks = soup.find("div", attrs={"class": "folderbox"}).findAll("a") + cryptlinks = soup.findAll("div", attrs={"class": "folderbox"}) self.logDebug("Redirectet to " + str(cryptlinks)) if not cryptlinks: self.fail('no links found - (Plugin out of date?)') for clink in cryptlinks: - self.handleLink(clink['href']) + if clink.find("a"): + self.handleLink(clink.find("a")['href']) def handleLink(self, url): src = self.load(url) -- cgit v1.2.3 From e195f96d1a4d31a1e59d7f23971edd14a1edd220 Mon Sep 17 00:00:00 2001 From: zoidberg10 Date: Sat, 27 Oct 2012 01:57:45 +0200 Subject: youtube - add 3D formats, update playlist crypter --- module/plugins/crypter/YoutubeBatch.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/YoutubeBatch.py b/module/plugins/crypter/YoutubeBatch.py index b48026654..88906d0db 100644 --- a/module/plugins/crypter/YoutubeBatch.py +++ b/module/plugins/crypter/YoutubeBatch.py @@ -8,8 +8,8 @@ from module.plugins.Crypter import Crypter class YoutubeBatch(Crypter): __name__ = "YoutubeBatch" __type__ = "container" - __pattern__ = r"http://(?:www\.)?(?:de\.)?\youtube\.com/(?:user/.*?/user/(?P.{16})|(?:.*?feature=PlayList\&|view_play_list\?)p=(?P.{16}))" - __version__ = "0.9" + __pattern__ = r"http://(?:[^/]*?)youtube\.com/(?:(?:view_play_list|playlist|.*?feature=PlayList).*?(?:[\?&]list|p=)|user/.*?/user/)(\w+)" + __version__ = "0.91" __description__ = """Youtube.com Channel Download Plugin""" __author_name__ = ("RaNaN", "Spoob") __author_mail__ = ("RaNaN@pyload.org", "spoob@pyload.org") @@ -17,7 +17,7 @@ class YoutubeBatch(Crypter): def setup(self): compile_id = re.compile(self.__pattern__) match_id = compile_id.match(self.pyfile.url) - self.playlist = match_id.group(match_id.lastgroup) + self.playlist = match_id.group(1) def file_exists(self): if "User not found" in self.req.load("http://gdata.youtube.com/feeds/api/playlists/%s?v=2" % self.playlist): -- cgit v1.2.3 From 1064072f30ee3e71b6f8034f882a7123844fad2c Mon Sep 17 00:00:00 2001 From: zoidberg10 Date: Thu, 1 Nov 2012 21:58:49 +0100 Subject: update lix.in crypter - closed #707, hotfile.com - decode, enable checksum --- module/plugins/crypter/LixIn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/LixIn.py b/module/plugins/crypter/LixIn.py index 379b10764..1ed5510fd 100644 --- a/module/plugins/crypter/LixIn.py +++ b/module/plugins/crypter/LixIn.py @@ -9,12 +9,12 @@ class LixIn(Crypter): __name__ = "LixIn" __type__ = "container" __pattern__ = r"http://(www.)?lix.in/(?P.*)" - __version__ = "0.21" + __version__ = "0.22" __description__ = """Lix.in Container Plugin""" __author_name__ = ("spoob") __author_mail__ = ("spoob@pyload.org") - CAPTCHA_PATTERN=' Date: Thu, 1 Nov 2012 22:46:10 +0100 Subject: sharelinks.biz - closed #697 (but see #704), remove dead hosters --- module/plugins/crypter/FilesonicComFolder.py | 31 --------------------------- module/plugins/crypter/MegauploadComFolder.py | 22 ------------------- module/plugins/crypter/ShareLinksBiz.py | 8 +++---- 3 files changed, 4 insertions(+), 57 deletions(-) delete mode 100644 module/plugins/crypter/FilesonicComFolder.py delete mode 100644 module/plugins/crypter/MegauploadComFolder.py (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/FilesonicComFolder.py b/module/plugins/crypter/FilesonicComFolder.py deleted file mode 100644 index b967a74a1..000000000 --- a/module/plugins/crypter/FilesonicComFolder.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - -class FilesonicComFolder(Crypter): - __name__ = "FilesonicComFolder" - __type__ = "crypter" - __pattern__ = r"http://(\w*\.)?(sharingmatrix|filesonic|wupload)\.[^/]*/folder/\w+/?" - __version__ = "0.11" - __description__ = """Filesonic.com/Wupload.com Folder Plugin""" - __author_name__ = ("zoidberg") - __author_mail__ = ("zoidberg@mujmail.cz") - - FOLDER_PATTERN = r'\s*(.*?)
Files Folder
' - LINK_PATTERN = r'
' - - def decrypt(self, pyfile): - html = self.load(self.pyfile.url) - - new_links = [] - - folder = re.search(self.FOLDER_PATTERN, html, re.DOTALL) - if not folder: self.fail("Parse error (FOLDER)") - - new_links.extend(re.findall(self.LINK_PATTERN, folder.group(1))) - - if new_links: - self.core.files.addLinks(new_links, self.pyfile.package().id) - else: - self.fail('Could not extract any links') \ No newline at end of file diff --git a/module/plugins/crypter/MegauploadComFolder.py b/module/plugins/crypter/MegauploadComFolder.py deleted file mode 100644 index e18c10758..000000000 --- a/module/plugins/crypter/MegauploadComFolder.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- - -from module.plugins.internal.SimpleCrypter import SimpleCrypter -from re import search -from time import time - -class MegauploadComFolder(SimpleCrypter): - __name__ = "MegauploadComFolder" - __type__ = "crypter" - __pattern__ = r"http://(?:www\.)?megaupload.com/(?:\?f|xml/folderfiles.php\?folderid)=(\w+)" - __version__ = "0.01" - __description__ = """Depositfiles.com Folder Plugin""" - __author_name__ = ("zoidberg") - __author_mail__ = ("zoidberg@mujmail.cz") - - LINK_PATTERN = r']*?url="([^"]+)[^>]*?expired="0">' - - def init (self): - folderid = search(self.__pattern__, self.pyfile.url).group(1) - uniq = time() * 1000 - self.url = "http://www.megaupload.com/xml/folderfiles.php?folderid=%s&uniq=%d" % (folderid, uniq) - diff --git a/module/plugins/crypter/ShareLinksBiz.py b/module/plugins/crypter/ShareLinksBiz.py index 0df26110e..0009253e1 100644 --- a/module/plugins/crypter/ShareLinksBiz.py +++ b/module/plugins/crypter/ShareLinksBiz.py @@ -12,7 +12,7 @@ class ShareLinksBiz(Crypter): __name__ = "ShareLinksBiz" __type__ = "crypter" __pattern__ = r"(?Phttp://[\w\.]*?(share-links|s2l)\.biz)/(?P_?[0-9a-z]+)(/.*)?" - __version__ = "1.1" + __version__ = "1.11" __description__ = """Share-Links.biz Crypter""" __author_name__ = ("fragonib") __author_mail__ = ("fragonib[AT]yahoo[DOT]es") @@ -32,7 +32,7 @@ class ShareLinksBiz(Crypter): # Request package url = self.baseUrl + '/' + self.fileId - self.html = self.load(url) + self.html = self.load(url, decode=True) # Unblock server (load all images) self.unblockServer() @@ -96,7 +96,7 @@ class ShareLinksBiz(Crypter): 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) + self.html = self.load(url, post=post, decode=True) def unlockCaptchaProtection(self): # Get captcha map @@ -119,7 +119,7 @@ class ShareLinksBiz(Crypter): self.wait() self.retry() url = self.baseUrl + href - self.html = self.load(url) + self.html = self.load(url, decode=True) def _getCaptchaMap(self): map = {} -- cgit v1.2.3 From bceeb783f7ac83606a338abb4661b93afaf1df0f Mon Sep 17 00:00:00 2001 From: zoidberg10 Date: Thu, 15 Nov 2012 21:25:44 +0100 Subject: update hellshare (now premium only), SimpleHoster.py - utf8-encode url --- module/plugins/crypter/LinkdecrypterCom.py | 62 +++++++++++++++--------------- 1 file changed, 31 insertions(+), 31 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/LinkdecrypterCom.py b/module/plugins/crypter/LinkdecrypterCom.py index ff21916ef..69d2f8192 100644 --- a/module/plugins/crypter/LinkdecrypterCom.py +++ b/module/plugins/crypter/LinkdecrypterCom.py @@ -22,79 +22,79 @@ from module.plugins.Crypter import Crypter class LinkdecrypterCom(Crypter): __name__ = "LinkdecrypterCom" __type__ = "crypter" - __version__ = "0.26" + __version__ = "0.27" __description__ = """linkdecrypter.com""" __author_name__ = ("zoidberg", "flowlee") - + TEXTAREA_PATTERN = r'' PASSWORD_PATTERN = r'' REDIR_PATTERN = r'(Click here if your browser does not redirect you).' - + def decrypt(self, pyfile): self.passwords = self.getPassword().splitlines() - + # API not working anymore - new_links = self.decryptHTML() + new_links = self.decryptHTML() if new_links: self.core.files.addLinks(new_links, self.pyfile.package().id) else: - self.fail('Could not extract any links') + self.fail('Could not extract any links') def decryptAPI(self): - - get_dict = { "t": "link", "url": self.pyfile.url, "lcache": "1" } + + get_dict = { "t": "link", "url": self.pyfile.url, "lcache": "1" } self.html = self.load('http://linkdecrypter.com/api', get = get_dict) if self.html.startswith('http://'): return self.html.splitlines() - + if self.html == 'INTERRUPTION(PASSWORD)': for get_dict['pass'] in self.passwords: self.html = self.load('http://linkdecrypter.com/api', get= get_dict) - if self.html.startswith('http://'): return self.html.splitlines() - + if self.html.startswith('http://'): return self.html.splitlines() + self.logError('API', self.html) if self.html == 'INTERRUPTION(PASSWORD)': self.fail("No or incorrect password") - - return None - + + return None + def decryptHTML(self): retries = 5 - - post_dict = { "link_cache": "on", "pro_links": self.pyfile.url, "modo_links": "text" } - self.html = self.load('http://linkdecrypter.com/', post = post_dict, cookies = True) - - while self.passwords or retries: - found = re.search(self.TEXTAREA_PATTERN, self.html, flags=re.DOTALL) + + post_dict = { "link_cache": "on", "pro_links": self.pyfile.url, "modo_links": "text" } + self.html = self.load('http://linkdecrypter.com/', post=post_dict, cookies=True, decode=True) + + while self.passwords or retries: + found = re.search(self.TEXTAREA_PATTERN, self.html, flags=re.DOTALL) if found: return [ x for x in found.group(1).splitlines() if '[LINK-ERROR]' not in x ] - + found = re.search(self.CAPTCHA_PATTERN, self.html) if found: captcha_url = 'http://linkdecrypter.com/' + found.group(1) result_type = "positional" if "getPos" in found.group(2) else "textual" - + found = re.search(r"

([^<]+)

", self.html) msg = found.group(1) if found 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 }) + self.html = self.load('http://linkdecrypter.com/', post={ "captcha": captcha }, decode=True) retries -= 1 - + elif self.PASSWORD_PATTERN in self.html: if self.passwords: password = self.passwords.pop(0) self.logInfo("Password protected link, trying " + password) - self.html = self.load('http://linkdecrypter.com/', post= {'password': password}) + self.html = self.load('http://linkdecrypter.com/', post={'password': password}, decode=True) else: self.fail("No or incorrect password") - + else: - retries -= 1 - self.html = self.load('http://linkdecrypter.com/', cookies = True) - - return None \ No newline at end of file + retries -= 1 + self.html = self.load('http://linkdecrypter.com/', cookies=True, decode=True) + + return None -- cgit v1.2.3 From eb4b5b3ad206af4b4355839f0955e253b0cbf7f8 Mon Sep 17 00:00:00 2001 From: zoidberg10 Date: Thu, 15 Nov 2012 22:14:54 +0100 Subject: update Youtube crypter --- module/plugins/crypter/YoutubeBatch.py | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/YoutubeBatch.py b/module/plugins/crypter/YoutubeBatch.py index 88906d0db..2e68dfe02 100644 --- a/module/plugins/crypter/YoutubeBatch.py +++ b/module/plugins/crypter/YoutubeBatch.py @@ -8,26 +8,19 @@ from module.plugins.Crypter import Crypter class YoutubeBatch(Crypter): __name__ = "YoutubeBatch" __type__ = "container" - __pattern__ = r"http://(?:[^/]*?)youtube\.com/(?:(?:view_play_list|playlist|.*?feature=PlayList).*?(?:[\?&]list|p=)|user/.*?/user/)(\w+)" - __version__ = "0.91" + __pattern__ = r"http://(?:[^/]*?)youtube\.com/((?:view_play_list|playlist|.*?feature=PlayList).*?[\?&](?:list|p)=|user/)(\w+)" + __version__ = "0.92" __description__ = """Youtube.com Channel Download Plugin""" - __author_name__ = ("RaNaN", "Spoob") - __author_mail__ = ("RaNaN@pyload.org", "spoob@pyload.org") - - def setup(self): - compile_id = re.compile(self.__pattern__) - match_id = compile_id.match(self.pyfile.url) - self.playlist = match_id.group(1) - - def file_exists(self): - if "User not found" in self.req.load("http://gdata.youtube.com/feeds/api/playlists/%s?v=2" % self.playlist): - return False - return True + __author_name__ = ("RaNaN", "Spoob", "zoidberg") + __author_mail__ = ("RaNaN@pyload.org", "spoob@pyload.org", "zoidberg@mujmail.cz") def decrypt(self, pyfile): - if not self.file_exists(): - self.offline() - url = "http://gdata.youtube.com/feeds/api/playlists/%s?v=2" % self.playlist + match_id = re.match(self.__pattern__, self.pyfile.url) + if match_id.group(1) == "user/": + url = "http://gdata.youtube.com/feeds/api/users/%s/uploads?v=2" % match_id.group(2) + else: + url = "http://gdata.youtube.com/feeds/api/playlists/%s?v=2" % match_id.group(2) + rep = self.load(url) new_links = [] new_links.extend(re.findall(r"href\='(http:\/\/www.youtube.com\/watch\?v\=[^']+)&", rep)) -- cgit v1.2.3 From e54a6d932982bf27b475fe02e42b3f75d91954e7 Mon Sep 17 00:00:00 2001 From: zoidberg10 Date: Sun, 18 Nov 2012 10:16:13 +0100 Subject: Dereferer plugin --- module/plugins/crypter/Dereferer.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 module/plugins/crypter/Dereferer.py (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Dereferer.py b/module/plugins/crypter/Dereferer.py new file mode 100644 index 000000000..584835e18 --- /dev/null +++ b/module/plugins/crypter/Dereferer.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . +""" + +import re +import urllib + +from module.plugins.Crypter import Crypter + +class Dereferer(Crypter): + __name__ = "Dereferer" + __type__ = "crypter" + __pattern__ = r'https?://([^/]+)/.*?(?P(ht|f)tps?(://|%3A%2F%2F).*)' + __version__ = "0.1" + __description__ = """Crypter for dereferers""" + __author_name__ = ("zoidberg") + __author_mail__ = ("zoidberg@mujmail.cz") + + def decrypt(self, pyfile): + link = re.match(self.__pattern__, self.pyfile.url).group('url') + self.core.files.addLinks([ urllib.unquote(link).rstrip('+') ], self.pyfile.package().id) -- cgit v1.2.3 From 3f6b5ba7f2ffb8a0c6efa1d9d527aa600ae1cf9b Mon Sep 17 00:00:00 2001 From: fragonib Date: Wed, 26 Dec 2012 20:39:05 +0100 Subject: RelinkUs: Crypter several improvements. --- module/plugins/crypter/RelinkUs.py | 270 ++++++++++++++++++++++++++----------- 1 file changed, 189 insertions(+), 81 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/RelinkUs.py b/module/plugins/crypter/RelinkUs.py index d00e4cc18..8f29a9158 100644 --- a/module/plugins/crypter/RelinkUs.py +++ b/module/plugins/crypter/RelinkUs.py @@ -5,136 +5,244 @@ from module.plugins.Crypter import Crypter import base64 import binascii import re -import urllib +import os + class RelinkUs(Crypter): __name__ = "RelinkUs" __type__ = "crypter" __pattern__ = r"http://(www\.)?relink.us/(f/|((view|go).php\?id=))(?P.+)" - __version__ = "2.3" + __version__ = "3.0" __description__ = """Relink.us Crypter Plugin""" __author_name__ = ("fragonib") __author_mail__ = ("fragonib[AT]yahoo[DOT]es") # Constants - _JK_KEY_ = "jk" - _CRYPTED_KEY_ = "crypted" + PREFERRED_LINK_SOURCES = ['cnl2', 'dlc', 'web'] + + OFFLINE_TOKEN = "Tattooside" + PASSWORD_TOKEN = "container_password.php" + PASSWORD_ERROR_ROKEN = "You have entered an incorrect password" + PASSWORD_SUBMIT_URL = "http://www.relink.us/container_password.php" + CAPTCHA_TOKEN = "container_captcha.php" + CAPTCHA_ERROR_ROKEN = "You have solved the captcha wrong" + CAPTCHA_IMG_URL = "http://www.relink.us/core/captcha/circlecaptcha.php" + CAPTCHA_SUBMIT_URL = "http://www.relink.us/container_captcha.php" + FILE_TITLE_REGEX = r"<th>Title</th><td><i>(.*)</i></td></tr>" + FILE_NOTITLE = '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 = "http://www.relink.us/download.php" + WEB_FORWARD_REGEX = r"getFile\('(?P<link>.+)'\)"; + WEB_FORWARD_URL = "http://www.relink.us/frame.php" + WEB_LINK_REGEX = r'<iframe name="Container" height="100%" frameborder="no" width="100%" src="(?P<link>.+)"></iframe>' + def setup(self): + self.fileid = None + self.package = None + self.password = None self.html = None - + self.captcha = False + def decrypt(self, pyfile): + # Init - self.pyfile = pyfile - self.package = pyfile.package() + self.initPackage(pyfile) # Request package - self.html = self.requestPackageInfo() + self.requestPackage() + + # Check for online if not self.isOnline(): self.offline() - # Check for password protection + # Check for protection if self.isPasswordProtected(): - self.html = self.submitPassword() - if self.html is None: - self.fail("Incorrect password, please set right password on Edit package form and retry") + self.unlockPasswordProtection() + self.handleErrors() + + if self.isCaptchaProtected(): + self.captcha = True + self.unlockCaptchaProtection() + self.handleErrors() # Get package name and folder - (package_name, folder_name) = self.getPackageNameAndFolder() + (package_name, folder_name) = self.getPackageInfo() - # Get package links - try: - (crypted, jk) = self.getCipherParams() - package_links = self.getLinks(crypted, jk) - except: - self.fail("Unable to decrypt package") + # 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 - self.packages = [(package_name, package_links, folder_name)] + if package_links: + self.packages = [(package_name, package_links, folder_name)] + else: + self.fail('Could not extract any links') + + def initPackage(self, pyfile): + self.fileid = re.match(self.__pattern__, pyfile.url).group('id') + self.package = pyfile.package() + self.password = self.getPassword() + self.url = pyfile.url + + def requestPackage(self): + self.html = self.load(self.url, decode = True) def isOnline(self): - if "sorry.png" in self.html: + if self.OFFLINE_TOKEN in self.html: self.logDebug("File not found") return False return True def isPasswordProtected(self): - if "<h1>Container Protection</h1>" in self.html: + if self.PASSWORD_TOKEN in self.html: self.logDebug("Links are password protected") return True - return False - - def requestPackageInfo(self): - return self.load(self.pyfile.url) - - def submitPassword(self): - # Gather data - url = self.pyfile.url - m = re.match(self.__pattern__, url) - if m is None: - self.logDebug("Unable to get package id from url [%s]" % url) - return - id = m.group('id') - password = self.getPassword() - - # Submit package password - url = "http://www.relink.us/container_password.php?id=" + id - post = { '#' : '', 'password' : password, 'pw' : 'submit' } - self.logDebug("Submitting password [%s] for protected links with id [%s]" % (password, id)) - html = self.load(url, {}, post) - # Check for invalid password - if "An error occurred!" in html: - self.logDebug("Incorrect password, please set right password on Add package form and retry") - return None - else: - return html - - def getPackageNameAndFolder(self): - # Get title from html - try: - title_re = r'<td class="top">Title</td><td class="top">\|</td><td><span class="info_view_id"><i>(?P<title>.+)</i></span></td>' - title = re.search(title_re, self.html).group('title') - if 'Title deactived by the owner' in title: - title = None - except: - title = None + def isCaptchaProtected(self): + if self.CAPTCHA_TOKEN in self.html: + self.logDebug("Links are captcha protected") + return True + return False - # Set name & folder - if title is None: + def unlockPasswordProtection(self): + self.logDebug("Submitting password [%s] for protected links" % self.password) + passwd_url = self.PASSWORD_SUBMIT_URL + "?id=%s" % self.fileid + passwd_data = { 'id': self.fileid, 'password': self.password, 'pw': 'submit' } + self.html = self.load(passwd_url, post=passwd_data, decode=True) + + def unlockCaptchaProtection(self): + self.logDebug("Request user positional captcha resolving") + captcha_img_url = self.CAPTCHA_IMG_URL + "?id=%s" % self.fileid + coords = self.decryptCaptcha(captcha_img_url, forceUser=True, imgtype="png", result_type='positional') + self.logDebug("Captcha resolved, coords [%s]" % str(coords)) + captcha_post_url = self.CAPTCHA_SUBMIT_URL + "?id=%s" % self.fileid + captcha_post_data = { 'button.x': coords[0], 'button.y': coords[1], 'captcha': 'submit' } + self.html = self.load(captcha_post_url, post=captcha_post_data, decode=True) + + def getPackageInfo(self): + name = folder = None + + # Try to get info from web + m = re.search(self.FILE_TITLE_REGEX, self.html) + if m is not None: + title = m.group(1).strip() + if not self.FILE_NOTITLE in title: + name = folder = title + self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) + + # Fallback to defaults + if not name or not folder: name = self.package.name folder = self.package.folder self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) - else: - name = folder = title - self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) - return name, folder - - def getCipherParams(self): + # 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) - # Get vars dict - vars = {} - m = re.search(r'flashVars="(?P<vars>.*)"', self.html) - text = m.group('vars') - pairs = text.split('&') - for pair in pairs: - index = pair.index('=') - vars[pair[:index]] = pair[index + 1:] + if self.captcha: + if self.CAPTCHA_ERROR_ROKEN in self.html: + self.logDebug("Invalid captcha, retrying") + self.invalidCaptcha() + self.retry() + else: + self.correctCaptcha() + + def handleLinkSource(self, source): + if source == 'cnl2': + return self.handleCNL2Links() + elif source == 'dlc': + return self.handleDLCLinks() + elif source == 'web': + return self.handleWEBLinks() + else: + self.fail('Unknown source [%s] (this is probably a bug)' % source) + + def handleCNL2Links(self): + self.logDebug("Search for CNL2 links") + package_links = [] + m = re.search(self.CNL2_FORM_REGEX, self.html, re.DOTALL) + if m is not None: + cnl2_form = m.group(1) + try: + (vcrypted, vjk) = self._getCipherParams(cnl2_form) + for (crypted, jk) in zip(vcrypted, vjk): + package_links.extend(self._getLinks(crypted, jk)) + except: + self.logDebug("Unable to decrypt CNL2 links") + return package_links + + def handleDLCLinks(self): + self.logDebug('Search for DLC links') + package_links = [] + m = re.search(self.DLC_LINK_REGEX, self.html) + if m is not None: + container_url = self.DLC_DOWNLOAD_URL + "?id=%s&dlc=1" % self.fileid + self.logDebug("Downloading DLC container link [%s]" % container_url) + try: + dlc = self.load(container_url) + dlc_filename = self.fileid + ".dlc" + dlc_filepath = os.path.join(self.config["general"]["download_folder"], dlc_filename) + f = open(dlc_filepath, "wb") + f.write(dlc) + f.close() + package_links.append(dlc_filepath) + except: + self.logDebug("Unable to download DLC container") + return package_links - # Extract cipher pair - jk = urllib.unquote(vars[RelinkUs._JK_KEY_].replace("+", " ")) - crypted = vars[RelinkUs._CRYPTED_KEY_] + def handleWEBLinks(self): + self.logDebug("Search for WEB links") + package_links = [] + fw_params = re.findall(self.WEB_FORWARD_REGEX, self.html) + self.logDebug("Decrypting %d Web links" % len(fw_params)) + for index, fw_param in enumerate(fw_params): + try: + fw_url = self.WEB_FORWARD_URL + "?%s" % fw_param + self.logDebug("Decrypting Web link %d, %s" % (index+1, fw_url)) + fw_response = self.load(fw_url, decode=True) + dl_link = re.search(self.WEB_LINK_REGEX, fw_response).group('link') + package_links.append(dl_link) + except Exception, detail: + self.logDebug("Error decrypting Web link %s, %s" % (index, detail)) + self.setWait(4) + self.wait() + return package_links + + def _getCipherParams(self, cnl2_form): + + # Get jk + jk_re = self.CNL2_FORMINPUT_REGEX % self.CNL2_JK_KEY + vjk = re.findall(jk_re, cnl2_form, re.IGNORECASE) + + # Get crypted + crypted_re = self.CNL2_FORMINPUT_REGEX % RelinkUs.CNL2_CRYPTED_KEY + vcrypted = re.findall(crypted_re, cnl2_form, re.IGNORECASE) # Log and return - self.logDebug("Javascript cipher key function [%s]" % jk) - return crypted, jk + self.logDebug("Detected %d crypted blocks" % len(vcrypted)) + return vcrypted, vjk - def getLinks(self, crypted, jk): + def _getLinks(self, crypted, jk): # Get key jreturn = self.js.eval("%s f()" % jk) - self.logDebug("JsEngine returns value key=[%s]" % jreturn) + self.logDebug("JsEngine returns value [%s]" % jreturn) key = binascii.unhexlify(jreturn) # Decode crypted -- cgit v1.2.3 From 90c66cf8b63ca8b80b551d7b0aa96a671e7fcb96 Mon Sep 17 00:00:00 2001 From: fragonib <devnull@localhost> Date: Wed, 26 Dec 2012 20:40:18 +0100 Subject: LinkSaveIn: FIX compiler warnings --- module/plugins/crypter/LinkSaveIn.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/LinkSaveIn.py b/module/plugins/crypter/LinkSaveIn.py index 2d568c592..30cc61055 100644 --- a/module/plugins/crypter/LinkSaveIn.py +++ b/module/plugins/crypter/LinkSaveIn.py @@ -97,10 +97,10 @@ class LinkSaveIn(Crypter): self.html = self.load(self.pyfile.url, post=post) def unlockCaptchaProtection(self): - hash = re.search(r'name="hash" value="([^"]+)', self.html).group(1) - captchaUrl = re.search(r'src=".(/captcha/cap.php\?hsh=[^"]+)', self.html).group(1) - code = self.decryptCaptcha("http://linksave.in" + captchaUrl, forceUser=True) - self.html = self.load(self.pyfile.url, post={"id": self.fileid, "hash": hash, "code": code}) + captcha_hash = re.search(r'name="hash" value="([^"]+)', self.html).group(1) + captcha_url = re.search(r'src=".(/captcha/cap.php\?hsh=[^"]+)', self.html).group(1) + captcha_code = self.decryptCaptcha("http://linksave.in" + captcha_url, forceUser=True) + self.html = self.load(self.pyfile.url, post={"id": self.fileid, "hash": captcha_hash, "code": captcha_code}) def getPackageInfo(self): name = self.pyfile.package().name @@ -141,11 +141,11 @@ class LinkSaveIn(Crypter): pattern = r'<a href="http://linksave\.in/(\w{43})"' ids = re.findall(pattern, self.html) self.logDebug("Decrypting %d Web links" % len(ids)) - for i, id in enumerate(ids): + for i, weblink_id in enumerate(ids): try: - webLink = "http://linksave.in/%s" % id + webLink = "http://linksave.in/%s" % weblink_id self.logDebug("Decrypting Web link %d, %s" % (i+1, webLink)) - fwLink = "http://linksave.in/fw-%s" % id + fwLink = "http://linksave.in/fw-%s" % weblink_id response = self.load(fwLink) jscode = re.findall(r'<script type="text/javascript">(.*)</script>', response)[-1] jseval = self.js.eval("document = { write: function(e) { return e; } }; %s" % jscode) -- cgit v1.2.3 From 022e7c6e15a05afd15e8f859ec4ca5e45c682d1c Mon Sep 17 00:00:00 2001 From: fragonib <devnull@localhost> Date: Wed, 26 Dec 2012 20:42:42 +0100 Subject: ShareLinksBiz: FIX package info retrieval --- module/plugins/crypter/ShareLinksBiz.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/ShareLinksBiz.py b/module/plugins/crypter/ShareLinksBiz.py index 0009253e1..1ffa5d41a 100644 --- a/module/plugins/crypter/ShareLinksBiz.py +++ b/module/plugins/crypter/ShareLinksBiz.py @@ -12,7 +12,7 @@ class ShareLinksBiz(Crypter): __name__ = "ShareLinksBiz" __type__ = "crypter" __pattern__ = r"(?P<base>http://[\w\.]*?(share-links|s2l)\.biz)/(?P<id>_?[0-9a-z]+)(/.*)?" - __version__ = "1.11" + __version__ = "1.12" __description__ = """Share-Links.biz Crypter""" __author_name__ = ("fragonib") __author_mail__ = ("fragonib[AT]yahoo[DOT]es") @@ -152,16 +152,24 @@ class ShareLinksBiz(Crypter): self.correctCaptcha() def getPackageInfo(self): + name = folder = None + + # Extract from web package header title_re = r'<h2><img.*?/>(.*)</h2>' m = re.search(title_re, self.html, re.DOTALL) if m is not None: title = m.group(1).strip() - name = folder = title - self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) - else: + 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): -- cgit v1.2.3 From 6672e9690f79569f55a2afbb2575d7c671d82812 Mon Sep 17 00:00:00 2001 From: z00nx <z00nx0@gmail.com> Date: Fri, 11 Jan 2013 18:56:40 +1100 Subject: Added LetitbitNetFolder decrypter --- module/plugins/crypter/LetitbitNetFolder.py | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 module/plugins/crypter/LetitbitNetFolder.py (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/LetitbitNetFolder.py b/module/plugins/crypter/LetitbitNetFolder.py new file mode 100644 index 000000000..68aad9dd7 --- /dev/null +++ b/module/plugins/crypter/LetitbitNetFolder.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +import re +from module.plugins.Crypter import Crypter + + +class LetitbitNetFolder(Crypter): + __name__ = "LetitbitNetFolder" + __type__ = "crypter" + __pattern__ = r"http://(?:www\.)?letitbit.net/folder/\w+" + __version__ = "0.1" + __description__ = """Letitbit.net Folder Plugin""" + __author_name__ = ("DHMH", "z00nx") + __author_mail__ = ("webmaster@pcProfil.de", "z00nx0@gmail.com") + + FOLDER_PATTERN = r'<table>(.*)</table>' + LINK_PATTERN = r'<a href="([^"]+)" target="_blank">' + + def decrypt(self, pyfile): + html = self.load(self.pyfile.url) + + new_links = [] + + folder = re.search(self.FOLDER_PATTERN, html, re.DOTALL) + if folder is None: + self.fail("Parse error (FOLDER)") + + new_links.extend(re.findall(self.LINK_PATTERN, folder.group(0))) + + if new_links: + self.core.files.addLinks(new_links, self.pyfile.package().id) + else: + self.fail('Could not extract any links') -- cgit v1.2.3 From b94736fb2eb60bf2346c2adcd697799e5705a462 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Mon, 18 Feb 2013 12:28:21 -0800 Subject: Crypter for SpeedLoadOrg Folders --- module/plugins/crypter/SpeedLoadOrgFolder.py | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 module/plugins/crypter/SpeedLoadOrgFolder.py (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/SpeedLoadOrgFolder.py b/module/plugins/crypter/SpeedLoadOrgFolder.py new file mode 100644 index 000000000..002605233 --- /dev/null +++ b/module/plugins/crypter/SpeedLoadOrgFolder.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- + +from module.plugins.Crypter import Crypter +import re + +class SpeedLoadOrgFolder(Crypter): + __name__ = "SpeedLoadOrgFolder" + __type__ = "crypter" + __pattern__ = r"http://(www\.)?speedload\.org/(?P<ID>\w+)~f$" + __version__ = "0.1" + __description__ = """Speedload Crypter Plugin""" + __author_name__ = ("stickell") + __author_mail__ = ("l.stickell@yahoo.it") + + def decrypt(self, pyfile): + self.html = self.load(pyfile.url) + (package_name, folder_name) = self.getPackageNameAndFolder() + package_links = self.getLinks() + + self.packages = [(package_name, package_links, folder_name)] + + def getPackageNameAndFolder(self): + title_re = r"Files Within Folder '(?P<title>.+)'" + m = re.search(title_re, self.html) + if m is not None: + name = folder = m.group('title') + self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) + return name, folder + else: + name = self.pyfile.package().name + folder = self.pyfile.package().folder + self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) + return name, folder + + def getLinks(self): + pages = int(re.search('Total Pages (\d)', self.html).group(1)) + + link_regex = re.compile('<a href="(http://speedload.org/\w+)"') + links = link_regex.findall(self.html) + + if pages > 1: + for p in range(2, pages + 1): + self.html = self.load(self.pyfile.url + '?page=%d' % p) + links += link_regex.findall(self.html) + + self.logDebug("Package has %d links" % len(links)) + return links -- cgit v1.2.3 From 25caffda8213a92a51a08a346421afe63685eb88 Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Tue, 26 Feb 2013 14:56:06 +0100 Subject: wrote crypter/Movie2kTo.py --- module/plugins/crypter/Movie2kTo.py | 62 +++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 module/plugins/crypter/Movie2kTo.py (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py new file mode 100644 index 000000000..e33dc1d9f --- /dev/null +++ b/module/plugins/crypter/Movie2kTo.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import re +from module.plugins.Crypter import Crypter + +class Movie2kTo(Crypter): + __name__ = "Movie2kTo" + __type__ = "container" + __pattern__ = r"http://(?:www\.)?movie2k\.to/(.*\.html)" + __version__ = "0.1" + __config__ = [("accepted_hosters", "str", "List of accepted hosters", "Xvidstage, ")] + __description__ = """Movie2k.to Container Plugin""" + __author_name__ = ('4Christopher') + __author_mail__ = ('4Christopher@gmx.de') + BASE_URL_PATTERN = r'http://(?:www\.)?movie2k\.to/' + TVSHOW_URL_PATH_PATTERN = r'tvshows-(?P<id>\d+?)-(?P<name>.*)\.html' + FILM_URL_PATH_PATTERN = r'(?P<name>.*)-online-film-(?P<id>\d+?)\.html' + BASE_URL = 'http://www.movie2k.to' + + def decrypt(self, pyfile): + self.html = self.load(pyfile.url) + self.package = pyfile.package() + self.folder = self.package.folder + self.url_path = re.match(self.__pattern__, pyfile.url).group(1) + self.logDebug('URL Path: %s' % self.url_path) + self.format = pattern_re = None + if re.match(r'tvshows', self.url_path): + self.format = 'tvshow' + pattern_re = re.search(self.TVSHOW_URL_PATH_PATTERN, self.url_path) + elif re.search(r'.*online-film-\d+?\.html', self.url_path): + self.format = 'film' + pattern_re = re.search(self.FILM_URL_PATH_PATTERN, self.url_path) + + self.name = pattern_re.group('name') + self.id = pattern_re.group('id') + self.logDebug('Name: %s' % self.name) + self.logDebug('ID: %s' % self.id) + + accepted_hosters = re.findall(r'\b(\w+?)\b', self.getConfig(accepted_hosters)) + links = [] + ## h_id: hoster_id of a possible hoster + for h_id, hoster in re.findall(r'links\[(\d+?)\].* (.*?)</a>', self.html): + if hoster in accepted_hosters: + self.logDebug('id: %s, %s' % (h_id, hoster)) + if h_id != self.id: + self.html = self.load('%s/tvshows-%s-%s.html' % (self.BASE_URL, h_id, self.name)) + else: + self.logDebug('This is already the right ID') + try: + url = re.search(r'<a target="_blank" href="(.*?)"', self.html).group(1) + self.logDebug(url) + links.append(url) + except: + self.logDebug('Failed to find the URL') + + self.logDebug(links) + if self.format != 'film': + self.name = self.package.name + self.logDebug('Using new name: %s' % self.name) + self.logDebug('folder name: %s' % self.package.folder) + self.packages.append((self.name, links, self.package.folder)) -- cgit v1.2.3 From 63c84f081eb0dce4521e0bddf824812db2c76c3d Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Tue, 26 Feb 2013 18:27:57 +0100 Subject: added support to add all episodes and/or seasons --- module/plugins/crypter/Movie2kTo.py | 68 +++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 14 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index e33dc1d9f..a79b32938 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -7,22 +7,62 @@ from module.plugins.Crypter import Crypter class Movie2kTo(Crypter): __name__ = "Movie2kTo" __type__ = "container" - __pattern__ = r"http://(?:www\.)?movie2k\.to/(.*\.html)" + __pattern__ = r"http://(?:www\.)?movie2k\.to/(.*)\.html" __version__ = "0.1" - __config__ = [("accepted_hosters", "str", "List of accepted hosters", "Xvidstage, ")] + __config__ = [("accepted_hosters", "str", "List of accepted hosters", "Xvidstage, "), + ("whole_season", "bool", "Download whole season", "False"), + ("everything", "bool", "Download everything", "False")] __description__ = """Movie2k.to Container Plugin""" __author_name__ = ('4Christopher') __author_mail__ = ('4Christopher@gmx.de') BASE_URL_PATTERN = r'http://(?:www\.)?movie2k\.to/' - TVSHOW_URL_PATH_PATTERN = r'tvshows-(?P<id>\d+?)-(?P<name>.*)\.html' - FILM_URL_PATH_PATTERN = r'(?P<name>.*)-online-film-(?P<id>\d+?)\.html' + TVSHOW_URL_PATH_PATTERN = r'tvshows-(?P<id>\d+?)-(?P<name>.+)' + FILM_URL_PATH_PATTERN = r'(?P<name>.+?)-online-film-(?P<id>\d+)' + SEASON_PATTERN = r'<div id="episodediv(\d+?)" style="display:(inline|none)">(.*?)</div>' + EP_PATTERN = r'<option value="(.+?)"( selected)?>Episode\s*?(\d+?)</option>' BASE_URL = 'http://www.movie2k.to' def decrypt(self, pyfile): self.html = self.load(pyfile.url) self.package = pyfile.package() self.folder = self.package.folder - self.url_path = re.match(self.__pattern__, pyfile.url).group(1) + whole_season = self.getConfig('whole_season') + everything = self.getConfig('everything') + self.getInfo(pyfile.url) + + if (whole_season or everything) and self.format == 'tvshow': + self.logDebug('Downloading the whole season') + for season, season_sel, html in re.findall(self.SEASON_PATTERN, self.html, re.DOTALL | re.I): + if (season_sel == 'inline') or everything: + season_links = [] + for url_path, ep_sel, ep in re.findall(self.EP_PATTERN, html, re.I): + season_name = self.name_tvshow(season, ep) + self.logDebug('%s: %s' % (season_name, url_path)) + if ep_sel and (season_sel == 'inline'): + self.logDebug('%s selected (in the start URL: %s)' % (season_name, pyfile.url)) + season_links += self.getLinks('%s/%s' % (self.BASE_URL, url_path)) + elif (whole_season and (season_sel == 'inline')) or everything: + season_links += self.getLinks('%s/%s' % (self.BASE_URL, url_path)) + self.packages.append(('Season %s' % season, season_links, 'Season %s' % season)) + + else: + self.getLinks(pyfile.url) + if self.format != 'film': + self.name = self.package.name + self.logDebug('Using new name: %s' % self.name) + self.logDebug('folder name: %s' % self.package.folder) + self.packages.append((self.name, links, self.package.folder)) + + def tvshow_number(self, number): + if int(number) < 10: + return '0%s' % number + else: + return number + def name_tvshow(self, season, ep): + return '%s S%sE%s' % (self.name, self.tvshow_number(season), self.tvshow_number(ep)) + + def getInfo(self, url): + self.url_path = re.match(self.__pattern__, url).group(1) self.logDebug('URL Path: %s' % self.url_path) self.format = pattern_re = None if re.match(r'tvshows', self.url_path): @@ -31,32 +71,32 @@ class Movie2kTo(Crypter): elif re.search(r'.*online-film-\d+?\.html', self.url_path): self.format = 'film' pattern_re = re.search(self.FILM_URL_PATH_PATTERN, self.url_path) + else: + self.format = 'porn' + + self.logDebug('Format: %s' % self.format) self.name = pattern_re.group('name') - self.id = pattern_re.group('id') self.logDebug('Name: %s' % self.name) + self.id = pattern_re.group('id') self.logDebug('ID: %s' % self.id) - accepted_hosters = re.findall(r'\b(\w+?)\b', self.getConfig(accepted_hosters)) + def getLinks(self, url): + accepted_hosters = re.findall(r'\b(\w+?)\b', self.getConfig('accepted_hosters')) links = [] ## h_id: hoster_id of a possible hoster for h_id, hoster in re.findall(r'links\[(\d+?)\].* (.*?)</a>', self.html): if hoster in accepted_hosters: - self.logDebug('id: %s, %s' % (h_id, hoster)) if h_id != self.id: self.html = self.load('%s/tvshows-%s-%s.html' % (self.BASE_URL, h_id, self.name)) else: self.logDebug('This is already the right ID') try: url = re.search(r'<a target="_blank" href="(.*?)"', self.html).group(1) - self.logDebug(url) + self.logDebug('id: %s, %s: %s' % (h_id, hoster, url)) links.append(url) except: self.logDebug('Failed to find the URL') self.logDebug(links) - if self.format != 'film': - self.name = self.package.name - self.logDebug('Using new name: %s' % self.name) - self.logDebug('folder name: %s' % self.package.folder) - self.packages.append((self.name, links, self.package.folder)) + return links -- cgit v1.2.3 From 9b8edbfaf1e9c255c6e05458c4c805d325c64cb8 Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Wed, 27 Feb 2013 00:19:55 +0100 Subject: fixed support for films --- module/plugins/crypter/Movie2kTo.py | 39 ++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 18 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index a79b32938..7f30d1649 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -8,7 +8,7 @@ class Movie2kTo(Crypter): __name__ = "Movie2kTo" __type__ = "container" __pattern__ = r"http://(?:www\.)?movie2k\.to/(.*)\.html" - __version__ = "0.1" + __version__ = "0.1.1" __config__ = [("accepted_hosters", "str", "List of accepted hosters", "Xvidstage, "), ("whole_season", "bool", "Download whole season", "False"), ("everything", "bool", "Download everything", "False")] @@ -17,13 +17,12 @@ class Movie2kTo(Crypter): __author_mail__ = ('4Christopher@gmx.de') BASE_URL_PATTERN = r'http://(?:www\.)?movie2k\.to/' TVSHOW_URL_PATH_PATTERN = r'tvshows-(?P<id>\d+?)-(?P<name>.+)' - FILM_URL_PATH_PATTERN = r'(?P<name>.+?)-online-film-(?P<id>\d+)' + FILM_URL_PATH_PATTERN = r'(?P<name>.+?)-(?:online-film|watch-movie)-(?P<id>\d+)' SEASON_PATTERN = r'<div id="episodediv(\d+?)" style="display:(inline|none)">(.*?)</div>' EP_PATTERN = r'<option value="(.+?)"( selected)?>Episode\s*?(\d+?)</option>' BASE_URL = 'http://www.movie2k.to' def decrypt(self, pyfile): - self.html = self.load(pyfile.url) self.package = pyfile.package() self.folder = self.package.folder whole_season = self.getConfig('whole_season') @@ -40,19 +39,15 @@ class Movie2kTo(Crypter): self.logDebug('%s: %s' % (season_name, url_path)) if ep_sel and (season_sel == 'inline'): self.logDebug('%s selected (in the start URL: %s)' % (season_name, pyfile.url)) - season_links += self.getLinks('%s/%s' % (self.BASE_URL, url_path)) + season_links += self.getInfoAndLinks('%s/%s' % (self.BASE_URL, url_path)) elif (whole_season and (season_sel == 'inline')) or everything: - season_links += self.getLinks('%s/%s' % (self.BASE_URL, url_path)) + url = '%s/%s' % (self.BASE_URL, url_path) + season_links += self.getInfoAndLinks('%s/%s' % (self.BASE_URL, url_path)) self.packages.append(('Season %s' % season, season_links, 'Season %s' % season)) else: - self.getLinks(pyfile.url) - if self.format != 'film': - self.name = self.package.name - self.logDebug('Using new name: %s' % self.name) - self.logDebug('folder name: %s' % self.package.folder) - self.packages.append((self.name, links, self.package.folder)) - + self.packages.append((self.package.name, self.getLinks(), self.package.folder)) + def tvshow_number(self, number): if int(number) < 10: return '0%s' % number @@ -62,17 +57,16 @@ class Movie2kTo(Crypter): return '%s S%sE%s' % (self.name, self.tvshow_number(season), self.tvshow_number(ep)) def getInfo(self, url): + self.html = self.load(url) self.url_path = re.match(self.__pattern__, url).group(1) self.logDebug('URL Path: %s' % self.url_path) self.format = pattern_re = None if re.match(r'tvshows', self.url_path): self.format = 'tvshow' pattern_re = re.search(self.TVSHOW_URL_PATH_PATTERN, self.url_path) - elif re.search(r'.*online-film-\d+?\.html', self.url_path): + elif re.search(self.FILM_URL_PATH_PATTERN, self.url_path): self.format = 'film' pattern_re = re.search(self.FILM_URL_PATH_PATTERN, self.url_path) - else: - self.format = 'porn' self.logDebug('Format: %s' % self.format) @@ -81,18 +75,27 @@ class Movie2kTo(Crypter): self.id = pattern_re.group('id') self.logDebug('ID: %s' % self.id) - def getLinks(self, url): + def getInfoAndLinks(self, url): + self.getInfo(url) + return self.getLinks() + + def getLinks(self): accepted_hosters = re.findall(r'\b(\w+?)\b', self.getConfig('accepted_hosters')) links = [] ## h_id: hoster_id of a possible hoster - for h_id, hoster in re.findall(r'links\[(\d+?)\].* (.*?)</a>', self.html): + if self.format == 'tvshow': + re_hoster_id = re.compile(r'links\[(\d+?)\].+ (.+?)</a>') + else: + re_hoster_id = re.compile(r'<a href=".*?(\d{7}).*?".+? (.+?)</a>') + ## I assume that the ID is 7 digits longs + for h_id, hoster in re_hoster_id.findall(self.html): if hoster in accepted_hosters: if h_id != self.id: self.html = self.load('%s/tvshows-%s-%s.html' % (self.BASE_URL, h_id, self.name)) else: self.logDebug('This is already the right ID') try: - url = re.search(r'<a target="_blank" href="(.*?)"', self.html).group(1) + url = re.search(r'<a target="_blank" href="(http://.*?)"', self.html).group(1) self.logDebug('id: %s, %s: %s' % (h_id, hoster, url)) links.append(url) except: -- cgit v1.2.3 From 7b1889af3caf854a2b4aaed32d27816402a8ef97 Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Wed, 27 Feb 2013 13:21:13 +0100 Subject: little fixes --- module/plugins/crypter/Movie2kTo.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index 7f30d1649..a9cdb188b 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -8,7 +8,7 @@ class Movie2kTo(Crypter): __name__ = "Movie2kTo" __type__ = "container" __pattern__ = r"http://(?:www\.)?movie2k\.to/(.*)\.html" - __version__ = "0.1.1" + __version__ = "0.2" __config__ = [("accepted_hosters", "str", "List of accepted hosters", "Xvidstage, "), ("whole_season", "bool", "Download whole season", "False"), ("everything", "bool", "Download everything", "False")] @@ -41,9 +41,8 @@ class Movie2kTo(Crypter): self.logDebug('%s selected (in the start URL: %s)' % (season_name, pyfile.url)) season_links += self.getInfoAndLinks('%s/%s' % (self.BASE_URL, url_path)) elif (whole_season and (season_sel == 'inline')) or everything: - url = '%s/%s' % (self.BASE_URL, url_path) season_links += self.getInfoAndLinks('%s/%s' % (self.BASE_URL, url_path)) - self.packages.append(('Season %s' % season, season_links, 'Season %s' % season)) + self.packages.append(('%s: Season %s' % (self.name, season), season_links, 'Season %s' % season)) else: self.packages.append((self.package.name, self.getLinks(), self.package.folder)) @@ -53,13 +52,13 @@ class Movie2kTo(Crypter): return '0%s' % number else: return number + def name_tvshow(self, season, ep): return '%s S%sE%s' % (self.name, self.tvshow_number(season), self.tvshow_number(ep)) def getInfo(self, url): self.html = self.load(url) self.url_path = re.match(self.__pattern__, url).group(1) - self.logDebug('URL Path: %s' % self.url_path) self.format = pattern_re = None if re.match(r'tvshows', self.url_path): self.format = 'tvshow' @@ -68,13 +67,12 @@ class Movie2kTo(Crypter): self.format = 'film' pattern_re = re.search(self.FILM_URL_PATH_PATTERN, self.url_path) - self.logDebug('Format: %s' % self.format) self.name = pattern_re.group('name') - self.logDebug('Name: %s' % self.name) self.id = pattern_re.group('id') - self.logDebug('ID: %s' % self.id) - + self.logDebug('URL Path: %s (ID: %s, Name: %s, Format: %s)' + % (self.url_path, self.id, self.name, self.format)) + def getInfoAndLinks(self, url): self.getInfo(url) return self.getLinks() @@ -83,11 +81,13 @@ class Movie2kTo(Crypter): accepted_hosters = re.findall(r'\b(\w+?)\b', self.getConfig('accepted_hosters')) links = [] ## h_id: hoster_id of a possible hoster - if self.format == 'tvshow': - re_hoster_id = re.compile(r'links\[(\d+?)\].+ (.+?)</a>') - else: - re_hoster_id = re.compile(r'<a href=".*?(\d{7}).*?".+? (.+?)</a>') - ## I assume that the ID is 7 digits longs + re_hoster_id_js = re.compile(r'links\[(\d+?)\].+ (.+?)</a>') + re_hoster_id_html = re.compile(r'<a href=".*?(\d{7}).*?".+? (.+?)</a>') + ## I assume that the ID is 7 digits longs + if re_hoster_id_js.search(self.html): + re_hoster_id = re_hoster_id_js + elif re_hoster_id_html.search(self.html): + re_hoster_id = re_hoster_id_html for h_id, hoster in re_hoster_id.findall(self.html): if hoster in accepted_hosters: if h_id != self.id: @@ -101,5 +101,9 @@ class Movie2kTo(Crypter): except: self.logDebug('Failed to find the URL') + # self.logDebug(links[-1]) ## Last link, this is probably everything + ## you will need + # links.append('http://localhost/IfTheProcessFunctionReturnsOnlyOneLinkItWillFail') self.logDebug(links) + # return links[-1] return links -- cgit v1.2.3 From 8368a9a74d998b314f3864dcc8ce25c513d85cf9 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Thu, 7 Mar 2013 16:41:25 +0100 Subject: Various fixes in 24 plugins --- module/plugins/crypter/NetfolderIn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/NetfolderIn.py b/module/plugins/crypter/NetfolderIn.py index c8110ef6b..d71a73d0a 100644 --- a/module/plugins/crypter/NetfolderIn.py +++ b/module/plugins/crypter/NetfolderIn.py @@ -7,7 +7,7 @@ class NetfolderIn(Crypter): __name__ = "NetfolderIn" __type__ = "crypter" __pattern__ = r"http://(?:www\.)?netfolder.in/((?P<id1>\w+)/\w+|folder.php\?folder_id=(?P<id2>\w+))" - __version__ = "0.3" + __version__ = "0.4" __description__ = """NetFolder Crypter Plugin""" __author_name__ = ("RaNaN", "fragonib") __author_mail__ = ("RaNaN@pyload.org", "fragonib[AT]yahoo[DOT]es") @@ -47,7 +47,7 @@ class NetfolderIn(Crypter): m = re.match(self.__pattern__, self.pyfile.url) id = max(m.group('id1'), m.group('id2')) except AttributeError: - self.logDebug("Unable to get package id from url [%s]" % url) + 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() -- cgit v1.2.3 From 02e6b873ad9971d4974a5b4f7a126dee3da60d2c Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Thu, 7 Mar 2013 20:17:29 +0100 Subject: SpeedLoadOrgFolder: crypter rewritten Trivial changes to the SimpleCrypter class --- module/plugins/crypter/SpeedLoadOrgFolder.py | 43 ++++------------------------ 1 file changed, 5 insertions(+), 38 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/SpeedLoadOrgFolder.py b/module/plugins/crypter/SpeedLoadOrgFolder.py index 002605233..a4a3e99e3 100644 --- a/module/plugins/crypter/SpeedLoadOrgFolder.py +++ b/module/plugins/crypter/SpeedLoadOrgFolder.py @@ -1,47 +1,14 @@ # -*- coding: utf-8 -*- -from module.plugins.Crypter import Crypter -import re +from module.plugins.internal.SimpleCrypter import SimpleCrypter -class SpeedLoadOrgFolder(Crypter): +class SpeedLoadOrgFolder(SimpleCrypter): __name__ = "SpeedLoadOrgFolder" __type__ = "crypter" - __pattern__ = r"http://(www\.)?speedload\.org/(?P<ID>\w+)~f$" - __version__ = "0.1" + __pattern__ = r"http://(www\.)?speedload\.org/(\d+~f$|folder/\d+/)" + __version__ = "0.2" __description__ = """Speedload Crypter Plugin""" __author_name__ = ("stickell") __author_mail__ = ("l.stickell@yahoo.it") - def decrypt(self, pyfile): - self.html = self.load(pyfile.url) - (package_name, folder_name) = self.getPackageNameAndFolder() - package_links = self.getLinks() - - self.packages = [(package_name, package_links, folder_name)] - - def getPackageNameAndFolder(self): - title_re = r"Files Within Folder '(?P<title>.+)'" - m = re.search(title_re, self.html) - if m is not None: - name = folder = m.group('title') - self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) - return name, folder - else: - name = self.pyfile.package().name - folder = self.pyfile.package().folder - self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) - return name, folder - - def getLinks(self): - pages = int(re.search('Total Pages (\d)', self.html).group(1)) - - link_regex = re.compile('<a href="(http://speedload.org/\w+)"') - links = link_regex.findall(self.html) - - if pages > 1: - for p in range(2, pages + 1): - self.html = self.load(self.pyfile.url + '?page=%d' % p) - links += link_regex.findall(self.html) - - self.logDebug("Package has %d links" % len(links)) - return links + LINK_PATTERN = r'<div class="link"><a href="(http://speedload.org/\w+)"' -- cgit v1.2.3 From c5f21698c35c0d85608e09f3f6a743d9b2c1a688 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Thu, 7 Mar 2013 22:11:26 +0100 Subject: SpeedLoadOrgFolder: Package name detection --- module/plugins/crypter/SpeedLoadOrgFolder.py | 1 + 1 file changed, 1 insertion(+) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/SpeedLoadOrgFolder.py b/module/plugins/crypter/SpeedLoadOrgFolder.py index a4a3e99e3..5b350787f 100644 --- a/module/plugins/crypter/SpeedLoadOrgFolder.py +++ b/module/plugins/crypter/SpeedLoadOrgFolder.py @@ -12,3 +12,4 @@ class SpeedLoadOrgFolder(SimpleCrypter): __author_mail__ = ("l.stickell@yahoo.it") LINK_PATTERN = r'<div class="link"><a href="(http://speedload.org/\w+)"' + TITLE_PATTERN = r'<title>Files of: (?P<title>[^<]+) folder' -- cgit v1.2.3 From a2e98e4ea5093b88dcf0550ba639f1a45d0909bf Mon Sep 17 00:00:00 2001 From: Stefano Date: Fri, 8 Mar 2013 12:23:55 +0100 Subject: Added support for UploadedTo folders --- module/plugins/crypter/UploadedToFolder.py | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 module/plugins/crypter/UploadedToFolder.py (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/UploadedToFolder.py b/module/plugins/crypter/UploadedToFolder.py new file mode 100644 index 000000000..d4534297e --- /dev/null +++ b/module/plugins/crypter/UploadedToFolder.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +from module.plugins.Crypter import Crypter +import re + +class UploadedToFolder(Crypter): + __name__ = "UploadedToFolder" + __type__ = "crypter" + __pattern__ = r"http://(?:www\.)?(uploaded|ul)\.(to|net)/(f|list)/(?P\w+)" + __version__ = "0.1" + __description__ = """UploadedTo Crypter Plugin""" + __author_name__ = ("stickell") + __author_mail__ = ("l.stickell@yahoo.it") + + PLAIN_PATTERN = r'(?P[^<]+)' + + def decrypt(self, pyfile): + self.html = self.load(pyfile.url) + + package_name, folder_name = self.getPackageNameAndFolder() + + m = re.search(self.PLAIN_PATTERN, self.html) + if m: + plain_link = 'http://uploaded.net/' + m.group('plain') + else: + self.fail('Parse error - Unable to find plain url list') + + self.html = self.load(plain_link) + package_links = self.html.split('\n')[:-1] + self.logDebug('Package has %d links' % len(package_links)) + + self.packages = [(package_name, package_links, folder_name)] + + def getPackageNameAndFolder(self): + m = re.search(self.TITLE_PATTERN, self.html) + if m: + name = folder = m.group('title') + self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) + return name, folder + else: + name = self.pyfile.package().name + folder = self.pyfile.package().folder + self.logDebug("Package info not found, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) + return name, folder -- cgit v1.2.3 From 06a3224eb877640127d37f9497a2f1f2379b035b Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Mon, 11 Mar 2013 18:06:54 +0100 Subject: wrote crypter plugin for chip.de/videos --- module/plugins/crypter/ChipDe.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 module/plugins/crypter/ChipDe.py (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/ChipDe.py b/module/plugins/crypter/ChipDe.py new file mode 100644 index 000000000..955d731b2 --- /dev/null +++ b/module/plugins/crypter/ChipDe.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import re +from module.plugins.Crypter import Crypter + +class ChipDe(Crypter): + __name__ = "ChipDe" + __type__ = "container" + __pattern__ = r"http://(?:www\.)?chip.de/video/.*\.html" + __version__ = "0.1" + __description__ = """Chip.de Container Plugin""" + __author_name__ = ('4Christopher') + __author_mail__ = ('4Christopher@gmx.de') + + def decrypt(self, pyfile): + # self.package = pyfile.package() + self.html = self.load(pyfile.url) + try: + url = re.search(r'"(http://video.chip.de/\d+?/.*)"', self.html).group(1) + self.logDebug('The file URL is %s' % url) + except: + self.fail('Failed to find the URL') + + self.packages.append((self.pyfile.package().name, [ url ], self.pyfile.package().folder)) -- cgit v1.2.3 From 6c80f7bf4e9e1e21eeb0cc2522e6b674b793cd7a Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Mon, 11 Mar 2013 20:48:41 +0100 Subject: added setting to set how many URLs should be returned for each episode. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Usually the first URL will be all you need. The movie2k.to website also just returns the first URL but in the source code of the website there are more links for each episode … --- module/plugins/crypter/ChipDe.py | 1 - module/plugins/crypter/Movie2kTo.py | 56 ++++++++++++++++++++----------------- 2 files changed, 30 insertions(+), 27 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/ChipDe.py b/module/plugins/crypter/ChipDe.py index 955d731b2..fcb84a300 100644 --- a/module/plugins/crypter/ChipDe.py +++ b/module/plugins/crypter/ChipDe.py @@ -14,7 +14,6 @@ class ChipDe(Crypter): __author_mail__ = ('4Christopher@gmx.de') def decrypt(self, pyfile): - # self.package = pyfile.package() self.html = self.load(pyfile.url) try: url = re.search(r'"(http://video.chip.de/\d+?/.*)"', self.html).group(1) diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index a9cdb188b..1b93dfa78 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -3,15 +3,17 @@ import re from module.plugins.Crypter import Crypter +from collections import defaultdict class Movie2kTo(Crypter): - __name__ = "Movie2kTo" - __type__ = "container" - __pattern__ = r"http://(?:www\.)?movie2k\.to/(.*)\.html" - __version__ = "0.2" - __config__ = [("accepted_hosters", "str", "List of accepted hosters", "Xvidstage, "), - ("whole_season", "bool", "Download whole season", "False"), - ("everything", "bool", "Download everything", "False")] + __name__ = 'Movie2kTo' + __type__ = 'container' + __pattern__ = r'http://(?:www\.)?movie2k\.to/(.*)\.html' + __version__ = '0.3' + __config__ = [('accepted_hosters', 'str', 'List of accepted hosters', 'Xvidstage, '), + ('whole_season', 'bool', 'Download whole season', 'False'), + ('everything', 'bool', 'Download everything', 'False'), + ('firstN', 'int', 'Download the first N files for each episode. The first file is probably all you will need.', '1')] __description__ = """Movie2k.to Container Plugin""" __author_name__ = ('4Christopher') __author_mail__ = ('4Christopher@gmx.de') @@ -21,7 +23,7 @@ class Movie2kTo(Crypter): SEASON_PATTERN = r'
(.*?)
' EP_PATTERN = r'' BASE_URL = 'http://www.movie2k.to' - + def decrypt(self, pyfile): self.package = pyfile.package() self.folder = self.package.folder @@ -42,17 +44,18 @@ class Movie2kTo(Crypter): season_links += self.getInfoAndLinks('%s/%s' % (self.BASE_URL, url_path)) elif (whole_season and (season_sel == 'inline')) or everything: season_links += self.getInfoAndLinks('%s/%s' % (self.BASE_URL, url_path)) - self.packages.append(('%s: Season %s' % (self.name, season), season_links, 'Season %s' % season)) + self.logDebug(season_links) + self.packages.append(('%s: Season %s' % (self.name, season), season_links, 'Season %s' % season)) else: self.packages.append((self.package.name, self.getLinks(), self.package.folder)) - + def tvshow_number(self, number): if int(number) < 10: return '0%s' % number else: return number - + def name_tvshow(self, season, ep): return '%s S%sE%s' % (self.name, self.tvshow_number(season), self.tvshow_number(ep)) @@ -77,8 +80,10 @@ class Movie2kTo(Crypter): self.getInfo(url) return self.getLinks() + ## This function returns the links for one episode as list def getLinks(self): accepted_hosters = re.findall(r'\b(\w+?)\b', self.getConfig('accepted_hosters')) + firstN = self.getConfig('firstN') links = [] ## h_id: hoster_id of a possible hoster re_hoster_id_js = re.compile(r'links\[(\d+?)\].+ (.+?)
') @@ -88,22 +93,21 @@ class Movie2kTo(Crypter): re_hoster_id = re_hoster_id_js elif re_hoster_id_html.search(self.html): re_hoster_id = re_hoster_id_html + count = 0 for h_id, hoster in re_hoster_id.findall(self.html): if hoster in accepted_hosters: - if h_id != self.id: - self.html = self.load('%s/tvshows-%s-%s.html' % (self.BASE_URL, h_id, self.name)) - else: - self.logDebug('This is already the right ID') - try: - url = re.search(r' Date: Mon, 11 Mar 2013 21:12:25 +0100 Subject: made the firstN setting ready for more than one hoster --- module/plugins/crypter/Movie2kTo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index 1b93dfa78..d1c711f17 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -93,11 +93,11 @@ class Movie2kTo(Crypter): re_hoster_id = re_hoster_id_js elif re_hoster_id_html.search(self.html): re_hoster_id = re_hoster_id_html - count = 0 + count = defaultdict(int) for h_id, hoster in re_hoster_id.findall(self.html): if hoster in accepted_hosters: - count += 1 - if count <= firstN: + count[hoster] += 1 + if count[hoster] <= firstN: if h_id != self.id: self.html = self.load('%s/tvshows-%s-%s.html' % (self.BASE_URL, h_id, self.name)) else: -- cgit v1.2.3 From 728e322eea109d4245199179d9dfbeb98966dba2 Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Tue, 12 Mar 2013 11:18:57 +0100 Subject: Movie2kTo: fixed regex to be more reliable --- module/plugins/crypter/Movie2kTo.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index d1c711f17..c32f6f930 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -87,15 +87,19 @@ class Movie2kTo(Crypter): links = [] ## h_id: hoster_id of a possible hoster re_hoster_id_js = re.compile(r'links\[(\d+?)\].+ (.+?)') - re_hoster_id_html = re.compile(r'') + re_hoster_id_html = re.compile(r'') ## I assume that the ID is 7 digits longs if re_hoster_id_js.search(self.html): re_hoster_id = re_hoster_id_js + self.logDebug('Assuming that the ID can be found in a JavaScript section.') elif re_hoster_id_html.search(self.html): re_hoster_id = re_hoster_id_html + self.logDebug('Assuming that the ID can be found in a HTML section.') count = defaultdict(int) for h_id, hoster in re_hoster_id.findall(self.html): + # self.logDebug('Hoster %s' % hoster) if hoster in accepted_hosters: + # self.logDebug('Accepted %s' % hoster) count[hoster] += 1 if count[hoster] <= firstN: if h_id != self.id: -- cgit v1.2.3 From 121024ca7ee705e2fed5e8705d25484288922b41 Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Tue, 12 Mar 2013 12:55:55 +0100 Subject: Movie2kTo: fixed hoster recognition It appeared to me that the hoster and the id of a video can be present in either a JavaScript section or in a HTML section on *one* page. I first assumed that all hosters on one page can be found ether in a JavaScript section or in a HTML section. --- module/plugins/crypter/Movie2kTo.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index c32f6f930..3be3be73c 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -89,17 +89,12 @@ class Movie2kTo(Crypter): re_hoster_id_js = re.compile(r'links\[(\d+?)\].+ (.+?)') re_hoster_id_html = re.compile(r'') ## I assume that the ID is 7 digits longs - if re_hoster_id_js.search(self.html): - re_hoster_id = re_hoster_id_js - self.logDebug('Assuming that the ID can be found in a JavaScript section.') - elif re_hoster_id_html.search(self.html): - re_hoster_id = re_hoster_id_html - self.logDebug('Assuming that the ID can be found in a HTML section.') count = defaultdict(int) - for h_id, hoster in re_hoster_id.findall(self.html): - # self.logDebug('Hoster %s' % hoster) + matches = re_hoster_id_js.findall(self.html) + matches += re_hoster_id_html.findall(self.html) + for h_id, hoster in matches: if hoster in accepted_hosters: - # self.logDebug('Accepted %s' % hoster) + self.logDebug('Accepted: %s, ID: %s' % (hoster, h_id)) count[hoster] += 1 if count[hoster] <= firstN: if h_id != self.id: @@ -112,6 +107,8 @@ class Movie2kTo(Crypter): links.append(url) except: self.logDebug('Failed to find the URL') + else: + self.logDebug('Not accepted: %s, ID: %s' % (hoster, h_id)) self.logDebug(links) return links -- cgit v1.2.3 From 6108a1b42e4db6d211e934a2548168981761f7c6 Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Tue, 12 Mar 2013 13:15:41 +0100 Subject: =?UTF-8?q?moved=20ChipDe=20to=20the=20hoster=20plugins=20?= =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/plugins/crypter/ChipDe.py | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 module/plugins/crypter/ChipDe.py (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/ChipDe.py b/module/plugins/crypter/ChipDe.py deleted file mode 100644 index fcb84a300..000000000 --- a/module/plugins/crypter/ChipDe.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import re -from module.plugins.Crypter import Crypter - -class ChipDe(Crypter): - __name__ = "ChipDe" - __type__ = "container" - __pattern__ = r"http://(?:www\.)?chip.de/video/.*\.html" - __version__ = "0.1" - __description__ = """Chip.de Container Plugin""" - __author_name__ = ('4Christopher') - __author_mail__ = ('4Christopher@gmx.de') - - def decrypt(self, pyfile): - self.html = self.load(pyfile.url) - try: - url = re.search(r'"(http://video.chip.de/\d+?/.*)"', self.html).group(1) - self.logDebug('The file URL is %s' % url) - except: - self.fail('Failed to find the URL') - - self.packages.append((self.pyfile.package().name, [ url ], self.pyfile.package().folder)) -- cgit v1.2.3 From c8867a5291cb1ccdd5e7f9cadd06f7f600d6920d Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Wed, 13 Mar 2013 17:37:38 +0100 Subject: Movie2kTo: Changed regex. I hope it now matches every site. --- module/plugins/crypter/Movie2kTo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index 3be3be73c..506ad2eaf 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -87,7 +87,7 @@ class Movie2kTo(Crypter): links = [] ## h_id: hoster_id of a possible hoster re_hoster_id_js = re.compile(r'links\[(\d+?)\].+ (.+?)') - re_hoster_id_html = re.compile(r'') + re_hoster_id_html = re.compile(r']+?)') ## I assume that the ID is 7 digits longs count = defaultdict(int) matches = re_hoster_id_js.findall(self.html) -- cgit v1.2.3 From 843afa1d72956f4e5ab35c1908586501e50c4e99 Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Wed, 13 Mar 2013 19:06:24 +0100 Subject: Movie2kTo: Added quality recognition. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sites without a quality value will fail with this version … But on the other hand the current pattern relies on the quality value … --- module/plugins/crypter/Movie2kTo.py | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index 506ad2eaf..7595c845d 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -27,6 +27,7 @@ class Movie2kTo(Crypter): def decrypt(self, pyfile): self.package = pyfile.package() self.folder = self.package.folder + self.q = [] ## to calculate the average, min and max of the quality whole_season = self.getConfig('whole_season') everything = self.getConfig('everything') self.getInfo(pyfile.url) @@ -46,10 +47,18 @@ class Movie2kTo(Crypter): season_links += self.getInfoAndLinks('%s/%s' % (self.BASE_URL, url_path)) self.logDebug(season_links) - self.packages.append(('%s: Season %s' % (self.name, season), season_links, 'Season %s' % season)) + self.packages.append(('%s: Season %s (%s)' + % (self.name, season, self.qStat()), season_links, 'Season %s' % season)) + self.q = [] else: - self.packages.append((self.package.name, self.getLinks(), self.package.folder)) + links = self.getLinks() + self.package.name = '%s%s' % (self.package.name, self.qStat()) + self.packages.append((self.package.name, links , self.package.folder)) + def qStat(self): + if len(self.q) == 0: return '' + return (' (Average quality: %d, min: %d, max: %d)' + % (sum(self.q) / float(len(self.q)), min(self.q), max(self.q))) def tvshow_number(self, number): if int(number) < 10: return '0%s' % number @@ -85,18 +94,22 @@ class Movie2kTo(Crypter): accepted_hosters = re.findall(r'\b(\w+?)\b', self.getConfig('accepted_hosters')) firstN = self.getConfig('firstN') links = [] - ## h_id: hoster_id of a possible hoster - re_hoster_id_js = re.compile(r'links\[(\d+?)\].+ (.+?)') - re_hoster_id_html = re.compile(r']+?)') + re_quality = r'.+?Quality:.+?smileys/(\d)\.gif' + ## The quality is one digit. 0 is the worst and 5 is the best. + ## Is not always there … + re_hoster_id_html = re.compile(r']+?)' + re_quality) + re_hoster_id_js = re.compile(r'links\[(\d+?)\].+ (.+?)' + re_quality) ## I assume that the ID is 7 digits longs count = defaultdict(int) - matches = re_hoster_id_js.findall(self.html) - matches += re_hoster_id_html.findall(self.html) - for h_id, hoster in matches: + matches = re_hoster_id_html.findall(self.html) + matches += re_hoster_id_js.findall(self.html) + ## h_id: hoster_id of a possible hoster + for h_id, hoster, quality in matches: if hoster in accepted_hosters: - self.logDebug('Accepted: %s, ID: %s' % (hoster, h_id)) + self.logDebug('Accepted: %s, ID: %s, Quality: %s' % (hoster, h_id, quality)) count[hoster] += 1 if count[hoster] <= firstN: + self.q.append(int(quality)) if h_id != self.id: self.html = self.load('%s/tvshows-%s-%s.html' % (self.BASE_URL, h_id, self.name)) else: @@ -108,7 +121,7 @@ class Movie2kTo(Crypter): except: self.logDebug('Failed to find the URL') else: - self.logDebug('Not accepted: %s, ID: %s' % (hoster, h_id)) + self.logDebug('Not accepted: %s, ID: %s, Quality: %s' % (hoster, h_id, quality)) - self.logDebug(links) + # self.logDebug(links) return links -- cgit v1.2.3 From 1e8bd2ee4ed5818eb1b79c36946579229adede9e Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Wed, 13 Mar 2013 20:28:44 +0100 Subject: Movie2kTo: Fixed and tested it. --- module/plugins/crypter/Movie2kTo.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/Movie2kTo.py b/module/plugins/crypter/Movie2kTo.py index 7595c845d..f5800b498 100644 --- a/module/plugins/crypter/Movie2kTo.py +++ b/module/plugins/crypter/Movie2kTo.py @@ -27,7 +27,7 @@ class Movie2kTo(Crypter): def decrypt(self, pyfile): self.package = pyfile.package() self.folder = self.package.folder - self.q = [] ## to calculate the average, min and max of the quality + self.qStatReset() whole_season = self.getConfig('whole_season') everything = self.getConfig('everything') self.getInfo(pyfile.url) @@ -49,7 +49,7 @@ class Movie2kTo(Crypter): self.logDebug(season_links) self.packages.append(('%s: Season %s (%s)' % (self.name, season, self.qStat()), season_links, 'Season %s' % season)) - self.q = [] + self.qStatReset() else: links = self.getLinks() self.package.name = '%s%s' % (self.package.name, self.qStat()) @@ -57,8 +57,11 @@ class Movie2kTo(Crypter): def qStat(self): if len(self.q) == 0: return '' - return (' (Average quality: %d, min: %d, max: %d)' - % (sum(self.q) / float(len(self.q)), min(self.q), max(self.q))) + return (' (Average quality: %d, min: %d, max: %d, %s, max (all hosters): %d)' + % (sum(self.q) / float(len(self.q)), min(self.q), max(self.q), self.q, self.max_q)) + def qStatReset(self): + self.q = [] ## to calculate the average, min and max of the quality + self.max_q = None def tvshow_number(self, number): if int(number) < 10: return '0%s' % number @@ -94,22 +97,33 @@ class Movie2kTo(Crypter): accepted_hosters = re.findall(r'\b(\w+?)\b', self.getConfig('accepted_hosters')) firstN = self.getConfig('firstN') links = [] - re_quality = r'.+?Quality:.+?smileys/(\d)\.gif' + re_quality = re.compile(r'.+?Quality:.+?smileys/(\d)\.gif') ## The quality is one digit. 0 is the worst and 5 is the best. ## Is not always there … - re_hoster_id_html = re.compile(r']+?)' + re_quality) - re_hoster_id_js = re.compile(r'links\[(\d+?)\].+ (.+?)' + re_quality) + re_hoster_id_html = re.compile(r'(?:]+?)(.+?)') + re_hoster_id_js = re.compile(r'links\[(\d+?)\].+ (.+?)(.+?)') ## I assume that the ID is 7 digits longs count = defaultdict(int) matches = re_hoster_id_html.findall(self.html) matches += re_hoster_id_js.findall(self.html) + # self.logDebug(matches) ## h_id: hoster_id of a possible hoster - for h_id, hoster, quality in matches: + for h_id, hoster, q_html in matches: + match_q = re_quality.search(q_html) + if match_q: + quality = int(match_q.group(1)) + if self.max_q: + if self.max_q < quality: self.max_q = quality + else: ## was None before + self.max_q = quality + q_s = ', Quality: %d' % quality + else: + q_s = ', unknown quality' if hoster in accepted_hosters: - self.logDebug('Accepted: %s, ID: %s, Quality: %s' % (hoster, h_id, quality)) + self.logDebug('Accepted: %s, ID: %s%s' % (hoster, h_id, q_s)) count[hoster] += 1 if count[hoster] <= firstN: - self.q.append(int(quality)) + if match_q: self.q.append(quality) if h_id != self.id: self.html = self.load('%s/tvshows-%s-%s.html' % (self.BASE_URL, h_id, self.name)) else: @@ -121,7 +135,7 @@ class Movie2kTo(Crypter): except: self.logDebug('Failed to find the URL') else: - self.logDebug('Not accepted: %s, ID: %s, Quality: %s' % (hoster, h_id, quality)) + self.logDebug('Not accepted: %s, ID: %s%s' % (hoster, h_id, q_s)) # self.logDebug(links) return links -- cgit v1.2.3 From 8342aad089589479650703de915a356d634b202b Mon Sep 17 00:00:00 2001 From: Stefano Date: Sat, 23 Mar 2013 22:32:28 +0100 Subject: Plugins: fixed inconsistent indentation --- module/plugins/crypter/LixIn.py | 19 +++++++++---------- module/plugins/crypter/TrailerzoneInfo.py | 4 ++-- 2 files changed, 11 insertions(+), 12 deletions(-) (limited to 'module/plugins/crypter') diff --git a/module/plugins/crypter/LixIn.py b/module/plugins/crypter/LixIn.py index 1ed5510fd..e2ee30731 100644 --- a/module/plugins/crypter/LixIn.py +++ b/module/plugins/crypter/LixIn.py @@ -33,7 +33,7 @@ class LixIn(Crypter): matches = re.search(self.SUBMIT_PATTERN,self.html) if not matches: - self.fail("link doesn't seem valid") + self.fail("link doesn't seem valid") matches = re.search(self.CAPTCHA_PATTERN, self.html) if matches: @@ -42,20 +42,19 @@ class LixIn(Crypter): if matches: self.logDebug("trying captcha") captcharesult = self.decryptCaptcha("http://lix.in/"+matches.group("image")) - self.html = self.req.load(url, decode=True, post={"capt" : captcharesult, "submit":"submit","tiny":id}) - else: - self.logDebug("no captcha/captcha solved") - break - else: + self.html = self.req.load(url, decode=True, post={"capt" : captcharesult, "submit":"submit","tiny":id}) + else: + self.logDebug("no captcha/captcha solved") + break + else: self.html = self.req.load(url, decode=True, post={"submit" : "submit", - "tiny" : id}) - + "tiny" : id}) + matches = re.search(self.LINK_PATTERN, self.html) if not matches: - self.fail("can't find destination url") + self.fail("can't find destination url") new_link = matches.group("link") self.logDebug("Found link %s, adding to package" % new_link) self.packages.append((self.pyfile.package().name, [new_link], self.pyfile.package().name)) - \ No newline at end of file diff --git a/module/plugins/crypter/TrailerzoneInfo.py b/module/plugins/crypter/TrailerzoneInfo.py index 2683c2429..43a4fcce5 100644 --- a/module/plugins/crypter/TrailerzoneInfo.py +++ b/module/plugins/crypter/TrailerzoneInfo.py @@ -22,10 +22,10 @@ class TrailerzoneInfo(Crypter): self.handleProtect(url) elif goPattern.match(url): self.handleGo(url) - + def handleProtect(self, url): self.handleGo("http://trailerzone.info/go.html#:::" + url.split("#:::",1)[1]) - + def handleGo(self, url): src = self.req.load(str(url)) -- cgit v1.2.3