The branch, eden has been updated
via 0ce7acea13f61a5d2128f4d7b48bfa59c6cc140e (commit)
via 6834295ef0bbcf1c0108b418b75b5f11c3038b81 (commit)
from cbf677907de8625a9724c99b0661ad72458a780c (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=0ce7acea13f61a5d2128f4d7b48bfa59c6cc140e
commit 0ce7acea13f61a5d2128f4d7b48bfa59c6cc140e
Author: spiff <[email protected]>
Date: Mon Mar 12 10:29:56 2012 +0100
[plugin.video.mediathek] updated to version 0.4.1
diff --git a/plugin.video.mediathek/addon.xml b/plugin.video.mediathek/addon.xml
index f32f1f9..67ff652 100644
--- a/plugin.video.mediathek/addon.xml
+++ b/plugin.video.mediathek/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon
id="plugin.video.mediathek"
- version="0.4.0"
+ version="0.4.1"
name="Mediathek"
provider-name="Raptor 2101 [[email protected]]">
<requires>
@@ -17,11 +17,11 @@
<summary lang="en">Gives acces to the most video-platforms from german
public service broadcaster</summary>
<description lang="de">Ermöglicht den zugriff auf alle deutschen
Mediatheken der öffentlich Rechtlichen.
Aktuell implementiert sind:
- 3Sat, ARD, ZDF, ARTE, Bayrisches Fernsehen, ORF, WDR, NDR (experimentel),
KiKa (ohne Kikaninchen)
+ 3Sat, ARD, ZDF, ARTE, Bayrisches Fernsehen, ORF, WDR, NDR, KiKa (ohne
Kikaninchen)
</description>
<description lang="en">Gives acces to the most video-platforms from german
public service broadcaster.
Currently implemented:
- 3Sat, ARD, ZDF, ARTE, Bayrisches Fernsehen, ORF, WDR, NDR (experimental),
KiKa (without Kikaninchen)
+ 3Sat, ARD, ZDF, ARTE, Bayrisches Fernsehen, ORF, WDR, NDR, KiKa (without
Kikaninchen)
</description>
<platform>all</platform>
</extension>
diff --git a/plugin.video.mediathek/changelog.txt
b/plugin.video.mediathek/changelog.txt
index 8621733..5a34b97 100644
--- a/plugin.video.mediathek/changelog.txt
+++ b/plugin.video.mediathek/changelog.txt
@@ -1,3 +1,4 @@
+0.4.1 - FIX: Soern completed the NDR implementation
0.4.0 - FIX: Commit FIX from soern
0.3.9 - ADD: KIKA (Without Kikaninchen)
0.3.8 - FIX: 3SAT Broken Link
diff --git a/plugin.video.mediathek/mediathek/__init__.py
b/plugin.video.mediathek/mediathek/__init__.py
index d3c9710..8a9af1d 100644
--- a/plugin.video.mediathek/mediathek/__init__.py
+++ b/plugin.video.mediathek/mediathek/__init__.py
@@ -39,7 +39,7 @@ class TreeNode(object):
self.childNodes = childNodes;
class DisplayObject(object):
- def __init__(self,title,subTitle,picture,description,link=[],isPlayable =
True, date = None):
+ def __init__(self,title,subTitle,picture,description,link=[],isPlayable =
True, date = None, duration = None):
self.title = title
self.subTitle = subTitle
self.link = link
@@ -47,6 +47,7 @@ class DisplayObject(object):
self.isPlayable = isPlayable
self.description = description
self.date = date;
+ self.duration = duration;
class Mediathek(object):
diff --git a/plugin.video.mediathek/mediathek/ndr.py
b/plugin.video.mediathek/mediathek/ndr.py
index 3a625f5..e240e3c 100644
--- a/plugin.video.mediathek/mediathek/ndr.py
+++ b/plugin.video.mediathek/mediathek/ndr.py
@@ -26,75 +26,66 @@ class NDRMediathek(Mediathek):
def name(self):
return "NDR";
def isSearchable(self):
- return False;
+ 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";
+ if(self.gui.preferedStreamTyp == 0): #http
+ self.baseType = "http";
+ elif (self.gui.preferedStreamTyp == 1): #rtmp
+ self.baseType = "rtmp"
+ elif (self.gui.preferedStreamTyp == 2): #mms
+ self.baseType ="mms";
+# elif (self.gui.preferedStreamTyp == 3): #mov
+# self.baseType ="mov";
else:
- self.baseType ="video/quicktime";
-
- self.menuTree = (
- TreeNode("0","Die neuesten
Videos","http://www.ndr.de/mediathek/videoliste100-rss.xml",True),
- );
+ self.baseType ="rtmp";
- self.regex_extractVideoLink =
re.compile("mms://ndr\.wmod\.llnwd\.net/.*?\.wmv");
-
+ self.pageSize = "30";
+
self.rootLink = "http://www.ndr.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://wstreaming.zdf.de/.*?\\.asx")
- 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/\\d*_big\\.jpg");
- self.replace_html = re.compile("<.*?>");
+ self.menuLink =
self.rootLink+"/mediathek/mediathek100-mediathek_medium-tv_searchtype-"
+ self.searchLink = self.menuLink+"fulltext_pageSize-"+self.pageSize+".xml?";
+
+ self.regex_extractVideoLink =
re.compile("rtmpt://ndr.fcod.llnwd.net/a3715/d1/flashmedia/streams/ndr/(.*\\.)(hi.mp4|lo.flv)");
+
+ self.rtmpBaseLink =
"rtmpt://ndr.fcod.llnwd.net/a3715/d1/flashmedia/streams/ndr/";
+ self.mmsBaseLink = "mms://ndr.wmod.llnwd.net/a3715/d1/msmedia/";
+ self.httpBaseLink = "http://media.ndr.de/progressive/";
+
+ self.menuTree = [
+ TreeNode("0","Die neuesten
Videos",self.menuLink+"teasershow_pageSize-"+self.pageSize+".xml",True),
+ ];
+
+ broadcastsLink = self.menuLink+"broadcasts.xml"
+ broadcastsLinkPage = self.loadConfigXml(broadcastsLink);
+
+ menuNodes = broadcastsLinkPage.getElementsByTagName("broadcast");
+ displayObjects = [];
+ x = 1
+ for menuNode in menuNodes:
+ menuId = menuNode.getAttribute('id')
+ menuItem = unicode(menuNode.firstChild.data)
+ menuLink =
self.rootLink+"/mediathek/mediathek100-mediathek_medium-tv_broadcast-"+menuId+"_pageSize-"+self.pageSize+".xml"
+ self.menuTree.append(TreeNode(str(x),menuItem,menuLink,True));
+ x = x+1
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();
- links = {}
- links[2] = SimpleLink(video,0)
- self.gui.buildVideoLink(DisplayObject(title,"",self.rootLink +
image,detail,links,True, pubDate),self,len(results));
-
+ searchText = searchText.replace( u'\xf6',"oe")
+ searchText = searchText.replace( u'\xe4',"ae")
+ searchText = searchText.replace( u'\xfc',"ue")
+ searchText = searchText.replace( u'\xdf',"ss")
+ searchText = searchText.encode("latin1")
+ searchText = urllib.urlencode({"searchtext" : searchText})
+ self.buildPageMenu(self.searchLink+searchText,0);
+ print searchText
+
def readText(self,node,textNode):
try:
node = node.getElementsByTagName(textNode)[0].firstChild;
@@ -105,47 +96,74 @@ class NDRMediathek(Mediathek):
def loadConfigXml(self, link):
self.gui.log("load:"+link)
xmlPage = self.loadPage(link);
- return minidom.parseString(xmlPage);
+ try:
+ xmlDom = minidom.parseString(xmlPage);
+ except:
+ xmlDom = False
+ return xmlDom;
def extractVideoObjects(self, rssFeed, initCount):
- nodes = rssFeed.getElementsByTagName("item");
+ nodes = rssFeed.getElementsByTagName("mediaItem");
nodeCount = initCount + len(nodes)
- displayObjects = [];
for itemNode in nodes:
- displayObjects.append(self.extractVideoInformation(itemNode,nodeCount));
- sorted(displayObjects, key = lambda item:item.date, reverse=True);
- for displayObject in displayObjects:
- self.gui.buildVideoLink(displayObject,self,nodeCount);
+ self.extractVideoInformation(itemNode,nodeCount);
+
def parseDate(self,dateString):
dateString = regex_dateString.search(dateString).group();
return time.strptime(dateString,"%Y-%m-%d");
- def loadVideoLinks(self, link):
- videoPage = self.loadPage(link);
- links = {};
- for link in self.regex_extractVideoLink.finditer(videoPage):
- link = link.group();
- if link.find("wm.lo"):
- links[0] = SimpleLink(link, 0);
- if link.find("wm.hi"):
- links[1] = SimpleLink(link, 0);
- if link.find("wm.hq"):
- links[2] = SimpleLink(link, 0);
- return links;
+ def loadVideoLinks(self, videoNode):
+ videoSources = videoNode.getElementsByTagName("sources")[0]
+ videoSource = self.readText(videoSources, "source")
+
+ videoInfo = self.regex_extractVideoLink.match(videoSource).group(1)
- def extractVideoInformation(self, itemNode, nodeCount):
- title = self.readText(itemNode,"title");
- dateString = self.readText(itemNode,"dc:date");
- pubDate = self.parseDate(dateString);
+ link = {}
+ if self.baseType == "http":
+ link[0] = self.httpBaseLink+videoInfo+"lo.mp4";
+ link[1] = self.httpBaseLink+videoInfo+"hi.mp4";
+ link[2] = self.httpBaseLink+videoInfo+"hq.mp4";
+ elif self.baseType == "mms":
+ link[0] = self.mmsBaseLink+videoInfo+"wm.lo.wmv";
+ link[1] = self.mmsBaseLink+videoInfo+"wm.hi.wmv";
+ link[2] = self.mmsBaseLink+videoInfo+"wm.hq.wmv";
+ else:
+ link[0] = self.rtmpBaseLink+videoInfo+"lo.mp4";
+ link[1] = self.rtmpBaseLink+videoInfo+"hi.mp4";
+ link[2] = self.rtmpBaseLink+videoInfo+"hq.mp4";
- descriptionNode = self.readText(itemNode,"description");
- description = unicode(descriptionNode);
+ links = {};
+ links[0] = SimpleLink(link[0], 0);
+ links[1] = SimpleLink(link[1], 0);
+ links[2] = SimpleLink(link[2], 0);
- picture = self.readText(itemNode,"mp:data");
- videoPageLink = self.readText(itemNode,"link");
+ return links;
- links = self.loadVideoLinks(videoPageLink);
- return DisplayObject(title,"",picture,description,links,True, None);
+ def extractVideoInformation(self, itemNode, nodeCount):
+ videoId = itemNode.getAttribute("id")
+ dateString = self.readText(itemNode,"date");
+ pubDate = self.parseDate(dateString);
+
+ videoPage =
self.rootLink+"/fernsehen/sendungen/media/"+videoId+"-avmeta.xml"
+ videoNode = self.loadConfigXml(videoPage)
+
+ if videoNode:
+ videoNode = videoNode.getElementsByTagName("video")[0]
+ title = self.readText(videoNode,"headline");
+ description = self.readText(videoNode,"teaser");
+ duration = self.readText(videoNode,"duration");
+
+ imageNode =
videoNode.getElementsByTagName("images")[0].getElementsByTagName("image")
+ if len(imageNode):
+ imageNode =imageNode[0]
+ imageNode = imageNode.getElementsByTagName("urls")[0]
+ picture = self.readText(imageNode, "url")
+ else:
+ picture = None
+ links = self.loadVideoLinks(videoNode)
+
+
self.gui.buildVideoLink(DisplayObject(title,"",picture,description,links,True,pubDate,duration),self,nodeCount);
+
diff --git a/plugin.video.mediathek/simplexbmc.py
b/plugin.video.mediathek/simplexbmc.py
index e67b1d2..2b53b15 100644
--- a/plugin.video.mediathek/simplexbmc.py
+++ b/plugin.video.mediathek/simplexbmc.py
@@ -88,7 +88,8 @@ class SimpleXbmcGui(object):
"date": time.strftime("%d.%m.%Y",displayObject.date),
"year": int(time.strftime("%Y",displayObject.date)),
"title": title,
- "plot": transformHtmlCodes(displayObject.description)
+ "plot": transformHtmlCodes(displayObject.description),
+ "duration": displayObject.duration
});
except:
pass;
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=6834295ef0bbcf1c0108b418b75b5f11c3038b81
commit 6834295ef0bbcf1c0108b418b75b5f11c3038b81
Author: spiff <[email protected]>
Date: Mon Mar 12 10:29:01 2012 +0100
[plugin.video.spiegelonline] updated to version 1.1 thanks mad-max
diff --git a/.gitignore b/.gitignore
index e6894fe..8eb9e91 100644
--- a/.gitignore
+++ b/.gitignore
@@ -83,3 +83,4 @@ plugin.video.gamestar/.git
plugin.video.onside.tv/.git
plugin.video.onside.tv/.idea
plugin.image.500px/.git
+plugin.video.spiegelonline/.git
-----------------------------------------------------------------------
Summary of changes:
.gitignore | 1 +
plugin.video.mediathek/addon.xml | 6 +-
plugin.video.mediathek/changelog.txt | 1 +
plugin.video.mediathek/mediathek/__init__.py | 3 +-
plugin.video.mediathek/mediathek/ndr.py | 188 +++++++++++---------
plugin.video.mediathek/simplexbmc.py | 3 +-
.../LICENSE.txt | 0
plugin.video.spiegelonline/addon.xml | 16 ++
plugin.video.spiegelonline/changelog.txt | 8 +
plugin.video.spiegelonline/default.py | 91 ++++++++++
plugin.video.spiegelonline/icon.png | Bin 0 -> 38072 bytes
.../resources/language/English/strings.xml | 14 ++
.../resources/language/German/strings.xml | 15 ++
13 files changed, 256 insertions(+), 90 deletions(-)
copy {plugin.audio.groove => plugin.video.spiegelonline}/LICENSE.txt (100%)
create mode 100644 plugin.video.spiegelonline/addon.xml
create mode 100644 plugin.video.spiegelonline/changelog.txt
create mode 100644 plugin.video.spiegelonline/default.py
create mode 100644 plugin.video.spiegelonline/icon.png
create mode 100644
plugin.video.spiegelonline/resources/language/English/strings.xml
create mode 100644
plugin.video.spiegelonline/resources/language/German/strings.xml
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons