Advertisement
Guest User

Untitled

a guest
Jan 13th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 50.46 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import sys
  5. import urlparse
  6. import xbmcgui
  7. import xbmcplugin
  8. import xbmcaddon
  9. import xbmc
  10. import xbmcvfs
  11. import urllib, urllib2, socket, cookielib, re, os, shutil,json
  12. import base64
  13. import ssl
  14. import hashlib
  15. from collections import OrderedDict
  16. from inputstreamhelper import Helper
  17.  
  18.  
  19. # Setting Variablen Des Plugins
  20.  
  21. base_url = sys.argv[0]
  22. addon_handle = int(sys.argv[1])
  23. args = urlparse.parse_qs(sys.argv[2][1:])
  24. addon = xbmcaddon.Addon()
  25. # Lade Sprach Variablen
  26. translation = addon.getLocalizedString
  27. cj = cookielib.LWPCookieJar();
  28. xbmcplugin.setContent(addon_handle, 'tvshows')
  29.  
  30. def AddonEnabled(addon_id):
  31. result = xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Addons.GetAddonDetails","id":1,\
  32. "params":{"addonid":"%s", "properties": ["enabled"]}}' % addon_id)
  33. return False if '"error":' in result or '"enabled":false' in result else True
  34.  
  35. def debug(content):
  36. log(content, xbmc.LOGDEBUG)
  37.  
  38. def notice(content):
  39. log(content, xbmc.LOGNOTICE)
  40.  
  41. def log(msg, level=xbmc.LOGNOTICE):
  42. addon = xbmcaddon.Addon()
  43. addonID = addon.getAddonInfo('id')
  44. xbmc.log('%s: %s' % (addonID, msg), level)
  45.  
  46. is_addon=""
  47. inputstreamcomp=addon.getSetting("inputstreamcomp")
  48. if AddonEnabled('inputstream.adaptive'):
  49. is_addon = 'inputstream.adaptive'
  50.  
  51. if not is_addon and not inputstreamcomp=="true":
  52. debug('No Inputstream Addon found or activated')
  53. debug('inputstreamcomp')
  54. debug(inputstreamcomp)
  55. dialog = xbmcgui.Dialog()
  56. dialog.notification("Inpuitstream Fehler", 'Inputstream nicht eingeschaltet', xbmcgui.NOTIFICATION_ERROR)
  57. exit
  58.  
  59. profile = xbmc.translatePath( addon.getAddonInfo('profile') ).decode("utf-8")
  60. temp = xbmc.translatePath( os.path.join( profile, 'temp', '') ).decode("utf-8")
  61. if not xbmcvfs.exists(temp):
  62. xbmcvfs.mkdirs(temp)
  63. favdatei = xbmc.translatePath( os.path.join(temp,"favorit.txt") ).decode("utf-8")
  64.  
  65. cert=addon.getSetting("cert")
  66. debug("##")
  67. debug(cert)
  68. if cert=="false":
  69. try:
  70. debug("#######")
  71. _create_unverified_https_context = ssl._create_unverified_context
  72. except AttributeError:
  73. # Legacy Python that doesn't verify HTTPS certificates by default
  74. pass
  75. else:
  76. # Handle target environment that doesn't support HTTPS verification
  77. ssl._create_default_https_context = _create_unverified_https_context
  78.  
  79.  
  80. try:
  81. import StorageServer
  82. except:
  83. import storageserverdummy as StorageServer
  84.  
  85. cachezeit=addon.getSetting("cachetime")
  86. cache = StorageServer.StorageServer("plugin.video.rtlnow", cachezeit) # (Your plugin name, Cache time in hours
  87.  
  88. def addLink(name, url, mode, iconimage, duration="", desc="", genre='',stunden=""):
  89. u = sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&stunden="+str(stunden)
  90. ok = True
  91. liz = xbmcgui.ListItem(name, iconImage="", thumbnailImage=iconimage)
  92. liz.setInfo(type="Video", infoLabels={"Title": name, "Plot": desc, "Genre": genre})
  93. liz.setProperty('IsPlayable', 'true')
  94. liz.addStreamInfo('video', { 'duration' : duration })
  95. liz.setProperty("fanart_image", iconimage)
  96. #liz.setProperty("fanart_image", defaultBackground)
  97. xbmcplugin.setContent(int(sys.argv[1]), 'tvshows')
  98. return u,liz,True
  99. #ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz)
  100. #return ok
  101.  
  102. def getUrl(url,data="x",header=""):
  103. global cj
  104. debug("Get Url: " +url)
  105. for cook in cj:
  106. debug(" Cookie :"+ str(cook))
  107. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
  108. userAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
  109. if header=="":
  110. opener.addheaders = [('User-Agent', userAgent)]
  111. else:
  112. opener.addheaders = header
  113. try:
  114. if data!="x" :
  115. content=opener.open(url,data=data).read()
  116. else:
  117. content=opener.open(url).read()
  118. except urllib2.HTTPError as e:
  119. #debug( e.code )
  120. cc=e.read()
  121. debug("Error : " +cc)
  122.  
  123. opener.close()
  124. return content
  125.  
  126. def parameters_string_to_dict(parameters):
  127. paramDict = {}
  128. if parameters:
  129. paramPairs = parameters[1:].split("&")
  130. for paramsPair in paramPairs:
  131. paramSplits = paramsPair.split('=')
  132. if (len(paramSplits)) == 2:
  133. paramDict[paramSplits[0]] = paramSplits[1]
  134. return paramDict
  135.  
  136. def addDir(name, url, mode, iconimage, desc="", duration="",nummer=0,bild="",title="",addtype=0,serie="",stunden=""):
  137. u = sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&nummer="+str(nummer)+"&bild="+str(bild)+"&title="+str(title)+"&stunden="+str(stunden)
  138. ok = True
  139. liz = xbmcgui.ListItem(name)
  140. liz.setArt({ 'fanart': iconimage })
  141. liz.setArt({ 'thumb': iconimage })
  142. liz.setInfo(type="Video", infoLabels={"Title": name, "Plot": desc, "Duration": duration})
  143. if addtype==1:
  144. commands = []
  145. updatestd=addon.getSetting("updatestd")
  146. debug("UPDATETIME :"+str(updatestd))
  147. link = "plugin://plugin.video.rtlnow/?mode=tolibrary&url=%s&name=%s&stunden=%s"%(urllib.quote_plus(url),serie+" "+name,str(updatestd))
  148. #debug("LINK :"+link)
  149. commands.append(( "Add to library", 'XBMC.RunPlugin('+ link +')'))
  150. liz.addContextMenuItems( commands )
  151. #ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=True)
  152. return u,liz,True
  153.  
  154. params = parameters_string_to_dict(sys.argv[2])
  155. mode = urllib.unquote_plus(params.get('mode', ''))
  156. channel = urllib.unquote_plus(params.get('channel', ''))
  157. url = urllib.unquote_plus(params.get('url', ''))
  158. nummer = urllib.unquote_plus(params.get('nummer', ''))
  159. name = urllib.unquote_plus(params.get('name', ''))
  160. title = urllib.unquote_plus(params.get('title', ''))
  161. bild = urllib.unquote_plus(params.get('bild', ''))
  162. stunden= urllib.unquote_plus(params.get('stunden', ''))
  163.  
  164. showName = urllib.unquote_plus(params.get('showName', ''))
  165. hideShowName = urllib.unquote_plus(params.get('hideshowname', '')) == 'True'
  166. nextPage = urllib.unquote_plus(params.get('nextpage', '')) == 'True'
  167. einsLike = urllib.unquote_plus(params.get('einslike', '')) == 'True'
  168.  
  169. xstream = urllib.unquote_plus(params.get('xstream', ''))
  170. xlink = urllib.unquote_plus(params.get('xlink', ''))
  171. xdrm = urllib.unquote_plus(params.get('xdrm', ''))
  172.  
  173.  
  174.  
  175. def serien(url):
  176. xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_VIDEO_SORT_TITLE)
  177. xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL)
  178. menu=[]
  179. debug("Serien New Menu")
  180. debug(url)
  181.  
  182. if "maxPerPage" in url:
  183. seitennr=1
  184. else:
  185. seitennr=0
  186. counter=1
  187. anzahl=1
  188.  
  189. found=0
  190.  
  191. while (anzahl>0):
  192. if seitennr>0:
  193. newurl=url+"&page="+str(seitennr)
  194. else:
  195. newurl=url
  196. content = cache.cacheFunction(getUrl,newurl)
  197. serienliste = json.loads(content, object_pairs_hook=OrderedDict)
  198. freeonly=addon.getSetting("freeonly")
  199. items=[]
  200. try:
  201. liste=serienliste["movies"]["items"]
  202. except:
  203. liste=serienliste["items"]
  204. for serieelement in liste:
  205. title=serieelement["title"].encode('utf-8')
  206. debug(title)
  207. seoUrl=serieelement["seoUrl"]
  208. idd=serieelement["id"]
  209. try:
  210. #Genre
  211. serieelement=serieelement["format"]
  212. except:
  213. pass
  214. try:
  215. logo=serieelement["defaultLogo"]
  216. desc=serieelement["infoTextLong"]
  217. freeep=serieelement["hasFreeEpisodes"]
  218. except:
  219. logo=""
  220. desc=""
  221. freeep="true"
  222. if (freeep==True or freeonly=="false") :
  223. menu.append(addDir(title , url=str(idd), mode="rubrik", iconimage=logo.encode("utf-8"),duration="",desc=desc,title=title,bild=logo.encode("utf-8")))
  224. counter+=1
  225. debug("Counter :"+str(counter))
  226. try:
  227. anzahl=serienliste["total"]-counter
  228. except:
  229. anzahl=0
  230. debug("Anzahl :### "+str(anzahl))
  231. seitennr=seitennr+1
  232. xbmcplugin.addDirectoryItems(addon_handle,menu)
  233. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  234.  
  235. def rubrik(name,titlex="",bild="") :
  236. menu=[]
  237. freeonly=addon.getSetting("freeonly")
  238. kodi18=addon.getSetting("kodi18")
  239. debug("Rubrik New Menu")
  240. xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_VIDEO_SORT_TITLE)
  241. #xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_NONE)
  242. #http://api.tvnow.de/v3/formats/seo?fields=*,.*,formatTabs.*,formatTabs.headline,&name=chicago-fire
  243. basurl="http://api.tvnow.de/v3/formats/"+str(name)+"?fields="
  244. div=urllib.quote_plus("*,.*,formatTabs.*,formatTabs.headline,annualNavigation.*")
  245. url=basurl+div
  246. debug(url)
  247. content = cache.cacheFunction(getUrl,url)
  248. kapitelliste = json.loads(content, object_pairs_hook=OrderedDict)
  249. serie=kapitelliste["title"]
  250. xidd=kapitelliste["id"]
  251.  
  252. menux=[]
  253. found=0
  254. if xbmcvfs.exists(favdatei):
  255. f=open(favdatei,'r')
  256. for line in f:
  257. if str(titlex) in line:
  258. found=1
  259. if found==0:
  260. menux.append(addDir("Hinzufügen zu Favoriten", str(name), mode="favadd", iconimage="", bild=bild,title=titlex))
  261. else:
  262. menux.append(addDir("Lösche Favoriten", str(name), mode="favdel", iconimage=""))
  263. xbmcplugin.addDirectoryItems(addon_handle,menux)
  264. if kapitelliste["annualNavigation"]["total"]==1:
  265. urlx='https://api.tvnow.de/v3/movies?fields=*,format,paymentPaytypes,pictures,trailers,packages&filter={%20%22FormatId%22%20:%20'+str(xidd)+'}&maxPerPage=3000&order=BroadcastStartDate%20asc'
  266. staffel("0",urlx)
  267. else:
  268. for kapitel in kapitelliste["annualNavigation"]["items"]:
  269. debug(kapitel)
  270. year=str(kapitel["year"] )
  271. urlx='https://api.tvnow.de/v3/movies?fields=*,format,paymentPaytypes,pictures,trailers,packages&filter={%22BroadcastStartDate%22:{%22between%22:{%22start%22:%22'+year+'-01-01%2000:00:00%22,%22end%22:%20%22'+year+'-12-31%2023:59:59%22}},%20%22FormatId%22%20:%20'+str(xidd)+'}&maxPerPage=3000&order=BroadcastStartDate%20asc'
  272. debug("URLX:"+urlx)
  273. #content2 = cache.cacheFunction(getUrl,urlx)
  274. menu.append(addDir(year , url=urlx,nummer="", mode="staffel", iconimage="",duration="",desc="",title=titlex,addtype=1,serie=serie))
  275.  
  276. xbmcplugin.addDirectoryItems(addon_handle,menu)
  277. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  278.  
  279. def get_sec(time_str):
  280. h, m, s = time_str.split(':')
  281. return int(h) * 3600 + int(m) * 60 + int(s)
  282.  
  283. def get_min(time_str):
  284. h, m, s = time_str.split(':')
  285. return int(h) * 3600 + int(m) * 60 + int(s) /60
  286.  
  287. def playdash(xstream,xlink,xdrm):
  288. helper = Helper(protocol='mpd', drm='widevine')
  289. if not helper.check_inputstream():
  290. xbmc.executebuiltin('Notification("Inputstream", "DRM geschützte Folgen gehen nur mit Inputstream")')
  291. kodi18 = addon.getSetting("kodi18")
  292. pos = 0
  293. xbmc.log("[plugin.video.rtlnow](playdash) xSTREAM : %s" %(xstream), xbmc.LOGNOTICE)
  294. headerfelder = "User-Agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36&Referer="+xlink
  295. if xstream != "":
  296. pos += 1
  297. if kodi18 == "true":
  298. listitem = xbmcgui.ListItem(path=xstream+"|"+headerfelder)
  299. else:
  300. listitem = xbmcgui.ListItem(path=xstream)
  301. listitem.setProperty('IsPlayable', 'true')
  302. listitem.setProperty('inputstreamaddon', 'inputstream.adaptive')
  303. listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd')
  304. if kodi18 == "true" and xdrm == "1" :
  305. ret,token=login()
  306. if token == "0":
  307. xbmcgui.Dialog().ok("TV-NOW Login Fehler", "[COLOR orangered]ACHTUNG : ... Für diese Sendung ist ein Login mit *Benutzername* und *Passwort* erforderlich !!![/COLOR]", "Es ist mindestens „WATCHBOX-Free-Account“ Vorraussetzung !!!", "Bitte einen Account unter: „https://www.watchbox.de/registrieren“ oder: „https://www.tvnow.de/?registration“ erstellen !!!")
  308. else:
  309. pos += 1
  310. licstring = "https://widevine.rtl.de/index/proxy|x-auth-token="+token+"&"+headerfelder+"&Content-Type=|R{SSM}|"
  311. listitem.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
  312. listitem.setProperty('inputstream.adaptive.license_key', licstring)
  313. else:
  314. if xdrm == "1":
  315. xbmcgui.Dialog().ok("TV-NOW / KODI-Version-Fehler", "[COLOR orangered]ACHTUNG : ... Für diese Sendung ist mindestens *KODI 18* erforderlich !!![/COLOR]", "Bitte die vorhandene KODI-Installation mindestens auf KODI-Version 18 updaten !!!")
  316. if (pos == 1 and xdrm == "0") or (pos == 2 and xdrm == "1"):
  317. xbmcplugin.setResolvedUrl(addon_handle, True, listitem)
  318. else:
  319. xbmcgui.Dialog().notification("TV-NOW : [COLOR red]!!! DASH - URL - ERROR !!![/COLOR]", "ERROR = [COLOR red]Der übertragene *Dash-Abspiel-Link* ist FEHLERHAFT ![/COLOR]", xbmcgui.NOTIFICATION_ERROR, time=6000)
  320.  
  321. def staffel(idd,url) :
  322. xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_VIDEO_SORT_TITLE)
  323. debug("staffel Staffel idd:"+idd)
  324. menu=[]
  325. xy=[]
  326. menulist=""
  327. global cache
  328. ret,token=login()
  329. debug("staffel Lade staffel neu")
  330. #http://api.tvnow.de/v3/formatlists/41018?maxPerPage=5000&fields=*,formatTabPages.*,formatTabPages.container.*,formatTabPages.container.movies.*,formatTabPages.container.movies.format.*,formatTabPages.container.movies.paymentPaytypes.*,formatTabPages.container.movies.pictures&page=1http://api.tvnow.de/v3/formatlists/41016?maxPerPage=9&fields=*,formatTabPages.*,formatTabPages.container.*,formatTabPages.container.movies.*,formatTabPages.container.movies.format.*,formatTabPages.container.movies.paymentPaytypes.*,formatTabPages.container.movies.pictures&page=1
  331. debug("staffel url :"+url)
  332. content = cache.cacheFunction(getUrl,url)
  333. folgen = json.loads(content, object_pairs_hook=OrderedDict)
  334. dummy=[]
  335. try:
  336. folgex=folgen["formatTabPages"]["items"][0]["container"]["movies"]
  337. debug("container found")
  338. for ele in folgen["formatTabPages"]["items"]:
  339. debug("ELE")
  340. debug(ele)
  341. try:
  342. dummy=dummy+ele["container"]["movies"]["items"]
  343. except:
  344. pass
  345.  
  346. folgen=dummy
  347. except:
  348. try:
  349. folgen=folgen["movies"]["items"]
  350. except:
  351. folgen=folgen["items"]
  352. debug("staffel Liste:")
  353. debug(folgen)
  354. freeonly=addon.getSetting("freeonly")
  355. kodi18=addon.getSetting("kodi18")
  356. debug("Staffel freeonly : "+str(freeonly))
  357. debug("Staffel kodi18 : "+str(kodi18))
  358. for element in folgen:
  359. folge=element
  360. debug("staffel Element:")
  361. debug(element)
  362. try:
  363. debug(folge["isDrm"])
  364. debug(folge["free"])
  365. except:
  366. continue
  367. if ( folge["isDrm"]==False or kodi18=="true") and ( folge["free"]==True or freeonly=="false"):
  368. debug("--")
  369. name=folge["title"]
  370. idd=folge["id"]
  371. debug("staffel a")
  372. bild="https://ais.tvnow.de/tvnow/movie/"+str(idd)+"/600x600/title.jpg"
  373. stream=folge["manifest"]["dashclear"].strip()
  374. if folge["isDrm"]==True:
  375. try:
  376. streamcode=folge["manifest"]["dash"].strip()
  377. except:
  378. streamcode="0"
  379. else:
  380. streamcode="0"
  381. debug("staffel b")
  382. laenge=get_sec(folge["duration"])
  383. laengemin=get_min(folge["duration"])
  384. sstaffel=str(folge["season"])
  385. debug("staffel c")
  386. folgenr=str(folge["episode"])
  387. plot=folge["articleLong"]
  388. plotshort=folge["articleShort"]
  389. debug("staffel d")
  390. startdate=folge["broadcastStartDate"]
  391. tagline=folge["teaserText"]
  392. deeplink=folge["deeplinkUrl"]
  393. serienname=folge["format"]["title"]
  394. debug("staffel e")
  395. try:
  396. type=folge["format"]["categoryId"]
  397. except:
  398. type=""
  399. ftype="episode"
  400. if type=="serie":
  401. ftype="episode"
  402. if type=="film":
  403. ftype="movie"
  404. zusatz=" ("+startdate+ " )"
  405. title=name+zusatz
  406. haswert=hashlib.md5(title.encode('utf-8')).hexdigest()
  407. zeile=haswert+"###"+stream+"###"+title+"###"+bild+"###"+str(laenge)+"###"+plot+"###"+plotshort+"###"+tagline+"###"+ftype+"###"+streamcode+"###"+str(token)+"###"+str(deeplink)+"###"
  408. menulist=menulist+zeile.replace("\n"," ").encode('utf-8')+"\n"
  409. listitem = xbmcgui.ListItem(path="plugin://plugin.video.rtlnow/?nummer="+haswert+"&mode=hashplay",label=title,iconImage=bild,thumbnailImage=bild)
  410. listitem.setProperty('IsPlayable', 'true')
  411. listitem.addStreamInfo('video', {'duration': laenge,'plot' : plot,'plotoutline' : plotshort,'tagline':tagline,'mediatype':ftype})
  412. listitem.setInfo(type="Video", infoLabels={'duration': laenge,"Title": title, "Plot": plot,'plotoutline': plotshort,'tagline':tagline,'mediatype':ftype ,"episode": folgenr, "season":sstaffel,"sorttitle":"S"+sstaffel+"E"+folgenr+" "+title,'tvshowtitle':serienname })
  413. #listitem.setInfo(type='video')
  414. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url="plugin://plugin.video.rtlnow/?nummer="+haswert+"&mode=hashplay", listitem=listitem)
  415. #addLink(name, stream, "playvideo", bild)
  416. updatestd=addon.getSetting("updatestd")
  417. debug(urllib.quote_plus(sys.argv[2]))
  418. menu.append(addDir("Add to Library",url,"tolibrary","",stunden=str(updatestd)))
  419. xbmcplugin.addDirectoryItems(addon_handle,menu)
  420. f = open( os.path.join(temp,"menu.txt"), 'w')
  421. f.write(menulist)
  422. f.close()
  423. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  424.  
  425. def generatefiles(url) :
  426. mediapath=addon.getSetting("mediapath")
  427. once=1
  428. debug("Start generatefiles")
  429. xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_VIDEO_SORT_TITLE)
  430. debug("staffel URL:"+url)
  431. menu=[]
  432. xy=[]
  433. menulist=""
  434. global cache
  435. ret,token=login()
  436. debug("staffel Lade staffel neu")
  437. #http://api.tvnow.de/v3/formatlists/41018?maxPerPage=5000&fields=*,formatTabPages.*,formatTabPages.container.*,formatTabPages.container.movies.*,formatTabPages.container.movies.format.*,formatTabPages.container.movies.paymentPaytypes.*,formatTabPages.container.movies.pictures&page=1http://api.tvnow.de/v3/formatlists/41016?maxPerPage=9&fields=*,formatTabPages.*,formatTabPages.container.*,formatTabPages.container.movies.*,formatTabPages.container.movies.format.*,formatTabPages.container.movies.paymentPaytypes.*,formatTabPages.container.movies.pictures&page=1
  438. debug("staffel url :"+url)
  439. content = cache.cacheFunction(getUrl,url)
  440. folgen = json.loads(content, object_pairs_hook=OrderedDict)
  441. dummy=[]
  442. try:
  443. folgex=folgen["formatTabPages"]["items"][0]["container"]["movies"]
  444. debug("container found")
  445. for ele in folgen["formatTabPages"]["items"]:
  446. debug("ELE")
  447. debug(ele)
  448. try:
  449. dummy=dummy+ele["container"]["movies"]["items"]
  450. except:
  451. pass
  452.  
  453. folgen=dummy
  454. except:
  455. try:
  456. folgen=folgen["movies"]["items"]
  457. except:
  458. folgen=folgen["items"]
  459. debug("staffel Liste:")
  460. debug(folgen)
  461. freeonly=addon.getSetting("freeonly")
  462. kodi18=addon.getSetting("kodi18")
  463. debug("Staffel freeonly : "+str(freeonly))
  464. debug("Staffel kodi18 : "+str(kodi18))
  465. for element in folgen:
  466. folge=element
  467. debug("staffel Element:")
  468. debug(element)
  469. try:
  470. debug(folge["isDrm"])
  471. debug(folge["free"])
  472. except:
  473. continue
  474. if ( folge["isDrm"]==False or kodi18=="true") and ( folge["free"]==True or freeonly=="false"):
  475. debug("--")
  476. name=folge["title"]
  477. idd=folge["id"]
  478. debug("staffel a")
  479. bild="https://ais.tvnow.de/tvnow/movie/"+str(idd)+"/600x600/title.jpg"
  480. stream=folge["manifest"]["dashclear"].strip()
  481. if folge["isDrm"]==True:
  482. try:
  483. streamcode=folge["manifest"]["dash"].strip()
  484. except:
  485. streamcode="0"
  486. else:
  487. streamcode="0"
  488. debug("staffel b")
  489. laenge=get_sec(folge["duration"])
  490. laengemin=get_min(folge["duration"])
  491. sstaffel=str(folge["season"])
  492. debug("staffel c")
  493. folgenr=str(folge["episode"])
  494. plot=folge["articleLong"]
  495. plotshort=folge["articleShort"]
  496. debug("staffel d")
  497. startdate=folge["broadcastStartDate"]
  498. tagline=folge["teaserText"]
  499. deeplink=folge["deeplinkUrl"]
  500. serienname=folge["format"]["title"]
  501. folgenname=folge["title"].encode("utf-8")
  502. airdate=folge["broadcastStartDate"].encode("utf-8")
  503. seriendesc=folge["format"]["infoTextLong"]
  504. serienbild=folge["format"]["defaultDvdImage"]
  505. debug("staffel e")
  506. try:
  507. type=folge["format"]["categoryId"]
  508. except:
  509. type=""
  510. ftype="episode"
  511. if type=="serie":
  512. ftype="episode"
  513. if type=="film":
  514. ftype="movie"
  515. zusatz=" ("+startdate+ " )"
  516. title=name+zusatz
  517. haswert=hashlib.md5(title.encode('utf-8')).hexdigest()
  518. titlef=title.replace(" ","_").replace(":","_")
  519. serief=serienname.replace(" ","_").replace(":","_")
  520. #debug(namef)
  521. #ppath=mediapath+serief.replace(" ","_")
  522. ppath=os.path.join(mediapath,serief.replace(" ","_"),"")
  523. debug("PPATH :"+ppath.encode("utf-8"))
  524. if xbmcvfs.exists(ppath):
  525. if once==1:
  526. shutil.rmtree(ppath)
  527. once=0
  528. os.mkdir(ppath)
  529. else:
  530. ret=os.mkdir(ppath)
  531. debug("Angelegt ppath "+str(ret))
  532. once=0
  533. filename=os.path.join(ppath,titlef+".strm")
  534. nfostring="""
  535. <episodedetails>
  536. <title>%s</title>
  537. <season>%s</season>
  538. <episode>%s</episode>
  539. <showtitle>%s</showtitle>
  540. <plot>%s</plot>
  541. <runtime>%s</runtime>
  542. <thumb aspect="" type="" season="">%s</thumb>
  543. <aired>%s</aired>
  544. </tvshow>"""
  545. nfoseriestring="""
  546. <tvshow>
  547. <title>%s</title>
  548. <plot>%s</plot>
  549. <thumb aspect="" type="" season="">%s</thumb>
  550. </tvshow>"""
  551. nfostring=nfostring%(folgenname,str(sstaffel).encode("utf-8"),folgenr,serienname.encode("utf-8"),plot.encode("utf-8"),str(laengemin),bild,airdate)
  552. nfoseriestring=nfoseriestring%(serienname.encode("utf-8"),seriendesc.encode("utf-8"),serienbild.encode("utf-8"))
  553. nfofile=os.path.join(ppath,titlef+".nfo")
  554. file = xbmcvfs.File(nfofile,"w")
  555. file.write(nfostring)
  556. file.close()
  557. debug("#####")
  558. debug(filename.encode("utf-8"))
  559. file = xbmcvfs.File(filename,"w")
  560. file.write("plugin://plugin.video.rtlnow/?mode=playfolge&url="+urllib.quote_plus(str(url))+"&nummer="+str(idd))
  561. file.close()
  562. nfofile=os.path.join(ppath,"tvshow.nfo")
  563. file = xbmcvfs.File(nfofile,"w")
  564. file.write(nfoseriestring)
  565.  
  566.  
  567.  
  568. def playfolge(url,nummer):
  569. debug("PLAYFOLGE :"+url)
  570. ret,token=login()
  571. content = cache.cacheFunction(getUrl,url)
  572. folgen = json.loads(content, object_pairs_hook=OrderedDict)
  573. dummy=[]
  574. try:
  575. folgex=folgen["formatTabPages"]["items"][0]["container"]["movies"]
  576. debug("container found")
  577. for ele in folgen["formatTabPages"]["items"]:
  578. debug("ELE")
  579. debug(ele)
  580. try:
  581. dummy=dummy+ele["container"]["movies"]["items"]
  582. except:
  583. pass
  584.  
  585. folgen=dummy
  586. except:
  587. try:
  588. folgen=folgen["movies"]["items"]
  589. except:
  590. folgen=folgen["items"]
  591. debug("staffel Liste:")
  592. debug(folgen)
  593. freeonly=addon.getSetting("freeonly")
  594. kodi18=addon.getSetting("kodi18")
  595. debug("Staffel freeonly : "+str(freeonly))
  596. debug("Staffel kodi18 : "+str(kodi18))
  597. once=1
  598. for element in folgen:
  599. folge=element
  600. debug("staffel Element:")
  601. debug(element)
  602. try:
  603. debug(folge["isDrm"])
  604. debug(folge["free"])
  605. except:
  606. continue
  607. if ( folge["isDrm"]==False or kodi18=="true") and ( folge["free"]==True or freeonly=="false"):
  608. debug("--")
  609. name=folge["title"]
  610. idd=folge["id"]
  611. if not str(idd)==str(nummer):
  612. continue
  613. debug("staffel a")
  614. bild="https://ais.tvnow.de/tvnow/movie/"+str(idd)+"/600x600/title.jpg"
  615. stream=folge["manifest"]["dashclear"].strip()
  616. if folge["isDrm"]==True:
  617. try:
  618. streamcode=folge["manifest"]["dash"].strip()
  619. except:
  620. streamcode="0"
  621. else:
  622. streamcode="0"
  623. debug("staffel b")
  624. laenge=get_sec(folge["duration"])
  625. laengemin=get_min(folge["duration"])
  626. sstaffel=str(folge["season"])
  627. debug("staffel c")
  628. folgenr=str(folge["episode"])
  629. plot=folge["articleLong"]
  630. plotshort=folge["articleShort"]
  631. debug("staffel d")
  632. startdate=folge["broadcastStartDate"]
  633. tagline=folge["teaserText"]
  634. deeplink=folge["deeplinkUrl"]
  635. serienname=folge["format"]["title"]
  636. debug("staffel e")
  637. try:
  638. type=folge["format"]["categoryId"]
  639. except:
  640. type=""
  641. ftype="episode"
  642. if type=="serie":
  643. ftype="episode"
  644. if type=="film":
  645. ftype="movie"
  646. zusatz=" ("+startdate+ " )"
  647. title=name+zusatz
  648. haswert=hashlib.md5(title.encode('utf-8')).hexdigest()
  649. titlef=title.replace(" ","_").replace(":","_")
  650. serief=serienname.replace(" ","_").replace(":","_")
  651. #debug(namef)
  652. if kodi18=="true" :
  653. if not streamcode=="0":
  654. stream=streamcode
  655. debug("STREAM : #" +stream +"#")
  656. content = getUrl(deeplink)
  657. referer=re.compile("webLink = '(.+?)'", re.DOTALL).findall(content)[0]
  658. headerfelder="user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36&Referer="+referer
  659. stream=stream.split("?")[0]
  660. if kodi18=="true" :
  661. listitem = xbmcgui.ListItem(path=stream+"|"+headerfelder,label=title,iconImage=bild,thumbnailImage=bild)
  662. else:
  663. listitem = xbmcgui.ListItem(path=stream,label=title,iconImage=bild,thumbnailImage=bild)
  664. listitem.setProperty('IsPlayable', 'true')
  665. listitem.addStreamInfo('video', {'duration': laenge,'plot' : plot,'plotoutline' : plotshort,'tagline':tagline,'mediatype':ftype })
  666. listitem.setInfo(type="Video", infoLabels={'duration': laenge,"Title": title, "Plot": plot,'plotoutline': plotshort,'tagline':tagline,'mediatype':ftype})
  667. listitem.setProperty(u'IsPlayable', u'true')
  668. listitem.setProperty('inputstreamaddon', 'inputstream.adaptive')
  669. listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd')
  670. if kodi18=="true" :
  671. if token=="0" and not streamcode=="0":
  672. dialog = xbmcgui.Dialog()
  673. dialog.notification("Login Notwendig", 'Es ist min. Ein Freier Watchbox account Notwendig', xbmcgui.NOTIFICATION_ERROR)
  674. else:
  675. licstring='https://widevine.rtl.de/index/proxy|x-auth-token='+token+"&"+headerfelder+"&Content-Type=|R{SSM}|"
  676. debug(licstring)
  677. listitem.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
  678. listitem.setProperty('inputstream.adaptive.license_key', licstring)
  679. debug("LICENSE: " + licstring)
  680. if kodi18=="true" :
  681. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=stream+"|"+headerfelder, listitem=listitem)
  682. else:
  683. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=stream, listitem=listitem)
  684. xbmcplugin.setResolvedUrl(addon_handle,True, listitem)
  685.  
  686. def hashplay(idd):
  687. debug("hashplay url :"+idd)
  688. f=xbmcvfs.File( os.path.join(temp,"menu.txt"),"r")
  689. daten=f.read()
  690. zeilen=daten.split('\n')
  691. for zeile in zeilen:
  692. debug ("Read Zeile :"+zeile)
  693. felder=zeile.split("###")
  694. debug("Felder ")
  695. debug(felder)
  696. if felder[0]==idd:
  697. debug("Gefunden")
  698. stream=felder[1].split("?")[0]
  699. title=felder[2]
  700. bild=felder[3]
  701. laenge=felder[4]
  702. plot=felder[5]
  703. plotshort=felder[6]
  704. tagline=felder[7]
  705. ftype=felder[8]
  706. streamcode=felder[9]
  707. token=felder[10]
  708. deeplink=felder[11]
  709. kodi18=addon.getSetting("kodi18")
  710. if kodi18=="true" :
  711. if not streamcode=="0":
  712. stream=streamcode
  713. debug("STREAM : #" +stream +"#")
  714. content = getUrl(deeplink)
  715. referer="unknown"
  716. #referer=re.compile("webLink = '(.+?)'", re.DOTALL).findall(content)[0]
  717. headerfelder="user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36&Referer="+referer
  718. if kodi18=="true" :
  719. listitem = xbmcgui.ListItem(path=stream+"|"+headerfelder,label=title,iconImage=bild,thumbnailImage=bild)
  720. else:
  721. listitem = xbmcgui.ListItem(path=stream,label=title,iconImage=bild,thumbnailImage=bild)
  722. listitem.setProperty('IsPlayable', 'true')
  723. listitem.addStreamInfo('video', {'duration': laenge,'plot' : plot,'plotoutline' : plotshort,'tagline':tagline,'mediatype':ftype })
  724. listitem.setInfo(type="Video", infoLabels={'duration': laenge,"Title": title, "Plot": plot,'plotoutline': plotshort,'tagline':tagline,'mediatype':ftype})
  725. listitem.setProperty(u'IsPlayable', u'true')
  726. listitem.setProperty('inputstreamaddon', 'inputstream.adaptive')
  727. listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd')
  728. if kodi18=="true" :
  729. if token=="0" and not streamcode=="0":
  730. dialog = xbmcgui.Dialog()
  731. dialog.notification("Login Notwendig", 'Es ist min. Ein Freier Watchbox account Notwendig', xbmcgui.NOTIFICATION_ERROR)
  732. else:
  733. licstring='https://widevine.rtl.de/index/proxy|x-auth-token='+token+"&"+headerfelder+"&Content-Type=|R{SSM}|"
  734. debug(licstring)
  735. listitem.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
  736. listitem.setProperty('inputstream.adaptive.license_key', licstring)
  737. debug("LICENSE: " + licstring)
  738. if kodi18=="true" :
  739. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=stream+"|"+headerfelder, listitem=listitem)
  740. else:
  741. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=stream, listitem=listitem)
  742. xbmcplugin.setResolvedUrl(addon_handle,True, listitem)
  743. #addLink(name, stream, "playvideo", bild)
  744.  
  745. def login():
  746. debug("Start login")
  747. username=addon.getSetting("user")
  748. password=addon.getSetting("pass")
  749. if username=="" and password=="":
  750. debug("Kein Password")
  751. addon.setSetting("freeonly", "true")
  752. return 0,"0"
  753. url="https://api.tvnow.de/v3/backend/login"
  754. values = {'password' : password,
  755. 'email' : username,
  756. }
  757. data = urllib.urlencode(values)
  758. debug("######LOGINDATA#####")
  759. debug(data)
  760. try:
  761. content = getUrl(url,data=data)
  762. userdata = json.loads(content)
  763. try:
  764. token=userdata["token"]
  765. except:
  766. return 0,"0"
  767. debug(userdata)
  768. log("### Subscriptioon ### "+ str(userdata["subscriptionState"]))
  769. if userdata["subscriptionState"]==5 or userdata["subscriptionState"]==4:
  770. debug("Login ok")
  771. addon.setSetting("freeonly", "false")
  772.  
  773. return 1,token
  774. else :
  775. addon.setSetting("freeonly", "true")
  776. return 1,token
  777. except:
  778. debug("Wrong Login")
  779. addon.setSetting("freeonly", "true")
  780. return 0,"0"
  781. debug(content)
  782.  
  783. def genre(url):
  784. menu=[]
  785. #https://api.tvnow.de/v3/channels/station/rtl?fields=*&filter=%7B%22Active%22:true%7D&maxPerPage=500&page=1
  786. urln="https://api.tvnow.de/v3/channels/station/"+url+"?fields=*&filter=%7B%22Active%22:true%7D&maxPerPage=500"
  787. content = cache.cacheFunction(getUrl,urln)
  788. genres = json.loads(content, object_pairs_hook=OrderedDict)
  789. for genre in genres["items"]:
  790. id=genre["id"]
  791. name=genre["title"]
  792. image="https://ais.tvnow.de/tvnow/cms/"+genre["defaultImage"]+"/300x169/image2.jpg"
  793. menu.append(addDir(name , url=url, mode="listgenre", iconimage=image,duration="",desc="",nummer=id))
  794. xbmcplugin.addDirectoryItems(addon_handle,menu)
  795. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  796.  
  797. def index():
  798. menu=[]
  799. ret,token=login()
  800. freeonly=addon.getSetting("freeonly")
  801. kodi18=addon.getSetting("kodi18")
  802. menu.append(addDir("Favoriten", "", 'listfav', ""))
  803. menu.append(addDir("Nach Sendern", "", 'sendermenu', ""))
  804. menu.append(addDir("Themen" , url="rtl", mode="genre", iconimage="",duration="",desc=""))
  805. menu.append(addDir("Rubriken" , url="", mode="katalog", iconimage="",duration="",desc=""))
  806. menu.append(addDir("Genres" , url="", mode="genreliste", iconimage="",duration="",desc=""))
  807. if kodi18 == "true":
  808. lasturl="https://api.tvnow.de/v3/movies?fields=[%22broadcastStartDate%22,%22articleShort%22,%22articleLong%22,%22id%22,%22episode%22,%22season%22,%22title%22,%22articleShort%22,%22isDrm%22,%22free%22,%22teaserText%22,%22deeplinkUrl%22,%22duration%22,%22manifest%22,[%22dash%22,%22dashclear%22],%22format%22,[%22categoryId%22]]&order=id%20desc&maxPerPage=100"
  809. else:
  810. lasturl="https://api.tvnow.de/v3/movies?fields=[%22broadcastStartDate%22,%22articleShort%22,%22articleLong%22,%22id%22,%22episode%22,%22season%22,%22title%22,%22articleShort%22,%22isDrm%22,%22free%22,%22teaserText%22,%22deeplinkUrl%22,%22duration%22,%22manifest%22,[%22dash%22,%22dashclear%22],%22format%22,[%22categoryId%22]]&order=id%20desc&maxPerPage=100&filter={%22isDrm%22:false}"
  811. menu.append(addDir("Neuste" , url=lasturl, mode="last", iconimage="",duration="",desc=""))
  812. if ret==1 and kodi18 == "true":
  813. menu.append(addDir("LiveTV",url="", mode="livetv", iconimage="",duration="",desc=""))
  814. menu.append(addDir("Suche", "", 'searchit', ""))
  815. menu.append(addDir("Cache Loeschen", "", 'clearcache', ""))
  816. menu.append(addDir("Settings", "", 'Settings', ""))
  817. menu.append(addDir("Inputstream Einstellungen", "", 'inputsettings', ""))
  818. xbmcplugin.addDirectoryItems(addon_handle,menu)
  819. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  820.  
  821. def sendermenu():
  822. debug("START")
  823. menu=[]
  824. debug("New MENU")
  825. ret,token=login()
  826. content = cache.cacheFunction(getUrl,"https://api.tvnow.de/v3/settings")
  827. settings = json.loads(content, object_pairs_hook=OrderedDict)
  828. aliases=settings["settings"]["nowtv"]["local"]["stations"]["aliases"]
  829. for name,value in aliases.items():
  830. if not name=="ztoggoplus" :
  831. newimg=os.path.join(xbmcaddon.Addon().getAddonInfo('path'),"logos",name +".png")
  832. menu.append(addDir(value , url=name, mode="serien", iconimage=newimg,duration="",desc=""))
  833. xbmcplugin.addDirectoryItems(addon_handle,menu)
  834. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  835.  
  836. def genremenu(url):
  837. menu=[]
  838. content = cache.cacheFunction(getUrl,url)
  839. genres = json.loads(content)
  840. if genres["total"]>1:
  841. menu.append(addDir("Alle Serien" , url=url, mode="serien", iconimage="",duration="",desc=""))
  842. menu.append(addDir("Genres" , url=url, mode="genre", iconimage="",duration="",desc=""))
  843. xbmcplugin.addDirectoryItems(addon_handle,menu)
  844. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  845.  
  846. def katalog():
  847. menu=[]
  848. url="https://api.tvnow.de/v3/pages/nowtv/tvnow?fields=teaserSets.headline,teaserSets.id"
  849. content = cache.cacheFunction(getUrl,url)
  850. objekte = json.loads(content ,object_pairs_hook=OrderedDict)
  851. liste=objekte["teaserSets"]["items"]
  852. for serie in liste:
  853. name=serie["headline"]
  854. idd=str(serie["id"])
  855. if not idd=="2255" and not idd=="7619":
  856. menu.append(addDir(name , url=str(idd), mode="katalogliste", iconimage="",duration="",desc=""))
  857. xbmcplugin.addDirectoryItems(addon_handle,menu)
  858. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  859.  
  860. def katalogliste(idd) :
  861. menu=[]
  862. url="https://api.tvnow.de/v3/teasersets/"+idd+"?fields=[%22teaserSetInformations%22,[%22format%22,[%22id%22,%22title%22,%22seoUrl%22,%22defaultDvdImage%22,%22infoText%22]]]"
  863. debug("katalogliste")
  864. debug("URL :"+url)
  865. content = cache.cacheFunction(getUrl,url)
  866. objekte = json.loads(content, object_pairs_hook=OrderedDict)
  867. liste=objekte["teaserSetInformations"]["items"]
  868. for serie in liste:
  869. debug("---")
  870. debug(serie)
  871. try:
  872. iid=serie["format"]["id"]
  873. seoUrl=serie["format"]["seoUrl"]
  874. title=serie["format"]["title"]
  875. logo=serie["format"]["defaultDvdImage"]
  876. desc=serie["format"]["infoText"]
  877. menu.append(addDir(title , url=str(iid), mode="rubrik", iconimage=logo,duration="",desc=desc,title=title))
  878. except:
  879. pass
  880. xbmcplugin.addDirectoryItems(addon_handle,menu)
  881. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  882.  
  883. def clearcache():
  884. debug("CLear Cache")
  885. cache.delete("%")
  886.  
  887. def genreliste():
  888. menu=[]
  889. url="https://cdn.static-fra.de/tvnow/app/e81664b7.main.js"
  890. content = cache.cacheFunction(getUrl,url)
  891. liste=re.compile('return\[([^\]]+?)\]\}return', re.DOTALL).findall(content)[0]
  892. elemente=liste.replace('"',"").split(",")
  893. for element in elemente:
  894. uri="https://api.tvnow.de/v3/formats/genre/"+element+"?fields=*&filter=%7B%22station%22:%22none%22%7D&maxPerPage=500&order=NameLong+asc"
  895. menu.append(addDir(element , url=uri, mode="lsserie", iconimage="",duration="",desc=""))
  896. xbmcplugin.addDirectoryItems(addon_handle,menu)
  897. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  898.  
  899. def inputsettings() :
  900. xbmcaddon.Addon(is_addon).openSettings()
  901.  
  902. def playchannel_dash(url,name,image):
  903. helper = Helper(protocol='mpd', drm='widevine')
  904. if not helper.check_inputstream():
  905. xbmc.executebuiltin('Notification("Inputstream", "DRM geschützte Folgen gehen nur mit Inputstream")')
  906. ret,token=login()
  907. if token=="0":
  908. dialog = xbmcgui.Dialog()
  909. dialog.notification("Fuer Plus", 'Nur fuer Plusmitglieder', xbmcgui.NOTIFICATION_ERROR)
  910. return
  911. referer="https://www.tvnow.de/"+name+"/live-tv"
  912. headerfelder="user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36&Referer="+referer
  913. listitem = xbmcgui.ListItem(path=url+"||"+headerfelder,label=name,iconImage=image,thumbnailImage=image)
  914. listitem.setProperty('IsPlayable', 'true')
  915. listitem.setInfo(type="Video", infoLabels={"Title": name })
  916. listitem.setProperty('inputstreamaddon', 'inputstream.adaptive')
  917. listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd')
  918. licstring='https://widevine.rtl.de/index/proxy|x-auth-token='+token+"&"+headerfelder+"&Content-Type=|R{SSM}|"
  919. listitem.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
  920. listitem.setProperty('inputstream.adaptive.license_key', licstring)
  921. return listitem
  922.  
  923. def playchannel(channel):
  924. ret,token=login()
  925. freeonly=addon.getSetting("freeonly")
  926. if freeonly=="true":
  927. dialog = xbmcgui.Dialog()
  928. dialog.notification("Fuer Plus", 'Nur fuer Plusmitglieder', xbmcgui.NOTIFICATION_ERROR)
  929. return
  930. url="https://api.tvnow.de/v3/epgs/movies/nownext?fields=*,nowNextEpgTeasers.*,nowNextEpgMovies.*"
  931. content = getUrl(url)
  932. objekte = json.loads(content, object_pairs_hook=OrderedDict)
  933. for element in objekte["items"]:
  934. if element["name"]==channel:
  935. playlist = xbmc.PlayList(1)
  936. playlist.clear()
  937. dash_file=element["nowNextEpgMovies"]["items"][0]["manifest"]["dash"]
  938. image=element["nowNextEpgMovies"]["items"][0]["image"]
  939. item = playchannel_dash(dash_file,channel,image)
  940. #xbmcgui.Dialog().ok("11",dash_file,"gefunden","gefunden")
  941. playlist.add(dash_file, item)
  942. xbmc.Player().play(playlist)
  943.  
  944. def livetv():
  945. ret,token=login()
  946. freeonly=addon.getSetting("freeonly")
  947. if freeonly=="true":
  948. dialog = xbmcgui.Dialog()
  949. dialog.notification("Fuer Plus", 'Nur fuer Plusmitglieder', xbmcgui.NOTIFICATION_ERROR)
  950. return
  951. url="https://api.tvnow.de/v3/epgs/movies/nownext?fields=*,nowNextEpgTeasers.*,nowNextEpgMovies.*"
  952. content = getUrl(url)
  953. objekte = json.loads(content, object_pairs_hook=OrderedDict)
  954. for element in objekte["items"]:
  955. titel = element["name"]
  956. listitem = xbmcgui.ListItem(label=titel)
  957. url = base_url+"?mode=playchannel&channel="+titel
  958. is_folder = True
  959. xbmcplugin.addDirectoryItem(addon_handle, url, listitem, is_folder)
  960. """
  961. try:
  962. name = element["name"]
  963. url = element["nowNextEpgMovies"]["items"][0]["manifest"]["dash"]
  964. image=element["nowNextEpgMovies"]["items"][0]["image"]
  965. except:
  966. continue
  967. referer="https://www.tvnow.de/"+name+"/live-tv"
  968. headerfelder="user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36&Referer="+referer
  969. listitem = xbmcgui.ListItem(path=url+"||"+headerfelder,label=name,iconImage=image,thumbnailImage=image)
  970. listitem.setProperty('IsPlayable', 'true')
  971. listitem.setInfo(type="Video", infoLabels={"Title": name })
  972. listitem.setProperty('inputstreamaddon', 'inputstream.adaptive')
  973. listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd')
  974. licstring='https://widevine.rtl.de/index/proxy|x-auth-token='+token+"&"+headerfelder+"&Content-Type=|R{SSM}|"
  975. listitem.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
  976. listitem.setProperty('inputstream.adaptive.license_key', licstring)
  977. debug("LICENSE: " + licstring)
  978. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=url+"||"+headerfelder, listitem=listitem)
  979. xbmcplugin.setResolvedUrl(addon_handle,True, listitem)
  980. """
  981. xbmcplugin.endOfDirectory(addon_handle)
  982.  
  983. def searchit():
  984. dialog = xbmcgui.Dialog()
  985. d = dialog.input(translation(30010), type=xbmcgui.INPUT_ALPHANUM)
  986. d=d.lower()
  987. url="https://api.tvnow.de/v3/formats?fields=id,title,metaTags,seoUrl,defaultDvdImage,defaultDvdCoverImage&maxPerPage=5000"
  988. content = cache.cacheFunction(getUrl,url)
  989. objekte = json.loads(content, object_pairs_hook=OrderedDict)
  990. menu=[]
  991. for objekt in objekte["items"]:
  992. try:
  993. listestring=objekt["metaTags"].encode("utf-8").lower()
  994. except:
  995. listestring=objekt["title"].encode("utf-8").lower()
  996. d=d.replace(",","").replace(" ","")
  997. listestring=listestring.replace(",","").replace(" ","")
  998. if d in listestring:
  999. title=objekt["title"].encode("utf-8")
  1000. idd=objekt["id"]
  1001. logo=objekt["defaultDvdImage"]
  1002. found=0
  1003. menu.append(addDir(title , url=str(idd), mode="rubrik", iconimage=logo,duration="",desc="",title=title))
  1004. xbmcplugin.addDirectoryItems(addon_handle,menu)
  1005. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  1006. #OPTIONS https://api.tvnow.de/v3/formats/genre/Crime?fields=*&filter=%7B%22station%22:%22none%22%7D&maxPerPage=50&order=NameLong+asc&page=1
  1007. def favadd(url,titel,bild):
  1008. debug(" favadd url :"+url)
  1009. textfile=url+"###"+titel+"###"+bild+"\n"
  1010. try:
  1011. f=open(favdatei,'r')
  1012. for line in f:
  1013. textfile=textfile+line
  1014. f.close()
  1015. except:
  1016. pass
  1017. f=open(favdatei,'w')
  1018. f.write(textfile)
  1019. f.close()
  1020. xbmc.executebuiltin('Notification("Hinzugefügt","Hinzugefügt")')
  1021. xbmc.executebuiltin("Container.Refresh")
  1022.  
  1023.  
  1024. def favdel(url):
  1025. debug(" FAVDEL url :"+url)
  1026. textfile=""
  1027. f=open(favdatei,'r')
  1028. for line in f:
  1029. if not url in line and not line=="\n":
  1030. textfile=textfile+line
  1031. f.close()
  1032. f=open(favdatei,'w')
  1033. f.write(textfile)
  1034. f.close()
  1035. xbmc.executebuiltin('Notification("Gelöscht","Gelöscht")')
  1036. xbmc.executebuiltin("Container.Refresh")
  1037.  
  1038. def tolibrary(url,name,stunden):
  1039. mediapath=addon.getSetting("mediapath")
  1040. if mediapath=="":
  1041. dialog = xbmcgui.Dialog()
  1042. dialog.notification("Error", "Pfad setzen in den Settings", xbmcgui.NOTIFICATION_ERROR)
  1043. return
  1044. urlx=urllib.quote_plus(url)
  1045. urln="plugin://plugin.video.rtlnow?mode=generatefiles&url="+urlx+"&name="+name
  1046. urln=urllib.quote_plus(urln)
  1047. debug("tolibrary urln : "+urln)
  1048. xbmc.executebuiltin('XBMC.RunPlugin(plugin://service.L0RE.cron/?mode=adddata&name=%s&stunden=%s&url=%s)'%(name,stunden,urln))
  1049. #xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  1050.  
  1051. def listfav() :
  1052. menu=[]
  1053. if xbmcvfs.exists(favdatei):
  1054. f=open(favdatei,'r')
  1055. for line in f:
  1056. debug(line)
  1057. spl=line.split('###')
  1058. menu.append(addDir(name=spl[1], url=spl[0], mode="rubrik", iconimage=spl[2].strip(), desc="",title=spl[1],bild=spl[2].strip()))
  1059. f.close()
  1060. xbmcplugin.addDirectoryItems(addon_handle,menu)
  1061. xbmcplugin.endOfDirectory(addon_handle,succeeded=True,updateListing=False,cacheToDisc=True)
  1062. # Haupt Menu Anzeigen
  1063. if mode is '':
  1064. index()
  1065. else:
  1066. if mode == 'listgenre':
  1067. urln="https://api.tvnow.de/v3/channels/"+nummer+"?fields=[%22id%22,%22movies%22,[%22broadcastStartDate%22,%22articleShort%22,%22articleLong%22,%22id%22,%22episode%22,%22season%22,%22title%22,%22articleShort%22,%22isDrm%22,%22free%22,%22teaserText%22,%22deeplinkUrl%22,%22duration%22,%22manifest%22,[%22dash%22,%22dashclear%22],%22format%22,[%22categoryId%22]]]"
  1068. staffel("0",urln)
  1069. if mode == 'serien':
  1070. starturl='http://api.tvnow.de/v3/formats?filter='
  1071. filter=urllib.quote_plus('{"Disabled": "0", "Station":"' + url +'"}')
  1072. urln=starturl+filter+'&fields=title,id,seoUrl,defaultLogo,infoTextLong,hasFreeEpisodes,categoryId&maxPerPage=500'
  1073. serien(urln)
  1074. if mode == 'lsserie':
  1075. serien(url)
  1076. if mode == 'rubrik':
  1077. rubrik(url,title,bild)
  1078. if mode == 'last':
  1079. staffel("0",url)
  1080. if mode == 'staffel':
  1081. #url="http://api.tvnow.de/v3/formatlists/"+nummer+"?maxPerPage=500&fields=[%22formatTabPages%22,[%22container%22,[%22movies%22,[%22free%22,%22isDrm%22,%22title%22,%22id%22,%22deeplinkUrl%22,%22manifest%22,[%22dashclear%22,%22dash%22],%22duration%22,%22season%22,%22episode%22,%22articleLong%22,%22articleShort%22,%22broadcastStartDate%22,%22teaserText%22,%22format%22,[%22categoryId%22]]]]]"
  1082. staffel(nummer,url)
  1083. if mode == 'playvideo':
  1084. playvideo(url)
  1085. if mode == 'clearcache':
  1086. clearcache()
  1087. if mode == 'sendermenu':
  1088. sendermenu()
  1089. if mode == 'genre':
  1090. genre(url)
  1091. if mode == 'katalogliste':
  1092. katalogliste(url)
  1093. if mode == 'katalog':
  1094. katalog()
  1095. if mode == 'hashplay':
  1096. hashplay(nummer)
  1097. if mode == 'genreliste':
  1098. genreliste()
  1099. if mode == 'Settings':
  1100. addon.openSettings()
  1101. if mode == 'inputsettings':
  1102. inputsettings()
  1103. if mode == 'livetv':
  1104. #xbmcgui.Dialog().ok("l1","l2","l3","l4")
  1105. livetv()
  1106. if mode == 'playdash':
  1107. playdash(xstream,xlink,xdrm)
  1108. if mode == 'playchannel':
  1109. playchannel(channel)
  1110. if mode == 'searchit':
  1111. searchit()
  1112. if mode == 'favadd':
  1113. favadd(url,title,bild)
  1114. if mode == 'favdel':
  1115. favdel(url)
  1116. if mode == 'listfav':
  1117. listfav()
  1118. if mode == 'tolibrary':
  1119. tolibrary(url,name,stunden)
  1120. if mode == 'generatefiles':
  1121. generatefiles(url)
  1122. if mode == 'playfolge':
  1123. playfolge(url,nummer)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement