""" urlresolver XBMC Addon Copyright (C) 2013 Bstrdsmkr 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 3 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, see . """ import urllib import urllib2 import urlparse import socket import xml.etree.ElementTree as ET from urlresolver import common from urlresolver.common import i18n from urlresolver.resolver import UrlResolver, ResolverError logger = common.log_utils.Logger.get_logger(__name__) logger.disable() MAX_REDIR = 10 TIMEOUT = 2 class NoRedirection(urllib2.HTTPErrorProcessor): def http_response(self, request, response): return response https_response = http_response class ZeveraResolver(UrlResolver): name = "Zevera" domains = ["*"] media_url = None def __init__(self): self.hosts = [] self.patterns = [] self.net = common.Net() def get_media_url(self, host, media_id): username = self.get_setting('username') password = self.get_setting('password') url = 'http://api.zevera.com/jDownloader.ashx?' query = urllib.urlencode({'cmd': 'generatedownloaddirect', 'login': username, 'pass': password, 'olink': media_id}) url = url + query opener = urllib2.build_opener(NoRedirection) urllib2.install_opener(opener) redirs = 0 while redirs < MAX_REDIR: request = urllib2.Request(url) request.get_method = lambda: 'HEAD' try: response = urllib2.urlopen(request, timeout=TIMEOUT) if response.getcode() == 200: logger.log_debug('Zevera: Resolved to %s' % (url)) return url elif response.getcode() == 302: url = response.info().getheader('Location') redirs += 1 logger.log_debug('Zevera Redir #%d: %s' % (redirs, url)) else: common.logger.log_warning('Unexpected Zevera Response (%s): %s' % (response.getcode(), response.read())) raise ResolverError('Zevera: Unexpected Response Received') except socket.timeout: common.logger.log_warning('Zevera timeout: %s' % (url)) raise ResolverError('Zevera: Timeout') raise ResolverError('Zevera: Redirect beyond max allowed (%s)' % (MAX_REDIR)) def get_url(self, host, media_id): return media_id def get_host_and_id(self, url): return 'zevera.com', url @common.cache.cache_method(cache_limit=8) def get_all_hosters(self): try: hosts = [] url = 'http://zevera.com/downloadapi.asmx/GetHosters' html = self.net.http_GET(url).content root = ET.fromstring(html) ns = '{http://tempuri.org/}' for item in root.findall('.//%shoster' % (ns)): is_active = item.find('%sisActive' % (ns)) hostername = item.find('%shostername' % (ns)) if is_active is not None and hostername is not None and is_active.text.lower() == 'true': hosts.append(hostername.text) except Exception as e: logger.log_error('Error getting Zevera hosts: %s' % (e)) logger.log_debug('Zevera Hosts: %s' % (hosts)) return hosts def valid_url(self, url, host): if not self.hosts: self.hosts = self.get_all_hosters() if url: try: host = urlparse.urlparse(url).hostname except: host = 'unknown' if host.startswith('www.'): host = host.replace('www.', '') if any(host in item for item in self.hosts): return True return False @classmethod def get_settings_xml(cls): xml = super(cls, cls).get_settings_xml(include_login=False) xml.append('' % (cls.__name__, i18n('login'))) xml.append('' % (cls.__name__, i18n('username'))) xml.append('' % (cls.__name__, i18n('password'))) return xml @classmethod def isUniversal(self): return True