diff options
Diffstat (limited to 'plugin.video.mediathek/mediathek/dreisat.py')
-rw-r--r-- | plugin.video.mediathek/mediathek/dreisat.py | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/plugin.video.mediathek/mediathek/dreisat.py b/plugin.video.mediathek/mediathek/dreisat.py new file mode 100644 index 0000000..615f88d --- /dev/null +++ b/plugin.video.mediathek/mediathek/dreisat.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +#-------------LicenseHeader-------------- +# plugin.video.Mediathek - Gives access to most video-platforms from German public service broadcasters +# Copyright (C) 2010 Raptor 2101 [raptor2101@gmx.de] +# +# 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 <http://www.gnu.org/licenses/>. +import re,time +from mediathek import * +from xml.dom import minidom; + + +regex_dateString = re.compile("\\d{2} ((\\w{3})|(\\d{2})) \\d{4}"); +month_replacements = { + "Jan":"01", + "Feb":"02", + "Mar":"03", + "Apr":"04", + "May":"05", + "Jun":"06", + "Jul":"07", + "Aug":"08", + "Sep":"09", + "Oct":"10", + "Nov":"11", + "Dec":"12", + }; + +class DreiSatMediathek(Mediathek): + @classmethod + def name(self): + return "3Sat"; + def isSearchable(self): + return True; + def __init__(self, simpleXbmcGui): + self.gui = simpleXbmcGui; + if(self.gui.preferedStreamTyp == 0): + self.baseType = "video/x-ms-asf"; + elif (self.gui.preferedStreamTyp == 1): + self.baseType = "video/x-ms-asf" + elif (self.gui.preferedStreamTyp == 2): + self.baseType ="video/x-ms-asf"; + else: + self.baseType ="video/quicktime"; + self.webEmType = "video/webm"; + self.menuTree = ( + TreeNode("0","Bauerfeind","http://www.3sat.de/mediathek/rss/mediathek_bauerfeind.xml",True), + TreeNode("1","Bookmark","http://www.3sat.de/mediathek/rss/mediathek_bookmark.xml",True), + TreeNode("2",u"Börse","http://www.3sat.de/mediathek/rss/mediathek_boerse.xml",True), + TreeNode("3","Buchzeit","http://www.3sat.de/mediathek/rss/mediathek_buchzeit.xml",True), + TreeNode("4","daVinci","http://www.3sat.de/mediathek/rss/mediathek_davinci.xml",True), + TreeNode("5","delta","http://www.3sat.de/mediathek/rss/mediathek_delta.xml",True), + TreeNode("6","Film","http://www.3sat.de/mediathek/rss/mediathek_film.xml",True), + TreeNode("7","Gero von Boehm","http://www.3sat.de/mediathek/rss/mediathek_gero.xml",True), + TreeNode("8","hessenreporter","http://www.3sat.de/mediathek/rss/mediathek_hessenreporter.xml",True), + TreeNode("9","hitec","http://www.3sat.de/mediathek/rss/mediathek_hitec.xml",True), + TreeNode("10","Kabarett","http://www.3sat.de/mediathek/rss/mediathek_kabarett.xml",True), + TreeNode("11","Kinomagazin","http://www.3sat.de/mediathek/rss/mediathek_kinomag.xml",True), + TreeNode("12","Kulturzeit","http://www.3sat.de/mediathek/rss/mediathek_Kulturzeit.xml",True), + TreeNode("13","makro","http://www.3sat.de/mediathek/rss/mediathek_makro.xml",True), + TreeNode("14","Musik","http://www.3sat.de/mediathek/rss/mediathek_musik.xml",True), + TreeNode("15","nano","http://www.3sat.de/mediathek/rss/mediathek_nano.xml",True), + TreeNode("16","neues","http://www.3sat.de/mediathek/rss/mediathek_neues.xml",True), + TreeNode("17",u"Peter Voß fragt","http://www.3sat.de/mediathek/rss/mediathek_begegnungen.xml",True), + TreeNode("18","Recht brisant","http://www.3sat.de/mediathek/rss/mediathek_Recht%20brisant.xml",True), + TreeNode("19","scobel","http://www.3sat.de/mediathek/rss/mediathek_scobel.xml",True), + TreeNode("20","SCHWEIZWEIT","http://www.3sat.de/mediathek/rss/mediathek_schweizweit.xml",True), + TreeNode("21","Theater","http://www.3sat.de/mediathek/rss/mediathek_theater.xml",True), + TreeNode("22","vivo","http://www.3sat.de/mediathek/rss/mediathek_vivo.xml",True), + ); + + self.rootLink = "http://www.3sat.de" + self.searchLink = 'http://www.3sat.de/mediathek/mediathek'; + link = "/mediathek/mediathek.php\\?obj=\\d+"; + self.regex_searchResult = re.compile("href=\""+link+"\" class=\"media_result_thumb\""); + self.regex_searchResultLink = re.compile(link) + self.regex_searchLink = re.compile("http://(w|f)streaming.zdf.de/.*?(\\.asx|\\.smil)") + self.regex_searchTitle = re.compile("<h2>.*</h2>"); + self.regex_searchDetail = re.compile("<span class=\"text\">.*"); + self.regex_searchDate = re.compile("\\d{2}.\\d{2}.\\d{4}"); + self.regex_searchImage = re.compile("(/dynamic/mediathek/stills/|/mediaplayer/stills/)\\d*_big\\.jpg"); + self.replace_html = re.compile("<.*?>"); + + def buildPageMenu(self, link, initCount): + self.gui.log("buildPageMenu: "+link); + rssFeed = self.loadConfigXml(link); + self.extractVideoObjects(rssFeed, initCount); + def searchVideo(self, searchText): + values ={'mode':'search', + 'query':searchText, + 'red': '', + 'query_time': '', + 'query_sort': '', + 'query_order':'' + } + mainPage = self.loadPage(self.searchLink,values); + results = self.regex_searchResult.findall(mainPage); + for result in results: + objectLink = self.regex_searchResultLink.search(result).group(); + infoLink = self.rootLink+objectLink + infoPage = self.loadPage(infoLink); + title = self.regex_searchTitle.search(infoPage).group(); + detail = self.regex_searchDetail.search(infoPage).group(); + image = self.regex_searchImage.search(infoPage).group(); + title = self.replace_html.sub("", title); + detail = self.replace_html.sub("", detail); + try: + dateString = self.regex_searchDate.search(infoPage).group(); + pubDate = time.strptime(dateString,"%d.%m.%Y"); + except: + pubDate = time.gmtime(); + videoLink = self.rootLink+objectLink+"&mode=play"; + videoPage = self.loadPage(videoLink); + video = self.regex_searchLink.search(videoPage).group(); + video = video.replace("fstreaming","wstreaming").replace(".smil",".asx"); + links = {} + links[2] = SimpleLink(video,0) + self.gui.buildVideoLink(DisplayObject(title,"",self.rootLink + image,detail,links,True, pubDate),self,len(results)); + def readText(self,node,textNode): + try: + node = node.getElementsByTagName(textNode)[0].firstChild; + return unicode(node.data); + except: + return ""; + def loadConfigXml(self, link): + self.gui.log("load:"+link) + xmlPage = self.loadPage(link); + return minidom.parseString(xmlPage); + def extractVideoObjects(self, rssFeed, initCount): + nodes = rssFeed.getElementsByTagName("item"); + nodeCount = initCount + len(nodes) + for itemNode in nodes: + try: + self.extractVideoInformation(itemNode,nodeCount); + except: + pass + + def parseDate(self,dateString): + dateString = regex_dateString.search(dateString).group(); + for month in month_replacements.keys(): + dateString = dateString.replace(month,month_replacements[month]); + return time.strptime(dateString,"%d %m %Y"); + + def extractVideoInformation(self, itemNode, nodeCount): + title = self.readText(itemNode,"title"); + self.gui.log(title) + dateString = self.readText(itemNode,"pubDate"); + pubDate = self.parseDate(dateString); + descriptionNode = itemNode.getElementsByTagName("description")[0].firstChild.data; + description = unicode(descriptionNode); + picture = ""; + pictureNodes = itemNode.getElementsByTagName("media:thumbnail"); + if(len(pictureNodes) > 0): + picture = pictureNodes[0].getAttribute("url"); + links = {}; + for contentNode in itemNode.getElementsByTagName("media:content"): + height = int(contentNode.getAttribute("height")); + url = contentNode.getAttribute("url"); + size = int(contentNode.getAttribute("fileSize")); + if(height < 300): + links[0] = SimpleLink(url, size); + elif (height < 480): + links[1] = SimpleLink(url, size); + else: + links[2] = SimpleLink(url, size); + if links: + self.gui.buildVideoLink(DisplayObject(title,"",picture,description,links,True, pubDate),self,nodeCount); |