# -*- coding: utf-8 -*- # # Russian metadata plugin for Plex, which uses http://www.kinopoisk.ru/ to get the tag data. # Плагин для обновления информации о фильмах использующий КиноПоиск (http://www.kinopoisk.ru/). # Copyright (C) 2012 Yevgeny Nyden # # 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 2 # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # @author zhenya (Yevgeny Nyden) # @revision 148 import urllib import urllib2 import base64 import time import LOGGER as Log class HTTP: def __init__(self): pass def fetch(self, request, **kwargs): self.con, self.fd, self.progress, self.cookies, self.request = None, None, None, None, request if not isinstance(self.request, HTTPRequest): self.request = HTTPRequest(url=self.request, **kwargs) self.response = HTTPResponse(self.request) Log.Debug('XBMCup: HTTP: request: ' + str(self.request)) try: self._opener() self._fetch() except Exception, e: Log.Debug('XBMCup: HTTP: ' + str(e)) if isinstance(e, urllib2.HTTPError): self.response.code = e.code self.response.error = e else: self.response.code = 200 if self.fd: self.fd.close() self.fd = None if self.con: self.con.close() self.con = None if self.progress: self.progress.close() self.progress = None self.response.time = time.time() - self.response.time return self.response def _opener(self): build = [urllib2.HTTPHandler()] if self.request.redirect: build.append(urllib2.HTTPRedirectHandler()) if self.request.proxy_host and self.request.proxy_port: build.append(urllib2.ProxyHandler( {self.request.proxy_protocol: self.request.proxy_host + ':' + str(self.request.proxy_port)})) if self.request.proxy_username: proxy_auth_handler = urllib2.ProxyBasicAuthHandler() proxy_auth_handler.add_password('realm', 'uri', self.request.proxy_username, self.request.proxy_password) build.append(proxy_auth_handler) urllib2.install_opener(urllib2.build_opener(*build)) def _fetch(self): params = {} if self.request.params is None else self.request.params if self.request.method == 'POST': if isinstance(params, dict) or isinstance(params, list): params = urllib.urlencode(params) req = urllib2.Request(self.request.url, params) else: req = urllib2.Request(self.request.url) for key, value in self.request.headers.iteritems(): req.add_header(key, value) if self.request.auth_username and self.request.auth_password: req.add_header('Authorization', 'Basic %s' % base64.encodestring( ':'.join([self.request.auth_username, self.request.auth_password])).strip()) # self.con = urllib2.urlopen(req, timeout=self.request.timeout) self.con = urllib2.urlopen(req) self.response.headers = self._headers(self.con.info()) self.response.body = self.con.read() if self.request.cookies: self.cookies.save(self.request.cookies) def _headers(self, raw): headers = {} for line in raw.headers: pair = line.split(':', 1) if len(pair) == 2: tag = pair[0].lower().strip() value = pair[1].strip() if tag and value: headers[tag] = value return headers def _progress(self, read, size, name): res = [] if size < 0: res.append(1) else: res.append(int(float(read) / (float(size) / 100.0))) if name: res.append(u'File: ' + name) if size != -1: res.append(u'Size: ' + self._human(size)) res.append(u'Load: ' + self._human(read)) return res def _human(self, size): human = None for h, f in (('KB', 1024), ('MB', 1024 * 1024), ('GB', 1024 * 1024 * 1024), ('TB', 1024 * 1024 * 1024 * 1024)): if size / f > 0: human = h factor = f else: break if human is None: return (u'%10.1f %s' % (size, u'byte')).replace(u'.0', u'') else: return u'%10.2f %s' % (float(size) / float(factor), human) class HTTPRequest: def __init__(self, url, method='GET', headers=None, cookies=None, params=None, upload=None, download=None, progress=False, auth_username=None, auth_password=None, proxy_protocol='http', proxy_host=None, proxy_port=None, proxy_username=None, proxy_password='', timeout=20.0, redirect=True, gzip=False): if headers is None: headers = {} self.url = url self.method = method self.headers = headers self.cookies = cookies self.params = params self.upload = upload self.download = download self.progress = progress self.auth_username = auth_username self.auth_password = auth_password self.proxy_protocol = proxy_protocol self.proxy_host = proxy_host self.proxy_port = proxy_port self.proxy_username = proxy_username self.proxy_password = proxy_password self.timeout = timeout self.redirect = redirect self.gzip = gzip def __repr__(self): return '%s(%s)' % (self.__class__.__name__, ','.join('%s=%r' % i for i in self.__dict__.iteritems())) class HTTPResponse: def __init__(self, request): self.request = request self.code = None self.headers = {} self.error = None self.body = None self.filename = None self.time = time.time() def __repr__(self): args = ','.join('%s=%r' % i for i in self.__dict__.iteritems() if i[0] != 'body') if self.body: args += ',body=' else: args += ',body=None' return '%s(%s)' % (self.__class__.__name__, args)