From 01c2ebae48c1880a395f626a0e5e423c4348e88a Mon Sep 17 00:00:00 2001 From: Sven Slootweg Date: Tue, 5 Jun 2012 04:22:53 +0200 Subject: [PATCH] Added Sockshare resolver --- resolvers/sockshare.py | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 resolvers/sockshare.py diff --git a/resolvers/sockshare.py b/resolvers/sockshare.py new file mode 100644 index 0000000..538783a --- /dev/null +++ b/resolvers/sockshare.py @@ -0,0 +1,49 @@ +import re +from resolv.shared import ResolverError + +def resolve(url): + try: + import mechanize + except ImportError: + raise 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.") + + video_id = matches.group(3) + + try: + browser = mechanize.Browser() + browser.set_handle_robots(False) + browser.open("http://sockshare.com/embed/%s" % video_id) + except: + raise ResolverError("The Sockshare site could not be reached.") + + try: + browser.select_form(nr=0) + result = browser.submit() + except Exception, e: + raise ResolverError("The file was removed, or the URL is incorrect.") + + matches = re.search("playlist: '([^']+)'", result.read()) + + 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.") + + 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.") + + 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.") + + video_file = matches.group(1) + + return { 'video': video_file }