summaryrefslogtreecommitdiff
path: root/plugin.video.mediathek/mediathek/wdr.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugin.video.mediathek/mediathek/wdr.py')
-rw-r--r--plugin.video.mediathek/mediathek/wdr.py191
1 files changed, 191 insertions, 0 deletions
diff --git a/plugin.video.mediathek/mediathek/wdr.py b/plugin.video.mediathek/mediathek/wdr.py
new file mode 100644
index 0000000..5c784db
--- /dev/null
+++ b/plugin.video.mediathek/mediathek/wdr.py
@@ -0,0 +1,191 @@
+# -*- 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{4}-\\d{2}-\\d{2}");
+class WDRMediathek(Mediathek):
+ def __init__(self, simpleXbmcGui):
+ self.gui = simpleXbmcGui;
+ self.pageSize = 20; #max 49;
+ self.rootLink = "http://www.wdr.de"
+ self.menuTree = (
+ TreeNode("0","Neuste Videos",self.rootLink+"/mediathek/rdf/regional/index.xml",True),
+ TreeNode("1","Sendungen von A-Z","",False,
+ (
+ TreeNode("1.0",u"A40","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=A40",True),
+ TreeNode("1.1",u"Aktuelle Stunde","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Aktuelle+Stunde",True),
+ TreeNode("1.2",u"Am Sonntag","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+2+-+Der+Sonntag",True),
+ TreeNode("1.3",u"Cosmo","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Funkhaus+Europa+-+Cosmo",True),
+ TreeNode("1.4",u"daheim & unterwegs","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=daheim+%26+unterwegs",True),
+ TreeNode("1.5",u"die story","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=die+story",True),
+ TreeNode("1.6",u"Dittsche","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Dittsche",True),
+ TreeNode("1.7",u"eins zu eins","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=eins+zu+eins",True),
+ TreeNode("1.8",u"frauTV","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=frauTV",True),
+ TreeNode("1.9",u"hier und heute","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Hier+und+Heute",True),
+ TreeNode("1.10",u"Kabarett","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+2+-+Kabarett",True),
+ TreeNode("1.11",u"Lokalzeit aus Aachen","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+aus+Aachen",True),
+ TreeNode("1.12",u"Lokalzeit aus Düsseldorf","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+aus+D%FCsseldorf",True),
+ TreeNode("1.13",u"Lokalzeit OWL","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+OWL+aktuell",True),
+ TreeNode("1.14",u"Lokalzeit aus Bonn","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+aus+Bonn",True),
+ TreeNode("1.15",u"Lokalzeit aus Köln","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+aus+K%F6ln",True),
+ TreeNode("1.16",u"Lokalzeit Ruhr","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+Ruhr",True),
+ TreeNode("1.17",u"Lokalzeit aus Dortmund","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+aus+Dortmund",True),
+ TreeNode("1.18",u"Lokalzeit Bergisches Land","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+Bergisches+Land",True),
+ TreeNode("1.19",u"Lokalzeit Südwestfalen","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+S%FCdwestfalen",True),
+ TreeNode("1.20",u"Lokalzeit aus Duisburg","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+aus+Duisburg",True),
+ TreeNode("1.21",u"Lokalzeit Münsterland","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Lokalzeit+M%FCnsterland",True),
+ TreeNode("1.22",u"markt","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=markt",True),
+ TreeNode("1.23",u"Menschen hautnah","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Menschen+hautnah",True),
+ TreeNode("1.24",u"Mittagsecho","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+5+-+Mittagsecho",True),
+ TreeNode("1.25",u"Mittagsmagazin","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+2+-+Mittagsmagazin",True),
+ TreeNode("1.26",u"mittwochs live","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=mittwochs+live",True),
+ TreeNode("1.27",u"Morgenecho","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+5+-+Morgenecho",True),
+ TreeNode("1.28",u"Morgenmagazin","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+2+-+Morgenmagazin",True),
+ TreeNode("1.29",u"Mosaik","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+3+-+Mosaik",True),
+ TreeNode("1.30",u"Piazza","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Funkhaus+Europa+-+Piazza",True),
+ TreeNode("1.31",u"Platz der Republik","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+5+-+Platz+der+Republik",True),
+ TreeNode("1.32",u"Quarks & Co","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Quarks+%26+Co",True),
+ TreeNode("1.33",u"Resonanzen","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+3+-+Resonanzen",True),
+ TreeNode("1.34",u"Scala","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+5+-+Scala",True),
+ TreeNode("1.35",u"schön hier","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=sch%F6n+hier",True),
+ TreeNode("1.36",u"Servicezeit","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Servicezeit",True),
+ TreeNode("1.37",u"sport inside","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=sport+inside",True),
+ TreeNode("1.38",u"Stichtag","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+2+-+Stichtag",True),
+ TreeNode("1.39",u"Thema NRW","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+5+-+Thema+NRW",True),
+ TreeNode("1.40",u"WDR aktuell","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+aktuell",True),
+ TreeNode("1.41",u"WDR sport aktuell","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+sport+aktuell",True),
+ TreeNode("1.42",u"west.art","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=West.art",True),
+ TreeNode("1.43",u"Westblick","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+5+-+Westblick",True),
+ TreeNode("1.44",u"WESTPOL","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WESTPOL",True),
+ TreeNode("1.45",u"Westzeit","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+2+-+Westzeit",True),
+ TreeNode("1.46",u"Zeiglers wunderbare Welt des Fußballs","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Zeiglers+wunderbare+Welt+des+Fu%DFballs",True),
+ TreeNode("1.47",u"ZeitZeichen","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+3+%2F+WDR+5+-+ZeitZeichen",True),
+ TreeNode("1.48",u"Zimmer Frei!","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=Zimmer+Frei%21",True),
+ TreeNode("1.49",u"Zwischen Rhein und Weser","http://www.wdr.de/mediathek/html/regional/ergebnisse/sendung.xml?rankingtype=sendung&rankingvalue=WDR+2+-+Zwischen+Rhein+und+Weser",True),
+ )
+ ),
+ TreeNode("2","Themen","",False,
+ (
+ TreeNode("2.0","Politik","http://www.wdr.de/mediathek/html/regional/ergebnisse/schlagwort.xml?rankingvalue=Politik",True),
+ TreeNode("2.1","Wirtschaft","http://www.wdr.de/mediathek/html/regional/ergebnisse/schlagwort.xml?rankingvalue=Wirtschaft",True),
+ TreeNode("2.2","Kultur","http://www.wdr.de/mediathek/html/regional/ergebnisse/schlagwort.xml?rankingvalue=Kultur",True),
+ TreeNode("2.3","Panorama","http://www.wdr.de/mediathek/html/regional/ergebnisse/schlagwort.xml?rankingvalue=Panorama",True),
+ TreeNode("2.4","Service","http://www.wdr.de/mediathek/html/regional/ergebnisse/schlagwort.xml?rankingvalue=Service",True),
+ TreeNode("2.5","Freizeit","http://www.wdr.de/mediathek/html/regional/ergebnisse/schlagwort.xml?rankingvalue=Freizeit",True),
+ TreeNode("2.6","Sport","http://www.wdr.de/mediathek/html/regional/ergebnisse/schlagwort.xml?rankingvalue=Sport",True),
+ )
+ ),
+ )
+ self._regex_extractTitle = re.compile("<h1>.*?<span class=\"inv\">");
+ self._regex_extractDescription = re.compile("<meta name=\"description\" content=\"(.|\\s)*?\" />");
+ self._regex_extractPicture = re.compile("<link rel=\"image_src\" href=\".*?\" />");
+ self._regex_extractDate = re.compile("<meta name=\"DC.Date\" content=\".*?\" />");
+ self._regex_extractDuration = re.compile("\\((.*)\\)<span class=\"inv\">");
+
+ self._regex_extractVideoPage = re.compile("<a href=\"/mediathek/html/.*?\\.xml\" title=\".*?\".*?>");
+ self._regex_extractLink = re.compile("/mediathek/html/.*?\\.xml");
+ self._regex_extractAudioLink = re.compile(self.rootLink+"/mediathek/.*?\\.mp3");
+ self._regex_extractVideoLink = re.compile("(dsl|isdn)Src=rtmp://.*?\\.(mp4|flv)");
+ self.replace_html = re.compile("<.*?>");
+ self.replace_tag = re.compile("(<meta name=\".*?\" content=\"|<link rel=\"image_src\" href=\"|\" />)");
+ self.searchLink = "http://www.wdr.de/mediathek/html/regional/suche/index.xml?wsSucheAusgabe=liste&wsSucheSuchart=volltext&wsSucheMedium=av&suche_submit=Suche+starten&wsSucheBegriff="
+
+ @classmethod
+ def name(self):
+ return "WDR";
+ def isSearchable(self):
+ return True;
+
+ def searchVideo(self, searchText):
+ link = self.searchLink+searchText;
+ self.buildPageMenu(link, 0, False)
+ def buildPageMenu(self, link, initCount, subLink = False):
+ link = link+"&rankingcount="+str(self.pageSize);
+ self.gui.log("MenuLink: %s"%link);
+ mainPage = self.loadPage(link);
+ if(mainPage.startswith("<?xml version=\"1.0\"")):
+ self.parseXml(mainPage);
+ else:
+ self.parseHtml(mainPage);
+ def parseHtml(self, htmlPage):
+ videoPageLinks = list(self._regex_extractVideoPage.finditer(htmlPage));
+
+ for videoPageLink in videoPageLinks:
+ link = self._regex_extractLink.search(videoPageLink.group()).group();
+ print link;
+ displayObject = self.generateDisplayObject(self.rootLink+link);
+ self.gui.buildVideoLink(displayObject,self,len(videoPageLinks));
+
+ def readText(self,node,textNode):
+ try:
+ node = node.getElementsByTagName(textNode)[0].firstChild;
+ return unicode(node.data);
+ except:
+ return "";
+
+ def parseDate(self,dateString):
+ dateString = regex_dateString.search(dateString).group();
+ return time.strptime(dateString,"%Y-%m-%d");
+
+ def parseXml(self, xmlPage):
+ xmlPage = minidom.parseString(xmlPage);
+ items = xmlPage.getElementsByTagName("item");
+ for itemNode in items:
+ link = self.readText(itemNode,"link");
+ displayObject = self.generateDisplayObject(link);
+ self.gui.buildVideoLink(displayObject,self,len(items));
+
+ def generateDisplayObject(self,videoPageLink):
+ mainPage = self.loadPage(videoPageLink);
+ title = unicode(self._regex_extractTitle.search(mainPage).group(),'ISO-8859-1');
+ description = unicode(self._regex_extractDescription.search(mainPage).group(),'ISO-8859-1');
+ picture = unicode(self._regex_extractPicture.search(mainPage).group(),'ISO-8859-1');
+ date = self._regex_extractDate.search(mainPage).group();
+ duration = self._regex_extractDuration.search(mainPage).group(1);
+
+ title = self.replace_html.sub("", title);
+ description = self.replace_tag.sub("",description);
+ picture = self.replace_tag.sub("",picture);
+ date = self.parseDate(self.replace_tag.sub("",date));
+
+ links = {};
+ for linkString in self._regex_extractVideoLink.finditer(mainPage):
+ linkString = linkString.group();
+ if linkString.startswith("dslSrc="):
+ linkString = linkString.replace("dslSrc=","");
+ links[1] = self.extractLink(linkString);
+ else:
+ linkString = linkString.replace("isdnSrc=","");
+ links[0] = self.extractLink(linkString);
+
+ if len(links) == 0:
+ linkString = self._regex_extractAudioLink.search(mainPage).group();
+ links[0] = self.extractLink(linkString);
+
+ return DisplayObject(title,"",picture,description,links,True, date, duration)
+
+ def extractLink(self, linkString):
+ if(linkString.find("mediartmp://")>-1):
+ linkString = linkString.split("mediartmp://")
+ return SimpleLink("rtmp://%s"%linkString[1], 0);
+ elif(linkString.find("mediahttp://")>-1):
+ linkString = linkString.split("mediahttp://")
+ return SimpleLink("http://%s"%linkString[1], 0);
+ else:
+ return SimpleLink(linkString, 0);