diff --git a/resolv/__init__.py b/resolv/__init__.py index 6c0ac33..aceb7e9 100644 --- a/resolv/__init__.py +++ b/resolv/__init__.py @@ -1,21 +1,28 @@ import re -from resolvers import * +import resolvers def resolve(url): if re.match("https?:\/\/(www\.)?putlocker\.com", url) is not None: - return putlocker.resolve(url) + task = resolvers.PutlockerTask(url) + return task.run() elif re.match("https?:\/\/(www\.)?sockshare\.com", url) is not None: - return sockshare.resolve(url) + task = resolvers.SockshareTask(url) + return task.run() elif re.match("https?:\/\/(www\.)?1channel\.ch\/external\.php", url) is not None: - return onechannel.resolve(url) + task = resolvers.OneChannelTask(url) + return task.run() elif re.match("https?:\/\/(www\.)?youtube\.com\/watch\?", url) is not None: - return youtube.resolve(url) + task = resolvers.YoutubeTask(url) + return task.run() elif re.match("https?:\/\/(www\.)?filebox\.com\/[a-zA-Z0-9]+", url) is not None: - return filebox.resolve(url) + task = resolvers.FileboxTask(url) + return task.run() elif re.match("https?:\/\/(www\.)?pastebin\.com\/[a-zA-Z0-9]+", url) is not None: - return pastebin.resolve(url) + task = resolvers.PastebinTask(url) + return task.run() elif re.match("https?:\/\/(www\.)?mediafire\.com\/\?[a-z0-9]+", url) is not None: - return mediafire.resolve(url) + task = resolvers.MediafireTask(url) + return task.run() else: return {} @@ -25,10 +32,10 @@ def recurse(url): while True: result = resolve(url) - if result == {}: + if result.state != "finished": return previous_result - elif 'url' not in result: + elif result.result_type != "url": return result - url = result['url'] + url = result.results['url'] previous_result = result diff --git a/resolv/resolvers/dummy.py b/resolv/resolvers/dummy.py index deeb57f..152a78c 100644 --- a/resolv/resolvers/dummy.py +++ b/resolv/resolvers/dummy.py @@ -1,2 +1,9 @@ -def resolve(input): - return {'dummy': input} +from resolv.shared import Task + +class DummyTask(Task): + result_type = "dummy" + + def run(self): + self.results = {'dummy': self.url} + self.state = "finished" + return self diff --git a/resolv/resolvers/filebox.py b/resolv/resolvers/filebox.py index c8bdff1..cc6c27a 100644 --- a/resolv/resolvers/filebox.py +++ b/resolv/resolvers/filebox.py @@ -1,70 +1,43 @@ import re, time, urllib2 -from resolv.shared import ResolverError +from resolv.shared import ResolverError, Task -def resolve(url): - matches = re.search("https?:\/\/(www\.)?filebox\.com\/([a-zA-Z0-9]+)", url) - - if matches is None: - raise ResolverError("The provided URL is not a valid Filebox.com URL.") - - video_id = matches.group(2) - - try: - contents = urllib2.urlopen("http://www.filebox.com/embed-%s-970x543.html" % video_id).read() - except: - raise ResolverError("Could not retrieve the video page.") - - matches = re.search("url: '([^']+)',", contents) - - if matches is None: - raise ResolverError("No video was found on the specified URL.") - - video_file = matches.group(1) - - stream_dict = { - 'url' : video_file, - 'quality' : "unknown", - 'priority' : 1, - 'format' : "unknown" - } - - return { 'title': "", 'videos': [stream_dict] } - -def resolve2(url): - # This is a fallback function in case no video could be found through the resolve() method. - # It's not recommended to use it, as it introduces a 5 second wait. - - try: - import mechanize - except ImportError: - raise ResolverError("The Python mechanize module is required to resolve Filebox.com URLs.") - - matches = re.search("https?:\/\/(www\.)?filebox\.com\/([a-zA-Z0-9]+)", url) - - if matches is None: - raise ResolverError("The provided URL is not a valid Filebox.com URL.") - - try: - browser = mechanize.Browser() - browser.set_handle_robots(False) - browser.open(url) - except: - raise ResolverError("The Filebox.com site could not be reached.") - - time.sleep(6) - - try: - browser.select_form(nr=0) - result = browser.submit() - page = result.read() - except Exception, e: - raise ResolverError("The file was removed, or the URL is incorrect.") - - matches = re.search("this\.play\('([^']+)'\)", page) - - if matches is None: - raise ResolverError("No video file was found on the given URL; the Filebox.com server for this file may be in maintenance mode, or the given URL may not be a video file. The Filebox.com resolver currently only supports video links.") - - video_file = matches.group(1) - - return { 'title': "", 'videos': { 'video': video_file } } +class FileboxTask(Task): + result_type = "video" + + def run(self): + matches = re.search("https?:\/\/(www\.)?filebox\.com\/([a-zA-Z0-9]+)", self.url) + + if matches is None: + self.state = "invalid" + raise ResolverError("The provided URL is not a valid Filebox.com URL.") + + video_id = matches.group(2) + + try: + contents = self.fetch_page("http://www.filebox.com/embed-%s-970x543.html" % video_id) + except urllib2.URLError, e: + self.state = "failed" + raise ResolverError("Could not retrieve the video page.") + + matches = re.search("url: '([^']+)',", contents) + + if matches is None: + self.state = "invalid" + raise ResolverError("No video was found on the specified URL. The Filebox.com resolver currently only supports videos.") + + video_file = matches.group(1) + + stream_dict = { + 'url' : video_file, + 'quality' : "unknown", + 'priority' : 1, + 'format' : "unknown" + } + + self.results = { + 'title': "", + 'videos': [stream_dict] + } + + self.state = "finished" + return self diff --git a/resolv/resolvers/mediafire.py b/resolv/resolvers/mediafire.py index 1e3641a..a3452af 100644 --- a/resolv/resolvers/mediafire.py +++ b/resolv/resolvers/mediafire.py @@ -1,28 +1,40 @@ import re, urllib2 -from resolv.shared import ResolverError, unescape +from resolv.shared import ResolverError, unescape, Task -def resolve(url): - try: - contents = urllib2.urlopen(url).read() - except: - raise ResolverError("Could not retrieve the specified URL.") +class MediafireTask(Task): + result_type = "file" - matches = re.search('kNO = "([^"]+)";', contents) - - if matches is None: - raise ResolverError("No download was found on the given URL; the server for this file may be in maintenance mode, or the given URL may not be valid. It is also possible that you have been blocked - CAPTCHA support is not yet present.") - - file_url = matches.group(1) - - try: - file_title = unescape(re.search('