diff options
Diffstat (limited to 'plugin.video.rtpplay/resources/lib')
-rw-r--r-- | plugin.video.rtpplay/resources/lib/__init__.py | 0 | ||||
-rw-r--r-- | plugin.video.rtpplay/resources/lib/kodilogging.py | 43 | ||||
-rw-r--r-- | plugin.video.rtpplay/resources/lib/kodiutils.py | 83 | ||||
-rw-r--r-- | plugin.video.rtpplay/resources/lib/plugin.py | 97 |
4 files changed, 223 insertions, 0 deletions
diff --git a/plugin.video.rtpplay/resources/lib/__init__.py b/plugin.video.rtpplay/resources/lib/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/plugin.video.rtpplay/resources/lib/__init__.py diff --git a/plugin.video.rtpplay/resources/lib/kodilogging.py b/plugin.video.rtpplay/resources/lib/kodilogging.py new file mode 100644 index 0000000..5f42ab7 --- /dev/null +++ b/plugin.video.rtpplay/resources/lib/kodilogging.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals +from resources.lib.kodiutils import get_setting_as_bool + +import logging +import xbmc +import xbmcaddon + + +class KodiLogHandler(logging.StreamHandler): + + def __init__(self): + logging.StreamHandler.__init__(self) + addon_id = xbmcaddon.Addon().getAddonInfo('id') + prefix = b"[%s] " % addon_id + formatter = logging.Formatter(prefix + b'%(name)s: %(message)s') + self.setFormatter(formatter) + + def emit(self, record): + levels = { + logging.CRITICAL: xbmc.LOGFATAL, + logging.ERROR: xbmc.LOGERROR, + logging.WARNING: xbmc.LOGWARNING, + logging.INFO: xbmc.LOGINFO, + logging.DEBUG: xbmc.LOGDEBUG, + logging.NOTSET: xbmc.LOGNONE, + } + if get_setting_as_bool('debug'): + try: + xbmc.log(self.format(record), levels[record.levelno]) + except UnicodeEncodeError: + xbmc.log(self.format(record).encode( + 'utf-8', 'ignore'), levels[record.levelno]) + + def flush(self): + pass + + +def config(): + logger = logging.getLogger() + logger.addHandler(KodiLogHandler()) + logger.setLevel(logging.DEBUG) diff --git a/plugin.video.rtpplay/resources/lib/kodiutils.py b/plugin.video.rtpplay/resources/lib/kodiutils.py new file mode 100644 index 0000000..6ab49d1 --- /dev/null +++ b/plugin.video.rtpplay/resources/lib/kodiutils.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- + +import xbmc +import xbmcaddon +import xbmcgui +import sys +import os +import logging +import json as json + + +# read settings +ADDON = xbmcaddon.Addon() +ICON = xbmc.translatePath(ADDON.getAddonInfo("icon")) +FANART = xbmc.translatePath(ADDON.getAddonInfo("fanart")) + +logger = logging.getLogger(__name__) + +def smart_str(x): + if isinstance(x, unicode): + return unicode(x).encode("utf-8") + elif isinstance(x, int) or isinstance(x, float): + return str(x) + return x + +def ok(heading, line1, line2="", line3=""): + xbmcgui.Dialog().ok(heading, line1, line2, line3) + +def notification(header, message, time=5000, icon=ADDON.getAddonInfo('icon'), sound=True): + xbmcgui.Dialog().notification(header, message, icon, time, sound) + + +def show_settings(): + ADDON.openSettings() + + +def get_setting(setting): + return ADDON.getSetting(setting).strip().decode('utf-8') + + +def set_setting(setting, value): + ADDON.setSetting(setting, str(value)) + + +def get_setting_as_bool(setting): + return get_setting(setting).lower() == "true" + + +def get_setting_as_float(setting): + try: + return float(get_setting(setting)) + except ValueError: + return 0 + + +def get_setting_as_int(setting): + try: + return int(get_setting_as_float(setting)) + except ValueError: + return 0 + + +def get_string(string_id): + return ADDON.getLocalizedString(string_id).encode('utf-8', 'ignore') + + +def kodi_json_request(params): + data = json.dumps(params) + request = xbmc.executeJSONRPC(data) + + try: + response = json.loads(request) + except UnicodeDecodeError: + response = json.loads(request.decode('utf-8', 'ignore')) + + try: + if 'result' in response: + return response['result'] + return None + except KeyError: + logger.warn("[%s] %s" % + (params['method'], response['error']['message'])) + return None diff --git a/plugin.video.rtpplay/resources/lib/plugin.py b/plugin.video.rtpplay/resources/lib/plugin.py new file mode 100644 index 0000000..9ba05fe --- /dev/null +++ b/plugin.video.rtpplay/resources/lib/plugin.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- + +import routing +import logging +import requests +import re +import xbmcaddon +from sys import exit, version_info +from resources.lib import kodiutils +from resources.lib import kodilogging +from xbmcgui import ListItem +from xbmcplugin import addDirectoryItem, endOfDirectory, setResolvedUrl + + +ADDON = xbmcaddon.Addon() +logger = logging.getLogger(ADDON.getAddonInfo('id')) +kodilogging.config() +plugin = routing.Plugin() + +__headers__ = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"} +__base_url__ = "http://www.rtp.pt" +__session__ = requests.Session() + +if version_info >= (3, 0): + from html.parser import HTMLParser +else: + from HTMLParser import HTMLParser +html_parser = HTMLParser() + + +@plugin.route('/') +def index(): + try: + req = __session__.get("http://www.rtp.pt/play/", headers=__headers__).text + except: + kodiutils.ok(kodiutils.get_string(32000),kodiutils.get_string(32001)) + exit(0) + + match=re.compile('<a title=".+?direto (.+?)" href="(.+?)" class="mask-live "><img alt=".+?" src="(.+?)" class="img-responsive">.+?<span class="small"><b>(.+?)</b>').findall(req) + if match: + for channel,rel_url, img, prog in match: + liz = ListItem("[B][COLOR blue]{}[/B][/COLOR] ({})".format(kodiutils.smart_str(channel), kodiutils.smart_str(prog))) + if img.startswith("/"): + img = "http:{}".format(img) + + liz.setArt({"thumb": img, "icon": img, "fanart": kodiutils.FANART}) + liz.setProperty('IsPlayable', 'true') + liz.setInfo("Video", infoLabels={"plot": html_parser.unescape(kodiutils.smart_str(prog))}) + + addDirectoryItem(plugin.handle, plugin.url_for(play, rel_url=kodiutils.smart_str(rel_url), channel=kodiutils.smart_str(channel), img=kodiutils.smart_str(img), prog=kodiutils.smart_str(prog) ), liz, False) + + endOfDirectory(plugin.handle) + + +@plugin.route('/play') +def play(): + rel_url = plugin.args["rel_url"][0] + channel = plugin.args["channel"][0] + prog = plugin.args["prog"][0] + icon = plugin.args["img"][0] + try: + req = __session__.get("{}{}".format(__base_url__, rel_url)).text + except: + kodiutils.ok(kodiutils.get_string(32000),kodiutils.get_string(32002)) + exit(0) + + is_pseudo_aes = bool(re.findall("var aes = true", req)) + + streams = re.compile('new RTPPlayer\(.*file\:.+?"(.+?)"', re.DOTALL).findall(req) + + if streams: + final_stream_url = None + for stream in streams: + if ".m3u8" in stream.split('/')[-1]: + final_stream_url = stream + break + + if is_pseudo_aes: + try: + req = __session__.post("http://www.rtp.pt/services/playRequest.php", headers={"RTPPlayUrl": final_stream_url}) + final_stream_url = req.headers["RTPPlayWW"] + except: + kodiutils.ok(kodiutils.get_string(32000),kodiutils.get_string(32002)) + exit(0) + + if final_stream_url: + liz = ListItem("[B][COLOR blue]{}[/B][/COLOR] ({})".format(kodiutils.smart_str(channel), kodiutils.smart_str(prog))) + liz.setArt({"thumb": icon, "icon": icon}) + liz.setProperty('IsPlayable', 'true') + liz.setPath("{}|User-Agent=Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36&Referer=http://www.rtp.pt/play/".format(final_stream_url)) + setResolvedUrl(plugin.handle, True, liz) + else: + kodiutils.ok(kodiutils.get_string(32000),kodiutils.get_string(32002)) + exit(0) + +def run(): + plugin.run() |