# -*- 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 . 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("

.*

"); self.regex_searchDetail = re.compile(".*"); 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);