summaryrefslogtreecommitdiff
path: root/plugin.video.rtpplay/resources
diff options
context:
space:
mode:
Diffstat (limited to 'plugin.video.rtpplay/resources')
-rw-r--r--plugin.video.rtpplay/resources/__init__.py0
-rw-r--r--plugin.video.rtpplay/resources/language/resource.language.en_gb/strings.po29
-rw-r--r--plugin.video.rtpplay/resources/lib/__init__.py0
-rw-r--r--plugin.video.rtpplay/resources/lib/kodilogging.py43
-rw-r--r--plugin.video.rtpplay/resources/lib/kodiutils.py83
-rw-r--r--plugin.video.rtpplay/resources/lib/plugin.py97
-rw-r--r--plugin.video.rtpplay/resources/settings.xml5
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>
+