(.+?)<', re.DOTALL).findall(entry)
title = match[0]
match = re.compile('/image/(.+?)/16x9/', re.DOTALL).findall(entry)
thumb = baseUrl+"/image/"+match[0]+"/16x9/448"
if title!="Das Erste":
addLink(cleanTitle(title), channelID, 'playLive', thumb)
xbmcplugin.endOfDirectory(pluginhandle)
if forceViewMode:
xbmc.executebuiltin('Container.SetViewMode('+viewModeShows+')')
def listShowsAZMain():
addDir("0-9", "0-9", 'listShowsAZ', "")
letters = [chr(i) for i in xrange(ord('a'), ord('z')+1)]
for letter in letters:
addDir(letter.upper(), letter.upper(), 'listShowsAZ', "")
xbmcplugin.endOfDirectory(pluginhandle)
def listShowsAZ(letter):
content = getUrl(baseUrl+"/tv/sendungen-a-z?buchstabe="+letter)
spl = content.split('
(.+?)<', re.DOTALL).findall(entry)
title = match[0]
match = re.compile('/image/(.+?)/16x9/', re.DOTALL).findall(entry)
thumb = baseUrl+"/image/"+match[0]+"/16x9/0"
addShowDir(cleanTitle(title), baseUrl+url+'&m23644322=quelle.tv&rss=true', 'listVideosRss', thumb, cleanTitle(title))
xbmcplugin.endOfDirectory(pluginhandle)
if forceViewMode:
xbmc.executebuiltin('Container.SetViewMode('+viewModeShows+')')
def listShowsFavs():
xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_LABEL)
if os.path.exists(channelFavsFile):
fh = open(channelFavsFile, 'r')
all_lines = fh.readlines()
for line in all_lines:
title = line[line.find("###TITLE###=")+12:]
title = title[:title.find("#")]
url = line[line.find("###URL###=")+10:]
url = url[:url.find("#")]
thumb = line[line.find("###THUMB###=")+12:]
thumb = thumb[:thumb.find("#")]
addShowFavDir(title, urllib.unquote_plus(url), "listVideos", thumb)
fh.close()
xbmcplugin.endOfDirectory(pluginhandle)
if forceViewMode:
xbmc.executebuiltin('Container.SetViewMode('+viewModeShows+')')
def listEinsLike():
addDir(translation(30001), baseUrl+"/einslike/Neueste-Videos/mehr?documentId=21282466"+'&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30002), baseUrl+"/einslike/Meistabgerufene-Videos/mehr?documentId=21282464"+'&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30015), baseUrl+"/einslike/Musik/mehr?documentId=21301894"+'&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30016), baseUrl+"/einslike/Leben/mehr?documentId=21301896"+'&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30017), baseUrl+"/einslike/Netz-Tech/mehr?documentId=21301898"+'&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30018), baseUrl+"/einslike/Info/mehr?documentId=21301900"+'&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30019), baseUrl+"/einslike/Spa%C3%9F-Fiktion/mehr?documentId=21301902"+'&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
xbmcplugin.endOfDirectory(pluginhandle)
if forceViewMode:
xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def listChannels():
addDir("Das Erste", "208", 'listChannel', icon)
addDir("BR", "2224", 'listChannel', icon)
addDir("HR", "5884", 'listChannel', icon)
addDir("MDR", "5882", 'listChannel', icon)
addDir("NDR", "5906", 'listChannel', icon)
addDir("RB", "5898", 'listChannel', icon)
addDir("RBB", "5874", 'listChannel', icon)
addDir("SR", "5870", 'listChannel', icon)
addDir("SWR", "5310", 'listChannel', icon)
addDir("WDR", "5902", 'listChannel', icon)
addDir("Tagesschau24", "5878", 'listChannel', icon)
addDir("EinsPlus", "4178842", 'listChannel', icon)
addDir("EinsFestival", "673348", 'listChannel', icon)
#addDir("DW-TV", "5876", 'listChannel', icon)
xbmcplugin.endOfDirectory(pluginhandle)
def listChannel(channel):
addDir("Heute", baseUrl+"/tv/sendungVerpasst?kanal="+channel+"&tag=0", 'listChannelVideos', "")
addDir("Gestern", baseUrl+"/tv/sendungVerpasst?kanal="+channel+"&tag=1", 'listChannelVideos', "")
addDir((datetime.date.today()-datetime.timedelta(days=2)).strftime("%b %d, %Y"), baseUrl+"/tv/sendungVerpasst?kanal="+channel+"&tag=2", 'listChannelVideos', "")
addDir((datetime.date.today()-datetime.timedelta(days=3)).strftime("%b %d, %Y"), baseUrl+"/tv/sendungVerpasst?kanal="+channel+"&tag=3", 'listChannelVideos', "")
addDir((datetime.date.today()-datetime.timedelta(days=4)).strftime("%b %d, %Y"), baseUrl+"/tv/sendungVerpasst?kanal="+channel+"&tag=4", 'listChannelVideos', "")
addDir((datetime.date.today()-datetime.timedelta(days=5)).strftime("%b %d, %Y"), baseUrl+"/tv/sendungVerpasst?kanal="+channel+"&tag=5", 'listChannelVideos', "")
addDir((datetime.date.today()-datetime.timedelta(days=6)).strftime("%b %d, %Y"), baseUrl+"/tv/sendungVerpasst?kanal="+channel+"&tag=6", 'listChannelVideos', "")
xbmcplugin.endOfDirectory(pluginhandle)
def listCats(type):
addDir(translation(30004), baseUrl+"/tv/Film-Highlights/mehr?documentId=21301808" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30018), baseUrl+"/einslike/Info/mehr?documentId=21301900" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30031), baseUrl+"/tv/Kinder-Familie/mehr?documentId=21282542" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30032), baseUrl+"/tv/Kultur/mehr?documentId=21282546" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30016), baseUrl+"/einslike/Leben/mehr?documentId=21301896" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30015), baseUrl+"/einslike/Musik/mehr?documentId=21301894" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30017), baseUrl+"/einslike/Netz-Tech/mehr?documentId=21301898" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30003), baseUrl+"/tv/Reportage-Doku/mehr?documentId=21301806" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30033), baseUrl+"/tv/Satire-Unterhaltung/mehr?documentId=21282544" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30035), baseUrl+"/tv/Serien-Soaps/mehr?documentId=21282548" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30019), baseUrl+"/einslike/Spa%C3%9F-Fiktion/mehr?documentId=21301902" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
addDir(translation(30034), baseUrl+"/tv/Wissen/mehr?documentId=21282530" + '&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
#addDir(translation(30001), baseUrl+"/einslike/Neueste-Videos/mehr?documentId=21282466"+'&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
#addDir(translation(30002), baseUrl+"/einslike/Meistabgerufene-Videos/mehr?documentId=21282464"+'&m23644322=quelle.tv&rss=true', 'listVideosRss', "", nextPage=True, einsLike=True)
xbmcplugin.endOfDirectory(pluginhandle)
if forceViewMode:
xbmc.executebuiltin('Container.SetViewMode('+viewModeShows+')')
def playVideo(videoID):
playVideoUrl(baseUrl+"/tv/?documentId="+videoID,videoID)
def playVideoUrl(url,videoID=False):
if not videoID:
videoID = url.split('documentId=')[1]
if '&' in videoID:
videoID = videoID.split('&')[0]
content = getUrl(url)
match = re.compile('
(.+?)', re.DOTALL).findall(content)
if match:
xbmc.executebuiltin('XBMC.Notification(Info:,'+match[0].strip()+',15000)')
else:
content = getUrl(baseUrl+"/play/media/"+videoID+"?devicetype=pc&features=flash")
decoded = json.loads(content)
try:
subtitleUrl = decoded['_subtitleUrl']
subtitleOffset = decoded['_subtitleOffset']
except:
subtitleUrl = False
mediaArrays = decoded['_mediaArray']
streamType = False
savedQuality = -1
replacementQuality = 0
i = 0
for mediaArray in mediaArrays:
mediaStreamArrays = decoded['_mediaArray'][i]['_mediaStreamArray']
j = 0
for entry in mediaStreamArrays:
stream = decoded['_mediaArray'][i]['_mediaStreamArray'][j]['_stream']
quality = decoded['_mediaArray'][i]['_mediaStreamArray'][j]['_quality']
if quality == 'auto' and i == 0 and j == 0:
if stream.endswith('.smil'):
url = stream
streamType = 'smil'
else:
url = stream
streamType = 'f4m'
else:
streamType = 'httprtmp'
if isinstance(stream, list):
stream = stream[0]
if '_server' in decoded['_mediaArray'][i]['_mediaStreamArray'][j] and decoded['_mediaArray'][i]['_mediaStreamArray'][j]['_server'] != '':
if mdrHd:#MDR HD "hack"
replacementUrl = stream.split('/')[-1]
replacementQuality = int(quality)
stream = decoded['_mediaArray'][i]['_mediaStreamArray'][j]['_server']+" playpath="+stream+" live=true"
elif mdrHd and 'http://ondemand.mdr.de' in stream and replacementQuality == int(quality):#MDR HD "hack"
try:
stream = stream.replace(stream.split('/')[-1],replacementUrl)
except:
pass
if int(quality) > savedQuality and int(quality) <= videoQuality:
url = stream
j += 1
i += 1
if streamType == 'smil':
content = getUrl(url)
match = re.compile('.+?(.+?)', re.DOTALL).findall(content)
url = ""
if match:
url = match[0]
if url:
listitem = xbmcgui.ListItem(path=url)
xbmcplugin.setResolvedUrl(pluginhandle, True, listitem)
def search():
keyboard = xbmc.Keyboard('', translation(30008))
keyboard.doModal()
if keyboard.isConfirmed() and keyboard.getText():
search_string = keyboard.getText().replace(" ", "+")
listVideos(baseUrl+"/tv/suche?searchText="+search_string)
def cleanTitle(title):
title = title.replace("<", "<").replace(">", ">").replace("&", "&").replace(""", "\"").replace("'", "'").replace(""", "\"").replace("ß", "ß").replace("–", "-")
title = title.replace("Ä", "Ä").replace("Ü", "Ü").replace("Ö", "Ö").replace("ä", "ä").replace("ü", "ü").replace("ö", "ö").replace("é", "é").replace("è", "è")
title = title.replace("Ä","Ä").replace("ä","ä").replace("Ö","Ö").replace("ö","ö").replace("Ü","Ü").replace("ü","ü").replace("ß","ß")
title = title.replace("'","'").strip()
return title
def char_gen(size=1, chars=string.ascii_uppercase):
return ''.join(random.choice(chars) for x in range(size))
def getUrl(url):
print 'get: '+url
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0')
response = urllib2.urlopen(req)
link = response.read()
response.close()
return link
def favs(param):
mode = param[param.find("###MODE###=")+11:]
mode = mode[:mode.find("###")]
channelEntry = param[param.find("###TITLE###="):]
if mode == "ADD":
if os.path.exists(channelFavsFile):
fh = open(channelFavsFile, 'r')
content = fh.read()
fh.close()
if content.find(channelEntry) == -1:
fh = open(channelFavsFile, 'a')
fh.write(channelEntry+"\n")
fh.close()
else:
fh = open(channelFavsFile, 'a')
fh.write(channelEntry+"\n")
fh.close()
elif mode == "REMOVE":
refresh = param[param.find("###REFRESH###=")+14:]
refresh = refresh[:refresh.find("#")]
fh = open(channelFavsFile, 'r')
content = fh.read()
fh.close()
entry = content[content.find(channelEntry):]
fh = open(channelFavsFile, 'w')
fh.write(content.replace(channelEntry+"\n", ""))
fh.close()
if refresh == "TRUE":
xbmc.executebuiltin("Container.Refresh")
def parameters_string_to_dict(parameters):
paramDict = {}
if parameters:
paramPairs = parameters[1:].split("&")
for paramsPair in paramPairs:
paramSplits = paramsPair.split('=')
if (len(paramSplits)) == 2:
paramDict[paramSplits[0]] = paramSplits[1]
return paramDict
def addLink(name, url, mode, iconimage, duration="", desc="", genre=''):
u = sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)
ok = True
liz = xbmcgui.ListItem(name, iconImage=defaultThumb, thumbnailImage=iconimage)
#liz.setInfo(type="Video", infoLabels={"Title": name, "Duration": duration, "Plot": desc, "Genre": genre})
liz.setInfo(type="Video", infoLabels={"Title": name, "Plot": desc, "Genre": genre})
liz.setProperty('IsPlayable', 'true')
liz.addStreamInfo('video', { 'duration' : duration })
if useThumbAsFanart:
if not iconimage or iconimage==icon or iconimage==defaultThumb:
iconimage = defaultBackground
liz.setProperty("fanart_image", iconimage)
else:
liz.setProperty("fanart_image", defaultBackground)
#liz.addContextMenuItems([(translation(30012), 'RunPlugin(plugin://'+addonID+'/?mode=queueVideo&url='+urllib.quote_plus(u)+'&name='+urllib.quote_plus(name)+')',)])
xbmcplugin.setContent(int(sys.argv[1]), 'tvshows')
ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz)
return ok
def addDir(name, url, mode, iconimage, desc="", nextPage=False, einsLike=False):
u = sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)
if nextPage:
u += "&nextpage=True"
if einsLike:
u += "&einslike=True"
ok = True
liz = xbmcgui.ListItem(name, iconImage=icon, thumbnailImage=iconimage)
liz.setInfo(type="Video", infoLabels={"Title": name, "Plot": desc})
if useThumbAsFanart:
if not iconimage or iconimage==icon or iconimage==defaultThumb:
iconimage = defaultBackground
liz.setProperty("fanart_image", iconimage)
else:
liz.setProperty("fanart_image", defaultBackground)
ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=True)
return ok
def addShowDir(name, url, mode, iconimage, showName=""):
u = sys.argv[0]+"?url="+urllib.quote_plus(url)+"&name="+urllib.quote_plus(name)+"&mode="+str(mode)+"&nextpage=True"+"&hideshowname=True"+"&showName="+urllib.quote_plus(showName)
ok = True
liz = xbmcgui.ListItem(name, iconImage=defaultThumb, thumbnailImage=iconimage)
liz.setInfo(type="Video", infoLabels={"Title": name})
if useThumbAsFanart:
if not iconimage or iconimage==icon or iconimage==defaultThumb:
iconimage = defaultBackground
liz.setProperty("fanart_image", iconimage)
else:
liz.setProperty("fanart_image", defaultBackground)
playListInfos = "###MODE###=ADD###TITLE###="+name+"###URL###="+urllib.quote_plus(url)+"###THUMB###="+iconimage+"###END###"
#liz.addContextMenuItems([(translation(30028), 'RunPlugin(plugin://'+addonID+'/?mode=favs&url='+urllib.quote_plus(playListInfos)+')',)])
ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=True)
return ok
def addShowFavDir(name, url, mode, iconimage):
u = sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)
ok = True
liz = xbmcgui.ListItem(name, iconImage=defaultThumb, thumbnailImage=iconimage)
liz.setInfo(type="Video", infoLabels={"Title": name})
if useThumbAsFanart:
if not iconimage or iconimage==icon or iconimage==defaultThumb:
iconimage = defaultBackground
liz.setProperty("fanart_image", iconimage)
else:
liz.setProperty("fanart_image", defaultBackground)
playListInfos = "###MODE###=REMOVE###REFRESH###=TRUE###TITLE###="+name+"###URL###="+urllib.quote_plus(url)+"###THUMB###="+iconimage+"###END###"
#liz.addContextMenuItems([(translation(30029), 'RunPlugin(plugin://'+addonID+'/?mode=favs&url='+urllib.quote_plus(playListInfos)+')',)])
ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=True)
return ok
params = parameters_string_to_dict(sys.argv[2])
mode = urllib.unquote_plus(params.get('mode', ''))
url = urllib.unquote_plus(params.get('url', ''))
name = urllib.unquote_plus(params.get('name', ''))
showName = urllib.unquote_plus(params.get('showName', ''))
hideShowName = urllib.unquote_plus(params.get('hideshowname', '')) == 'True'
nextPage = urllib.unquote_plus(params.get('nextpage', '')) == 'True'
einsLike = urllib.unquote_plus(params.get('einslike', '')) == 'True'
if mode == 'listVideos':
listVideos(url)
if mode == 'listVideosXml':
listVideosXml(url)
elif mode == 'listDirRss':
listDirRss(url)
elif mode == 'listVideosRss':
listVideosRss(url,showName,hideShowName,nextPage,einsLike)
elif mode == 'listChannelVideos':
listChannelVideos(url)
elif mode == 'listEinsLike':
listEinsLike()
elif mode == 'listShowsFavs':
listShowsFavs()
elif mode == 'listChannel':
listChannel(url)
elif mode == 'listChannels':
listChannels()
elif mode == 'listLiveChannels':
listLiveChannels()
elif mode == 'listShowsAZMain':
listShowsAZMain()
elif mode == 'listShowsAZ':
listShowsAZ(url)
elif mode == 'listCats':
listCats(url)
elif mode == 'playVideo':
playVideo(url)
elif mode == 'playVideoUrl':
playVideoUrl(url)
elif mode == "queueVideo":
queueVideo(url, name)
elif mode == 'playLiveARD':
playLiveARD()
elif mode == 'playLive':
playLive(url)
elif mode == 'search':
search()
elif mode == 'favs':
favs(url)
else:
index()