diff options
Diffstat (limited to 'lib/param/img_url.py')
| -rw-r--r-- | lib/param/img_url.py | 179 |
1 files changed, 96 insertions, 83 deletions
diff --git a/lib/param/img_url.py b/lib/param/img_url.py index 4ce7ce7..69e3d66 100644 --- a/lib/param/img_url.py +++ b/lib/param/img_url.py @@ -1,98 +1,111 @@ +"""Img_url param class definition lives here""" import os -from param import Param -from config import * -import urllib, urllib2 +from .param import Param +from config import MAX_SIZE, SPECIAL_DOWNLOADERS, SPECIAL_DOWNLOADERS_MAX_SIZE,\ + BIN_IDENTIFY +import urllib2 from subprocess import Popen, PIPE import sys -Request = urllib2.Request -urlencode = urllib.urlencode -urlopen = urllib2.urlopen -Request = urllib2.Request -urlencode = urllib.urlencode -urlopen = urllib2.urlopen -import sys; class Img_url(Param): - def __init__(self, value, key="", classname=""): - super(Img_url, self).__init__(classname=classname) - if value: - try: - self.filename = self._filename_temporary(key) + def __init__(self, value, key="", classname=""): + """Defines the float param type. + Takes in a url, sends a get request to the url, writes the response + to a temporary filename, and checks the mimetype with imagemagick. + Img_url class is different from other params in that it has + the attributes: + url: the original url used to retrieve the image + filename: the filename created to store the image + filepath: complete path to the stored image file + mimetype: the mimetype of the image + Args: + value: the image url string + key: the intended name of the param instance + classname: the name of the class to which the param belongs + """ + super(Img_url, self).__init__(classname=classname) + if value: + try: + self.filename = self._filename_temporary(key) - self.path = os.path.join(self._working_dir, self.filename) - self._image_download(value, self.path) - self.mimetype = self._image_mimetype(self.path) - self.url = value - except Exception as e: - self.err_warn("Unable to download image: %s" % str(value)) - self.err_warn(str(e)) + self.path = os.path.join(self._working_dir, self.filename) + self._image_download(value, self.path) + self.mimetype = self._image_mimetype(self.path) + self.url = value + except Exception as e: + self.err_warn("Unable to download image: %s" % str(value)) + self.err_warn(str(e)) - def _filename_temporary(self, s): - return "_tmp-{}-{}_{}".format(self._classname, self._now, s) - - def __dict__(self): - return { - 'filename' : self.filename, - 'path': self.path, - 'url': self.url, - 'mimetype': self.mimetype - } + def _filename_temporary(self, s): + return "_tmp-{}-{}_{}".format(self._classname, self._now, s) - def __getitem__(self, item): - return self.__dict__().__getitem__(item) + def __dict__(self): + return { + 'filename' : self.filename, + 'path': self.path, + 'url': self.url, + 'mimetype': self.mimetype + } - def __str__(self): - return str(self.__dict__()) + def __getitem__(self, item): + return self.__dict__().__getitem__(item) - def __nonzero__(self): - return True if self.path and self.mimetype else False + def __str__(self): + return str(self.__dict__()) - def _image_download(self, url, path): - max_size = MAX_SIZE - if self.username in SPECIAL_DOWNLOADERS: - max_size = SPECIAL_DOWNLOADERS_MAX_SIZE - try: - self._download(url, path, max_size=max_size) - except Exception as e: - self.err_warn("Download failed"); + def __nonzero__(self): + return True if self.path and self.mimetype else False - def _browser_request (self, url, data=None): - headers = { - 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', - 'Accept': '*/*', - } - try: - req = Request(url, data, headers) - response = urlopen(req) - except IOError as e: - if hasattr(e, 'code'): - sys.stderr.write( 'browser request error: %s - ERROR %s' % (url, e.code) ) - raise IOError - return response + def _image_download(self, url, path): + """downloads the image to the path specified in the local + filesystem""" + max_size = MAX_SIZE + if self.username in SPECIAL_DOWNLOADERS: + max_size = SPECIAL_DOWNLOADERS_MAX_SIZE + try: + self._download(url, path, max_size=max_size) + except Exception as e: + self.err_warn("Download failed") - def _download(self, url, destination, max_size=MAX_SIZE): - response = self._browser_request(url, None) + def _browser_request(self, url, data=None): + """sends a get request to the url using browser User-Agent headers""" + headers = { + 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', + 'Accept': '*/*', + } + try: + req = urllib2.Request(url, data, headers) + response = urllib2.urlopen(req) + except IOError as e: + if hasattr(e, 'code'): + sys.stderr.write('browser request error: %s - ERROR %s' % (url, e.code)) + raise IOError + return response - rawimg = response.read() - if len(rawimg) == 0: - self.err_warn("got zero-length file") - if len(rawimg) > max_size: - self.err_warn("file too big: max size {} KB / {} is {} KB".format( - str(MAX_SIZE/1024), - destination, - str(len(rawimg)/1024) - ) - ) - f = open(destination, "w") - f.write(rawimg) - f.close() + def _download(self, url, destination, max_size=MAX_SIZE): + """generic download method, checks the size of the filedata""" + response = self._browser_request(url, None) - def _image_mimetype(self, f): - try: - mimetype = Popen( - [BIN_IDENTIFY, f], stdout=PIPE - ).communicate()[0].split(" ")[1].lower() - return mimetype - except Exception as e: - sys.stderr.write("couldn't determine mimetype\n") - raise e; + rawimg = response.read() + if len(rawimg) == 0: + self.err_warn("got zero-length file") + if len(rawimg) > max_size: + self.err_warn("file too big: max size {} KB / {} is {} KB".format( + str(MAX_SIZE/1024), + destination, + str(len(rawimg)/1024) + )) + f = open(destination, "w") + f.write(rawimg) + f.close() + + def _image_mimetype(self, f): + """retrieves the image mimetype from the file header using imagemagick""" + try: + mimetype = Popen( + [BIN_IDENTIFY, f], stdout=PIPE + ).communicate()[0].split(" ")[1].lower() + return mimetype + except Exception as e: + sys.stderr.write("couldn't determine mimetype\n") + raise e |
