diff --git a/resolv/__init__.py b/resolv/__init__.py
index 6c0ac33..dd7d0dd 100644
--- a/resolv/__init__.py
+++ b/resolv/__init__.py
@@ -1,6 +1,12 @@
-import re
+import re, sys
from resolvers import *
+from HTMLParser import HTMLParser
+# Fix encoding to deal with UTF-8 page contents
+reload(sys)
+sys.setdefaultencoding("UTF-8")
+
+# Main functions
def resolve(url):
if re.match("https?:\/\/(www\.)?putlocker\.com", url) is not None:
return putlocker.resolve(url)
@@ -32,3 +38,15 @@ def recurse(url):
url = result['url']
previous_result = result
+
+# Exception classes
+class ResolverError(Exception):
+ def __init__(self, value):
+ self.val = value
+
+ def __str__(self):
+ return repr(self.val)
+
+# Utility functions
+def unescape(s):
+ return HTMLParser.unescape.__func__(HTMLParser, s)
diff --git a/resolv/resolvers/filebox.py b/resolv/resolvers/filebox.py
index c8bdff1..f2afa70 100644
--- a/resolv/resolvers/filebox.py
+++ b/resolv/resolvers/filebox.py
@@ -1,23 +1,23 @@
import re, time, urllib2
-from resolv.shared import ResolverError
+import resolv
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.")
+ raise resolv.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.")
+ raise resolv.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.")
+ raise resolv.ResolverError("No video was found on the specified URL.")
video_file = matches.group(1)
@@ -37,19 +37,19 @@ def resolve2(url):
try:
import mechanize
except ImportError:
- raise ResolverError("The Python mechanize module is required to resolve Filebox.com URLs.")
+ raise resolv.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.")
+ raise resolv.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.")
+ raise resolv.ResolverError("The Filebox.com site could not be reached.")
time.sleep(6)
@@ -58,12 +58,12 @@ def resolve2(url):
result = browser.submit()
page = result.read()
except Exception, e:
- raise ResolverError("The file was removed, or the URL is incorrect.")
+ raise resolv.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.")
+ raise resolv.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)
diff --git a/resolv/resolvers/mediafire.py b/resolv/resolvers/mediafire.py
index 1e3641a..2692d95 100644
--- a/resolv/resolvers/mediafire.py
+++ b/resolv/resolvers/mediafire.py
@@ -1,23 +1,23 @@
import re, urllib2
-from resolv.shared import ResolverError, unescape
+import resolv
def resolve(url):
try:
contents = urllib2.urlopen(url).read()
except:
- raise ResolverError("Could not retrieve the specified URL.")
+ raise resolv.ResolverError("Could not retrieve the specified URL.")
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.")
+ raise resolv.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('
([^<]+)<\/title>', contents).group(1))
except:
- raise ResolverError("Could not find the download title.")
+ raise resolv.ResolverError("Could not find the download title.")
file_dict = {
'url' : file_url,
diff --git a/resolv/resolvers/onechannel.py b/resolv/resolvers/onechannel.py
index d94ed7d..ea3aee9 100644
--- a/resolv/resolvers/onechannel.py
+++ b/resolv/resolvers/onechannel.py
@@ -1,15 +1,15 @@
import re, base64
-from resolv.shared import ResolverError
+import resolv
def resolve(url):
matches = re.search("https?:\/\/(www\.)?1channel\.ch\/external\.php\?.*url=([^&]+)", url)
if matches is None:
- raise ResolverError("The provided URL is not a valid external 1channel URL.")
+ raise resolv.ResolverError("The provided URL is not a valid external 1channel URL.")
try:
real_url = base64.b64decode(matches.group(2)).strip()
except TypeError:
- raise ResolverError("The provided URL is malformed.")
+ raise resolv.ResolverError("The provided URL is malformed.")
return { 'url': real_url }
diff --git a/resolv/resolvers/pastebin.py b/resolv/resolvers/pastebin.py
index 4f2089f..60def2f 100644
--- a/resolv/resolvers/pastebin.py
+++ b/resolv/resolvers/pastebin.py
@@ -1,23 +1,23 @@
import re, urllib, urllib2
-from resolv.shared import ResolverError, unescape
+import resolv
def resolve(url):
matches = re.search("https?:\/\/(www\.)?pastebin\.com\/([a-zA-Z0-9]+)", url)
if matches is None:
- raise ResolverError("The provided URL is not a valid Pastebin URL.")
+ raise resolv.ResolverError("The provided URL is not a valid Pastebin URL.")
paste_id = matches.group(2)
try:
contents = urllib2.urlopen(url).read()
except:
- raise ResolverError("Could not retrieve the specified URL. The specified paste may not exist.")
+ raise resolv.ResolverError("Could not retrieve the specified URL. The specified paste may not exist.")
matches = re.search("([^<]+)
", contents)
if matches is None:
- raise ResolverError("The provided URL is not a valid paste.")
+ raise resolv.ResolverError("The provided URL is not a valid paste.")
paste_title = unescape(matches.group(1))
diff --git a/resolv/resolvers/putlocker.py b/resolv/resolvers/putlocker.py
index b603e3a..b527d18 100644
--- a/resolv/resolvers/putlocker.py
+++ b/resolv/resolvers/putlocker.py
@@ -1,5 +1,5 @@
import re
-from resolv.shared import ResolverError, unescape
+import resolv
def resolve(url):
try:
@@ -10,7 +10,7 @@ def resolve(url):
matches = re.search("https?:\/\/(www\.)?putlocker\.com\/(file|embed)\/([A-Z0-9]+)", url)
if matches is None:
- raise ResolverError("The provided URL is not a valid PutLocker URL.")
+ raise resolv.ResolverError("The provided URL is not a valid PutLocker URL.")
video_id = matches.group(3)
@@ -19,38 +19,38 @@ def resolve(url):
browser.set_handle_robots(False)
browser.open("http://putlocker.com/embed/%s" % video_id)
except:
- raise ResolverError("The PutLocker site could not be reached.")
+ raise resolv.ResolverError("The PutLocker site could not be reached.")
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.")
+ raise resolv.ResolverError("The file was removed, or the URL is incorrect.")
matches = re.search("playlist: '([^']+)'", page)
if matches is None:
- raise ResolverError("No playlist was found on the given URL; the PutLocker server for this file may be in maintenance mode, or the given URL may not be a video file. The PutLocker resolver currently only supports video links.")
+ raise resolv.ResolverError("No playlist was found on the given URL; the PutLocker server for this file may be in maintenance mode, or the given URL may not be a video file. The PutLocker resolver currently only supports video links.")
playlist = matches.group(1)
try:
browser.open("http://www.putlocker.com%s" % playlist)
except:
- raise ResolverError("The playlist file for the given URL could not be loaded.")
+ raise resolv.ResolverError("The playlist file for the given URL could not be loaded.")
matches = re.search("url=\"([^\"]+)\" type=\"video\/x-flv\"", browser.response().read())
if matches is None:
- raise ResolverError("The playlist file does not contain any video URLs. The PutLocker resolver currently only supports video links.")
+ raise resolv.ResolverError("The playlist file does not contain any video URLs. The PutLocker resolver currently only supports video links.")
video_file = matches.group(1)
try:
- video_title = unescape(re.search(']*>([^<]*)<\/strong><\/a>', page).group(1))
+ video_title = resolv.unescape(re.search(']*>([^<]*)<\/strong><\/a>', page).group(1))
except:
- raise ResolverError("Could not find the video title.")
+ raise resolv.ResolverError("Could not find the video title.")
stream_dict = {
'url' : video_file,
diff --git a/resolv/resolvers/sockshare.py b/resolv/resolvers/sockshare.py
index 079b110..ee21596 100644
--- a/resolv/resolvers/sockshare.py
+++ b/resolv/resolvers/sockshare.py
@@ -1,16 +1,16 @@
import re
-from resolv.shared import ResolverError, unescape
+import resolv
def resolve(url):
try:
import mechanize
except ImportError:
- raise ResolverError("The Python mechanize module is required to resolve SockShare URLs.")
+ raise resolv.ResolverError("The Python mechanize module is required to resolve SockShare URLs.")
matches = re.search("https?:\/\/(www\.)?sockshare\.com\/(file|embed)\/([A-Z0-9]+)", url)
if matches is None:
- raise ResolverError("The provided URL is not a valid SockShare URL.")
+ raise resolv.ResolverError("The provided URL is not a valid SockShare URL.")
video_id = matches.group(3)
@@ -19,38 +19,38 @@ def resolve(url):
browser.set_handle_robots(False)
browser.open("http://sockshare.com/embed/%s" % video_id)
except:
- raise ResolverError("The SockShare site could not be reached.")
+ raise resolv.ResolverError("The SockShare site could not be reached.")
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.")
+ raise resolv.ResolverError("The file was removed, or the URL is incorrect.")
matches = re.search("playlist: '([^']+)'", page)
if matches is None:
- raise ResolverError("No playlist was found on the given URL; the SockShare server for this file may be in maintenance mode, or the given URL may not be a video file. The SockShare resolver currently only supports video links.")
+ raise resolv.ResolverError("No playlist was found on the given URL; the SockShare server for this file may be in maintenance mode, or the given URL may not be a video file. The SockShare resolver currently only supports video links.")
playlist = matches.group(1)
try:
browser.open("http://www.sockshare.com%s" % playlist)
except:
- raise ResolverError("The playlist file for the given URL could not be loaded.")
+ raise resolv.ResolverError("The playlist file for the given URL could not be loaded.")
matches = re.search("url=\"([^\"]+)\" type=\"video\/x-flv\"", browser.response().read())
if matches is None:
- raise ResolverError("The playlist file does not contain any video URLs. The SockShare resolver currently only supports video links.")
+ raise resolv.ResolverError("The playlist file does not contain any video URLs. The SockShare resolver currently only supports video links.")
video_file = matches.group(1)
try:
video_title = unescape(re.search(']*>([^<]*)<\/strong><\/a>', page).group(1))
except:
- raise ResolverError("Could not find the video title.")
+ raise resolv.ResolverError("Could not find the video title.")
stream_dict = {
'url' : video_file,
diff --git a/resolv/resolvers/youtube.py b/resolv/resolvers/youtube.py
index 6ffd2e1..664c600 100644
--- a/resolv/resolvers/youtube.py
+++ b/resolv/resolvers/youtube.py
@@ -1,11 +1,11 @@
import re, urllib, urllib2
-from resolv.shared import ResolverError, unescape
+import resolv
def resolve(url):
try:
contents = urllib2.urlopen(url).read()
except:
- raise ResolverError("Could not retrieve the specified URL.")
+ raise resolv.ResolverError("Could not retrieve the specified URL.")
map_start = "url_encoded_fmt_stream_map="
map_end = "\\u0026amp;"
@@ -14,19 +14,19 @@ def resolve(url):
pos_start = contents.index(map_start) + len(map_start) + 6
snippet = contents[pos_start:]
except ValueError:
- raise ResolverError("The starting position for the YouTube player configuration could not be found. Is the URL really a valid video page?")
+ raise resolv.ResolverError("The starting position for the YouTube player configuration could not be found. Is the URL really a valid video page?")
try:
pos_end = snippet.index(map_end)
stream_map = snippet[:pos_end]
except ValueError:
- raise ResolverError("The ending position for the YouTube player configuration could not be found.")
+ raise resolv.ResolverError("The ending position for the YouTube player configuration could not be found.")
try:
stream_map = urllib.unquote(stream_map)
streams = stream_map.split(',url=')
except:
- raise ResolverError("The YouTube player configuration is corrupted.")
+ raise resolv.ResolverError("The YouTube player configuration is corrupted.")
stream_pool = []
@@ -34,7 +34,7 @@ def resolve(url):
fields = stream.split('&')
if len(fields) < 5:
- raise ResolverError("The amount of fields in the YouTube player configuration is incorrect.")
+ raise resolv.ResolverError("The amount of fields in the YouTube player configuration is incorrect.")
video_url = urllib.unquote(fields[0])
quality = fields[1].split("=")[1]
@@ -83,6 +83,6 @@ def resolve(url):
try:
video_title = unescape(re.search('', contents).group(1))
except:
- raise ResolverError("Could not find the video title.")
+ raise resolv.ResolverError("Could not find the video title.")
return { 'title': video_title, 'videos': stream_pool }
diff --git a/resolv/shared.py b/resolv/shared.py
deleted file mode 100644
index a668870..0000000
--- a/resolv/shared.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from HTMLParser import HTMLParser
-
-import sys
-reload(sys)
-sys.setdefaultencoding("UTF-8")
-
-class ResolverError(Exception):
- def __init__(self, value):
- self.val = value
-
- def __str__(self):
- return repr(self.val)
-
-def unescape(s):
- return HTMLParser.unescape.__func__(HTMLParser, s)