diff options
Diffstat (limited to 'plugin.video.rtpplay/resources')
-rw-r--r-- | plugin.video.rtpplay/resources/__init__.py | 0 | ||||
-rw-r--r-- | plugin.video.rtpplay/resources/language/resource.language.en_gb/strings.po | 29 | ||||
-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 | ||||
-rw-r--r-- | plugin.video.rtpplay/resources/settings.xml | 5 |
7 files changed, 257 insertions, 0 deletions
diff --git a/plugin.video.rtpplay/resources/__init__.py b/plugin.video.rtpplay/resources/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/plugin.video.rtpplay/resources/__init__.py diff --git a/plugin.video.rtpplay/resources/language/resource.language.en_gb/strings.po b/plugin.video.rtpplay/resources/language/resource.language.en_gb/strings.po new file mode 100644 index 0000000..b35a0ec --- /dev/null +++ b/plugin.video.rtpplay/resources/language/resource.language.en_gb/strings.po @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: RTP Play +# Addon id: plugin.video.rtpplay +# Addon Provider: enen92 +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-addons/language/en/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#32000" +msgid "RTP Play" +msgstr "" + +msgctxt "#32001" +msgid "Could not complete request. The plugin needs an update." +msgstr "" + +msgctxt "#32002" +msgid "Could not grab stream url. The plugin needs an update." +msgstr ""
\ No newline at end of file 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() diff --git a/plugin.video.rtpplay/resources/settings.xml b/plugin.video.rtpplay/resources/settings.xml new file mode 100644 index 0000000..96f7359 --- /dev/null +++ b/plugin.video.rtpplay/resources/settings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<settings> + <setting id="debug" type="bool" label="32001" default="false"/> +</settings> + |