""" OVERALL CREDIT TO: t0mm0, Eldorado, VOINAGE, BSTRDMKR, tknorris, smokdpi, TheHighway urlresolver XBMC Addon Copyright (C) 2011 t0mm0 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 re import json from lib import helpers from urlresolver import common from urlresolver.resolver import UrlResolver, ResolverError class PlayWireResolver(UrlResolver): name = "playwire" domains = ["playwire.com"] pattern = '(?://|\.)(config\.playwire\.com)/(.+?)/(?:zeus|player)\.json' pattern2 = '(?://|\.)(cdn\.playwire\.com.+?\d+)/(?:config|embed)/(\d+)' qual_map = {'1080': 'Full HD', '720': "HD", '480': "SD", '360': 'Low Quality', '270': 'Poor Quality', '240': 'Mobile HD', '144': 'Mobile SD'} def __init__(self): self.net = common.Net() def get_media_url(self, host, media_id): web_url = self.get_url(host, media_id) response = self.net.http_GET(web_url) html = response.content if html: try: if 'config.playwire.com' in host: response = json.loads(html)['content']['media']['f4m'] elif 'v2' not in host: response = re.findall(r'(.+?)', html)[0] else: response = json.loads(html)['src'] return response response = self.net.http_GET(response).content baseURL = re.findall(r'\s*(.+)\s*', response)[0] media = re.findall(r'', response) media.sort(key=lambda x: x[1], reverse=True) sources = [('%s' % self.__replaceQuality(i[1], i[1]), '%s/%s' % (baseURL, i[0])) for i in media] source = helpers.pick_source(sources) source = source.encode('utf-8') return source except: raise ResolverError('Unable to resolve url.') raise ResolverError('No playable video found.') def __replaceQuality(self, qual, num): return self.qual_map.get(qual, num) def get_url(self, host, media_id): if 'config.playwire.com' in host: return 'http://%s/%s/zeus.json' % (host, media_id) elif 'v2' not in host: return 'http://%s/embed/%s.xml' % (host, media_id) else: return 'http://%s/config/%s.json' % (host, media_id) def get_host_and_id(self, url): if 'config.playwire.com' in url: r = re.search(self.pattern, url) else: r = re.search(self.pattern2, url) if r: return r.groups() else: return False def valid_url(self, url, host): return re.search(self.pattern, url) or re.search(self.pattern2, url) or self.name in host