def ARDStartVideoMP4(title, path, summ, tagline, img, geoblock, sub_path='', Merk='false'): PLog('ARDStartVideoMP4:'); title_org=title; summary_org=summ; thumb=img; tagline_org=tagline # Backup geoblock = UtfToStr(geoblock) li = xbmcgui.ListItem() li = home(li, ID='ARD Neu') # Home-Button page, msg = get_page(path) if page == '': msg1 = "Fehler in ARDStartVideoMP4: %s" % title msg2 = msg xbmcgui.Dialog().ok(ADDON_NAME, msg1, msg2, '') return li PLog(len(page)) Plugins = blockextract('_plugin', page) # wir verwenden nur Plugin1 (s.o.) Plugin1 = Plugins[0] VideoUrls = blockextract('_quality', Plugin1) PLog(len(VideoUrls)) # Format Downloadliste "Qualität: niedrige | Titel#https://pdvideosdaserste.." download_list = ARDStartVideoMP4get(title,VideoUrls) # holt Downloadliste mit mp4-videos PLog(len(download_list)) PLog(download_list[:1]) # 1. Element title = UtfToStr(title); title_org = UtfToStr(title_org); summary_org= UtfToStr(summary_org) tagline= UtfToStr(tagline); img = UtfToStr(img) title=repl_json_chars(title); title_org=repl_json_chars(title_org); summary_org=repl_json_chars(summary_org); tagline=repl_json_chars(tagline); # Sofortstart mit letzter=höchster Qualität Plot = "%s||||%s" % (tagline, summary_org) # || Code für LF (\n scheitert in router) if SETTINGS.getSetting('pref_video_direct') == 'true': # Sofortstart if SETTINGS.getSetting('pref_show_resolution') == 'false': PLog('Sofortstart: ARDStartVideoMP4') video = download_list[-1] # letztes Element = höchste Qualität meta, href = video.split('#') PLog(meta); PLog(href); quality = meta.split('|')[0] # "Qualität: sehr hohe | Titel.." PLog(quality); PlayVideo(url=href, title=title, thumb=img, Plot=Plot, sub_path=sub_path, Merk=Merk) return for video in download_list: PLog(video); meta, href = video.split('#') quality = meta.split('|')[0] lable = quality + geoblock; lable = UtfToStr(lable) PLog(href); PLog(quality); PLog(tagline); PLog(summary_org); Plot = "%s||||%s" % (tagline, summary_org) # || Code für LF (\n scheitert in router) sub_path=''# fehlt noch bei ARD fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s', 'sub_path': '%s'}" %\ (urllib.quote_plus(href), urllib.quote_plus(title_org), urllib.quote_plus(img), urllib.quote_plus(Plot), urllib.quote_plus(sub_path)) addDir(li=li, label=lable, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, mediatype='video', tagline=tagline, summary=summary_org) if download_list: title = " | %s" PLog(title);PLog(summary_org);PLog(tagline);PLog(thumb); li = ardundzdf.test_downloads(li,download_list,title_org,summary_org,tagline,thumb,high=-1) # Downloadbutton(s) xbmcplugin.endOfDirectory(HANDLE)
def ShowVideo(title, img, descr, entityId, Merk='false'): PLog('ShowVideo:') PLog(title) PLog(entityId) path = "https://www.funk.net/api/v4.0/videos/%s" % entityId page = loadPage(path) if page.startswith('Fehler'): msg1 = 'Verbindungsproblem' msg2 = page MyDialog(msg1, msg2, '') xbmcplugin.endOfDirectory(HANDLE) jsonObject = json.loads(page) store_id = 'video_%s' % entityId # Dict('store',store_id , jsonObject) # Debug: # RSave("/tmp/x_%s.json" % store_id, json.dumps(jsonObject, sort_keys=True, indent=2, separators=(',', ': '))) # jsonObject = Dict('load',store_id) li = xbmcgui.ListItem() li = home(li, ID=MNAME) # Home-Button # 1. Session-Objekt path = "https://api.nexx.cloud/v3/741/session/init" # init-Session data = 'nxp_devh=4"%"3A1500496747"%"3A178989' # Post request page = loadPage(path, data=data) PLog(page[:80]) if page.startswith('Fehler'): msg1 = 'Verbindungsproblem' msg2 = page MyDialog(msg1, msg2, '') xbmcplugin.endOfDirectory(HANDLE) jsonObject = json.loads(page) x_cid = jsonObject["result"]["general"]["cid"] geo = jsonObject["result"]["general"]["geocode"] # x-request-token nicht im jsonObject PLog("cid: " + x_cid) PLog("geo: " + geo) geoblock = '' if geo: geoblock = " | Geoblock: %s" % geo # 2. Video-Metadaten x_cid = "x-request-cid,%s" % x_cid # x-request-cid x_token = "x-request-token,f058a27469d8b709c3b9db648cae47c2" # x-request-token data = 'addStatusDetails=1&addStreamDetails=1&addFeatures=1&addCaptions=1&addBumpers=1&captionFormat=data' path = "https://api.nexx.cloud/v3/741/videos/byid/%s" % entityId page = loadPage(path, x_cid=x_cid, x_token=x_token, data=data) PLog(page[:80]) jsonObject = json.loads(page) # RSave("/tmp/x_videometa_protec.json", json.dumps(jsonObject, sort_keys=True, indent=2, separators=(',', ': '))) protected = False tokenHLS = '' tokenDASH = '' # 3. Stream-Url server = jsonObject["result"]["streamdata"]["cdnShieldProgHTTPS"] if server == '': # i.d.R. funk-01dd.akamaized.net # # protected: nx-t09.akamaized.net # token-Lösung von realvito (kodinerds, s. Post vom 20.10.2019) server = jsonObject["result"]["streamdata"][ "cdnShieldHTTPS"] # endet mit / tokenHLS = jsonObject["result"]["protectiondata"]["tokenHLS"] tokenDASH = jsonObject["result"]["protectiondata"]["tokenDASH"] protected = True PLog("server: " + server) PLog("tokenHLS: " + tokenHLS) PLog("tokenDASH: " + tokenDASH) locator = jsonObject["result"]["streamdata"]["azureLocator"] distrib = jsonObject["result"]["streamdata"]["azureFileDistribution"] if protected: stream_url = "https://%s%s/%s_src.ism/Manifest(format=mpd-time-cmaf)?hdnts=%s" % ( server, locator, entityId, tokenHLS) # Header Referer von Kodi nicht verwendet/erkannt - weiterhin Player-Error (s.o.) #h1='cors' #h2='https://www.funk.net/channel/doctor-who-1164/boeser-wolf-133317/doctor-who-staffel-1-1290' #stream_url = "%s|Sec-Fetch-Mode=%s&Referer=%s" % (stream_url, urllib2.quote(h1), urllib2.quote(h2)) else: stream_url = "https://%s%s/%s_src.ism/Manifest(format=mpd-time-cmaf)" % ( server, locator, entityId) PLog("stream_url: " + stream_url) # Video-Details title = jsonObject["result"]["general"]["title"] stitle = jsonObject["result"]["general"]["subtitle"] dur = jsonObject["result"]["general"]["runtime"] width = jsonObject["result"]["features"]["width"] # Details für stream_url height = jsonObject["result"]["features"]["height"] fps = jsonObject["result"]["features"]["fps"] aspect = jsonObject["result"]["features"]["aspectRatio"] orientation = jsonObject["result"]["features"]["orientation"] forms = get_forms(distrib) # Details für mp4_url's mp4_urls = [] for form in forms: # leerer hdnts-Zusatz bei nicht geschützten Videos stört nicht. # https://funk-01.akamaized.net/59536be8-46cc-4d1e-83b7-d7bab4b3eb5d/1633982_src_1920x1080_6000.mp4 mp4_urls.append("https://%s%s/%s_src_%s.mp4?hdnts=%s" % (server, locator, entityId, form, tokenDASH)) PLog("mp4_urls: " + str(mp4_urls)) title = repl_json_chars(title) title_org = title if SETTINGS.getSetting( 'pref_video_direct') == 'true': # Sofortstart MP4 (s.o.) PLog('Sofortstart: funk (ShowVideo)') prev_bandw = SETTINGS.getSetting('pref_funk_bandw') prev_bandw = prev_bandw.split(':')[0] # 400:320x180 myform = get_forms(distrib, prev_bandw) # passende form-Bandweite suchen if len(myform) == 0: # Sicherung: kleinste mp4_url = mp4_urls[0] else: # tokenDASH leer falls Server funk-01.akamaized mp4_url = "https://%s%s/%s_src_%s.mp4?hdnts=%s" % ( server, locator, entityId, myform, tokenDASH) tag_add = '' if protected: tag_add = "geschützt" tag = "MP4 %s | %s" % (tag_add, re.search( "_src_(.*?).mp4", mp4_url).group(1)) # 1920x1080_6000 tag = tag + geoblock descr_par = "%s||||%s" % (tag, descr) PlayVideo(url=mp4_url, title=title_org, thumb=img, Plot=descr_par, Merk=Merk) return descr_par = descr descr = descr_par.replace('||', '\n') if protected == False: # nicht funktionierenden Stream ausblenden title = "STREAM | %s" % title_org tag = "STREAM %s x %s | fps %s | %s | %s" % (width, height, fps, aspect, orientation) tag = tag + geoblock title = py2_encode(title) stream_url = py2_encode(stream_url) img = py2_encode(img) descr_par = py2_encode(descr_par) fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s', 'Merk': '%s'}" % \ (quote(stream_url), quote(title), quote_plus(img), quote_plus(descr_par), Merk) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, tagline=tag, summary=descr, mediatype='video') download_list = [] # 2-teilige Liste für Download: 'Titel # url' title = "MP4 | %s" % title_org # einzelne MP4-Url for mp4_url in mp4_urls: tag = "MP4 | %s" % re.search("_src_(.*?).mp4", mp4_url).group( 1) # 1920x1080_6000 tag = tag + geoblock title = py2_encode(title) mp4_url = py2_encode(mp4_url) img = py2_encode(img) descr_par = py2_encode(descr_par) PLog("mp4_url: " + mp4_url) # hier tag (mit Auflösungen) statt title download_list.append(tag + '#' + mp4_url) # Download-Liste füllen fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s', 'Merk': '%s'}" % \ (quote(mp4_url), quote(title), quote_plus(img), quote_plus(descr_par), Merk) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, tagline=tag, summary=descr, mediatype='video') if download_list: # Downloadbutton(s), high=0: 1. Video = höchste Qualität # Qualitäts-Index high: hier Basis Bitrate (s.o.) summary_org = repl_json_chars(descr) tagline_org = repl_json_chars(tag) thumb = img # PLog(summary_org);PLog(tagline_org);PLog(thumb); li = ardundzdf.test_downloads(li, download_list, title_org, summary_org, tagline_org, thumb, high=0) xbmcplugin.endOfDirectory(HANDLE)
def get_formitaeten(content_id,title,tagline,thumb): PLog('get_formitaeten') PLog('content_id: ' + content_id) if content_id == '': # sollte nicht vorkommen msg1 = '%s | content_id fehlt' % title MyDialog(msg1, '', '') return li li = xbmcgui.ListItem() li = home(li, ID='phoenix') # Home-Button url = 'https://www.phoenix.de/php/mediaplayer/data/beitrags_details.php?ak=web&ptmd=true&id=' + content_id page, msg = get_page(path=url) if page == '': msg1 = 'Fehler in get_formitaeten: %s' % title msg2 = msg MyDialog(msg1, msg2, '') return li PLog(len(page)) basename = stringextract('assetid":"', '"', page) # Bsp. "assetid":"210416_phx_doku_awri_5" #if basename == '': # continue url = 'https://tmd.phoenix.de/tmd/2/ngplayer_2_3/vod/ptmd/phoenix/' + basename page, msg = get_page(path=url) if page == '': msg1 = 'Fehler in get_formitaeten: %s' % title msg2 = msg MyDialog(msg1, msg2, '') return li PLog(len(page)) formitaeten = blockextract('"formitaeten"', page) # Video-URL's ermitteln - wie ZDF-Mediathek # PLog(formitaeten) geoblock = stringextract('geoLocation', '}', page) geoblock = stringextract('"value" : "', '', geoblock).strip() PLog('geoblock: ' + geoblock) # i.d.R. "none", sonst "de" if geoblock == 'de': # Info-Anhang für summary geoblock = ' | Geoblock!' else: geoblock = '' duration = stringextract('duration', '}', page) # PLog('duration: ' + duration) try: # Bsp.: "value" : 4943000 duration = re.search(u'value" : (\d+)', duration).group(1) except: duration = '' if duration: # wie yt_init.millisecs (yt_get) duration = seconds_translate(int(int(duration) / 1000)) PLog('duration: ' + duration) download_list = [] # 2-teilige Liste für Download: 'Titel # url' title_call = title if duration: tagline = "%s | %s\n\nSendung: %s" % (duration, tagline, title_call) else: tagline = "%s\n\nSendung: %s" % (tagline, title_call) Plot_par = tagline.replace('\n', '||') for rec in formitaeten: # Datensätze gesamt # PLog(rec) # bei Bedarf typ = stringextract('"type" : "', '"', rec) facets = stringextract('"facets" : ', ',', rec) # Bsp.: "facets": ["progressive"] facets = facets.replace('"', '').replace('\n', '').replace(' ', '') if facets == '[]': facets = '' PLog('typ: ' + typ); PLog('facets: ' + facets) if typ == "h264_aac_f4f_http_f4m_http": # manifest.fm auslassen continue audio = blockextract('"audio" :', rec) # Datensätze je Typ PLog(len(audio)) # PLog(audio) # bei Bedarf for audiorec in audio: url = stringextract('"uri" : "', '"', audiorec) # URL quality = stringextract('"quality" : "', '"', audiorec) if quality == 'high': # high bisher identisch mit auto continue PLog(url); PLog(quality); PLog(tagline); if url: if url.endswith('master.m3u8'): if SETTINGS.getSetting('pref_video_direct') == 'true': # or Merk == 'true': # Sofortstart PLog('Sofortstart: phoenix get_formitaeten') li.setProperty('IsPlayable', 'false') # verhindert wiederh. Starten nach Stop PlayVideo(url=url, title=title_call, thumb=thumb, Plot=Plot_par) return title = u'Qualität: ' + quality + ' | Typ: ' + typ + ' ' + facets if 'mp4' in typ: download_list.append(title + '#' + url) # Download-Liste füllen title_call=py2_encode(title_call) title=py2_encode(title); url=py2_encode(url); thumb=py2_encode(thumb); Plot_par=py2_encode(Plot_par); fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" %\ (quote_plus(url), quote_plus(title_call), quote_plus(thumb), quote_plus(Plot_par)) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=thumb, thumb=thumb, fparams=fparams, mediatype='video', tagline=tagline) if download_list: # Downloadbutton(s), high=0: 1. Video = höchste Qualität # Qualitäts-Index high: hier Basis Bitrate (s.o.) title_org = title_call summary_org = '' tagline_org = repl_json_chars(tagline) # PLog(summary_org);PLog(tagline_org);PLog(thumb); li = ardundzdf.test_downloads(li,download_list,title_org,summary_org,tagline_org,thumb,high=0) xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)
def SingleBeitrag(title, path, img_src, summ, dauer, duration, Merk='false'): PLog('Funktion SingleBeitrag: ' + title) PLog(dauer);PLog(duration); PLog(path) Plot = title Plot_par = summ # -> PlayVideo if Plot_par == '': Plot_par = title tag_org = dauer thumb = img_src; title_org = title li = xbmcgui.ListItem() li = home(li, ID='3Sat') # Home-Button page, msg = get_page(path=path) # 1. Basisdaten von Webpage holen if page == '': msg1 = "Fehler in SingleBeitrag" msg2 = msg PLog(msg1) xbmcgui.Dialog().ok(ADDON_NAME, msg1, msg2, '') return li content = stringextract('window.zdfsite', 'tracking', page) content = stringextract('data-module="zdfplayer"', 'teaser-image=', page) appId = stringextract('zdfplayer-id="', '"', content) apiToken= stringextract('apiToken": "', '"', content) profile_url= stringextract('content": "', '"', content) # profile_url PLog(appId); PLog(profile_url); PLog("apiToken: " + apiToken); if apiToken == '': if '<time datetime="' in page: termin = stringextract('<time datetime="', '"', page) msg1 = "(noch) kein Video, Sendetermin: %s" % termin else: msg1 = "keine Videoquelle gefunden. Seite:\n%s" % path PLog(msg1) PLog(apiToken) # zur Kontrolle xbmcgui.Dialog().ok(ADDON_NAME, msg1, '', '') return li headers = "{'Api-Auth': 'Bearer %s','Host': 'api.zdf.de'}" % apiToken try: page = get_page3sat(path=profile_url, apiToken=apiToken) # 2. Playerdaten mit neuer Video-ID except Exception as exception: PLog(str(exception)) page = "" page = page.replace('\\', '') PLog(page[:100]) try: videodat = blockextract('ptmd-template":"',page) # mehrfach möglich videodat = videodat[-1] # letzte ist relevant videodat_url= stringextract('ptmd-template":"', '"', videodat) video_ID = videodat_url.split('/')[-1] # ID z.B. 190521_sendung_nano videodat_url = 'https://api.3sat.de/tmd/2/ngplayer_2_3/vod/ptmd/3sat/' + video_ID PLog("videodat_url: " + videodat_url) page = get_page3sat(path=videodat_url, apiToken=apiToken) except Exception as exception: PLog(str(exception)) page = "" if page == '': # Alternative mediathek statt 3sat videodat_url = 'https://api.3sat.de/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/' + video_ID try: page = get_page3sat(path=videodat_url, apiToken=apiToken) except Exception as exception: PLog(str(exception)) page = "" if 'formitaeten' not in page: msg1 = "keine Videoquelle gefunden. Seite:\n%s" % path PLog(msg1) PLog(videodat_url) # zur Kontrolle xbmcgui.Dialog().ok(ADDON_NAME, msg1, '', '') return li if page: formitaeten = blockextract('formitaeten', page) # 4. einzelne Video-URL's ermitteln download_list = [] tagline = "%s | %s " % (title, dauer) thumb=img_src for rec in formitaeten: # Datensätze gesamt # PLog(rec) # bei Bedarf typ = stringextract('\"type\" : \"', '\"', rec) facets = stringextract('\"facets\" : ', ',', rec) # Bsp.: "facets": ["progressive"] facets = facets.replace('\"', '').replace('\n', '').replace(' ', '') PLog('typ: ' + typ); PLog('facets: ' + facets) if typ == "h264_aac_f4f_http_f4m_http": # manifest.f4m auslassen continue audio = blockextract('\"audio\" :', rec) # Datensätze je Typ # PLog(audio) # bei Bedarf for audiorec in audio: url = stringextract('\"uri\" : \"', '\"', audiorec) # URL url = url.replace('https', 'http') # im Plugin kein Zugang mit https! quality = stringextract('\"quality\" : \"', '\"', audiorec) if quality == 'high': # high bisher identisch mit auto continue PLog(url); PLog(quality); quality = UtfToStr(quality) PLog('Mark0') if url: if url.find('master.m3u8') > 0: # m3u8 enthält alle Auflösungen title = '%s [m3u8]' % (quality) title = UtfToStr(title) # Sofortstart - direkt, falls Listing nicht Playable if SETTINGS.getSetting('pref_video_direct') == 'true' or Merk == 'true': if SETTINGS.getSetting('pref_show_resolution') == 'false' or Merk == 'true': PLog('Sofortstart: SingleBeitrag') PLog(xbmc.getInfoLabel('ListItem.Property(IsPlayable)')) # sub_path='' # fehlt bei ARD - entf. ab 1.4.2019 PlayVideo(url=url, title=title_org, thumb=thumb, Plot=Plot_par, sub_path='') return # "auto"-Button + Ablage master.m3u8: # Da 3Sat 2 versch. m3u8-Qualitäten zeigt,verzichten wir (wie bei ZDF_getVideoSources) # auf Einzelauflösungen via Parseplaylist # li = ardundzdf.ParseMasterM3u(li=li, url_m3u8=url, thumb=thumb, title=title, tagline=tagline, descr=tagline) else: # m3u8 enthält Auflösungen high + med title = 'Qualitaet: ' + quality + ' | Typ: ' + typ + ' ' + facets title = 'Qualitaet: %s | Typ: %s %s' % (quality, typ, facets) title = UtfToStr(title) download_list.append(title + '#' + url) # Download-Liste füllen tagline = tagline.replace('||','\n') # s. tagline in ZDF_get_content Plot_par=UtfToStr(Plot_par) fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s', 'sub_path': '', 'Merk': ''}" %\ (urllib.quote_plus(url), urllib.quote_plus(title), urllib.quote_plus(thumb), urllib.quote_plus(Plot_par)) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=thumb, thumb=thumb, fparams=fparams, mediatype='video', tagline=tagline) if SETTINGS.getSetting('pref_use_downloads'): # high=0: 1. Video bisher höchste Qualität: [progressive] veryhigh tagline=tag_org li = ardundzdf.test_downloads(li,download_list,title_org,Plot_par,tagline,thumb,high=0) # Downloadbutton(s) xbmcplugin.endOfDirectory(HANDLE)
def ShowVideo(title, img, descr, entityId, Merk='false'): PLog('ShowVideo:') PLog(title) PLog(entityId) path = "https://www.funk.net/api/v4.0/videos/%s" % entityId page = loadPage(path) if page.startswith('Fehler'): msg1 = 'Verbindungsproblem' msg2 = page MyDialog(msg1, msg2, '') xbmcplugin.endOfDirectory(HANDLE) jsonObject = json.loads(page) store_id = 'video_%s' % entityId # Dict('store',store_id , jsonObject) # Debug: # RSave("/tmp/x_%s.json" % store_id, json.dumps(jsonObject, sort_keys=True, indent=2, separators=(',', ': '))) # jsonObject = Dict('load',store_id) li = xbmcgui.ListItem() li = home(li, ID=MNAME) # Home-Button # 1. Session-Objekt path = "https://api.nexx.cloud/v3/741/session/init" # init-Session data = 'nxp_devh=4"%"3A1500496747"%"3A178989' # Post request page = loadPage(path, data=data) PLog(page[:80]) if page.startswith('Fehler'): msg1 = 'Verbindungsproblem' msg2 = page MyDialog(msg1, msg2, '') xbmcplugin.endOfDirectory(HANDLE) jsonObject = json.loads(page) x_cid = jsonObject["result"]["general"]["cid"] geo = jsonObject["result"]["general"]["geocode"] # x-request-token nicht im jsonObject PLog("cid: " + x_cid) PLog("geo: " + geo) geoblock = '' if geo: geoblock = " | Geoblock: %s" % geo # 2. Video-Metadaten x_cid = "x-request-cid, %s" % x_cid # x-request-cid #x_token = "x-request-token,f058a27469d8b709c3b9db648cae47c2" # x-request-token x_token = "x-request-token, 137782e774d7cadc93dcbffbbde0ce9c" # 26.01.2021 neu data = 'addStatusDetails=1&addStreamDetails=1&addFeatures=1&addCaptions=1&addBumpers=1&captionFormat=data' path = "https://api.nexx.cloud/v3/741/videos/byid/%s" % entityId page = loadPage(path, x_cid=x_cid, x_token=x_token, data=data) PLog(page[:80]) jsonObject = json.loads(page) #RSave("/tmp/x.json", json.dumps(jsonObject, sort_keys=True, indent=2, separators=(',', ': '))) azure = jsonObject["result"]['streamdata'][ 'applyAzureStructure'] # Test (s. 00_Codebeispiele) azure = str(azure) PLog("azure: " + azure) # 0 oder 1, verschiedene Url-Struktur MP4, # steuert Format MP4-Url (s.u.) streamdata = jsonObject["result"]["streamdata"] protected = False tokenHLS = '' tokenDASH = '' # 3. Stream-Url mp4_server = '' stream_server = '' #if server == '': # i.d.R. funk-01dd.akamaized.net # # protected: nx-t09.akamaized.net # protected = True # token-Lösung von realvito (kodinerds, s. Post vom 20.10.2019), ungültig ab 26.01.2021 if "cdnShieldProgHTTPS" in streamdata: mp4_server = streamdata["cdnShieldProgHTTPS"] if "cdnShieldHTTPS" in streamdata: stream_server = streamdata["cdnShieldHTTPS"] # endet mit / if "tokenHLS" in streamdata: tokenHLS = streamdata["tokenHLS"] if "tokenDASH" in streamdata: tokenDASH = streamdata["tokenDASH"] PLog("mp4_server: %s, stream_server: %s" % (mp4_server, stream_server)) PLog("tokenHLS: " + tokenHLS) PLog("tokenDASH: " + tokenDASH) locator = '' qAccount = '' qPrefix = '' qHash = '' if "azureLocator" in streamdata: # 26.01.2021 fehlt wenn azure=0 locator = streamdata["azureLocator"] else: if "qLocator" in streamdata: locator = streamdata["qLocator"] # bei beiden Varianten if "qAccount" in streamdata: qAccount = streamdata["qAccount"] if "qPrefix" in streamdata: qPrefix = streamdata["qPrefix"] if "qHash" in streamdata: qHash = streamdata["qHash"] distrib = jsonObject["result"]["streamdata"][ "azureFileDistribution"] # Liste der Auflösungen PLog("locator: %s, qAccount: %s, qPrefix: %s" % (locator, qAccount, qPrefix)) #if protected: # stream_url = "https://%s%s/%s_src.ism/Manifest(format=mpd-time-cmaf)?hdnts=%s" % (server,locator,entityId, tokenHLS) # # Header Referer von Kodi nicht verwendet/erkannt - weiterhin Player-Error (s.o.) # #h1='cors' # #h2='https://www.funk.net/channel/doctor-who-1164/boeser-wolf-133317/doctor-who-staffel-1-1290' # #stream_url = "%s|Sec-Fetch-Mode=%s&Referer=%s" % (stream_url, urllib2.quote(h1), urllib2.quote(h2)) #else: if azure == '1': stream_url = "https://%s%s/%s_src.ism/Manifest(format=mpd-time-cmaf)" % ( stream_server, locator, entityId) else: # neu ab 26.01.2021 - entspr. dem HLS-Format bei ZDF-funk-Beiträgen # Format: server/qAccount/files/qPrefix/locator/qAccount-qHash.ism/manifest.m3u8 stream_url = "https://%s%s/files/%s/%s/%s-%s.ism/manifest.m3u8" %\ (stream_server,qAccount,qPrefix,locator,qAccount,qHash) PLog("stream_url: " + stream_url) # Video-Details title = jsonObject["result"]["general"]["title"] stitle = jsonObject["result"]["general"]["subtitle"] dur = jsonObject["result"]["general"]["runtime"] width = jsonObject["result"]["features"]["width"] # Details für stream_url height = jsonObject["result"]["features"]["height"] fps = jsonObject["result"]["features"]["fps"] aspect = jsonObject["result"]["features"]["aspectRatio"] orientation = jsonObject["result"]["features"]["orientation"] forms = get_forms(distrib) # Details für mp4_url's mp4_urls = [] for form in forms: # Format: server/locator/entityId/form/qLocator/form.mp4?hdnts=%s # leerer hdnts-Zusatz bei nicht geschützten Videos stört nicht. # https://funk-01.akamaized.net/59536be8-46cc-4d1e-83b7-d7bab4b3eb5d/1633982_src_1920x1080_6000.mp4 if azure == '1': # mp4_urls.append("https://%s%s/%s_src_%s.mp4?hdnts=%s" % (mp4_server, locator, entityId, form, tokenDASH)) else: # neu ab 26.01.2021 - entspr. dem MP4-Format bei ZDF-funk-Beiträgen # Format: server/qAccount/files/qPrefix/qLocator/forms.split(':')[-1].mp4?fv=1 # form = form.split('_')[-1] # 0460_426x240_5-nM7LBFrZD4JdCqWm8czk mp4_urls.append("https://%s%s/files/%s/%s/%s.mp4?fv=1" % (mp4_server, qAccount, qPrefix, locator, form)) PLog("mp4_urls: " + str(mp4_urls)) if len(mp4_urls) == 0: # Prüfung hls kann entfallen (beide oder keine) msg1 = 'keine Videoquellen gefunden' msg2 = 'Bitte Kontakt zum Addon-Entwickler aufnehmen' MyDialog(msg1, msg2, '') return title = repl_json_chars(title) title_org = title if SETTINGS.getSetting( 'pref_video_direct') == 'true': # Sofortstart MP4 (s.o.) PLog('Sofortstart: funk (ShowVideo)') prev_bandw = SETTINGS.getSetting('pref_funk_bandw') prev_bandw = prev_bandw.split(':')[0] # 400:320x180 myform = get_forms(distrib, prev_bandw) # passende form-Bandweite suchen if len(myform) == 0: # Sicherung: kleinste mp4_url = mp4_urls[0] else: # tokenDASH leer falls Server funk-01.akamaized if azure == '1': mp4_url = "https://%s%s/%s_src_%s.mp4?hdnts=%s" % ( mp4_server, locator, entityId, myform, tokenDASH) else: myform = myform.split('_')[-1] # s.o. mp4_url = "https://%s%s/files/%s/%s/%s.mp4?fv=1" % ( mp4_server, qAccount, qPrefix, locator, myform) tag_add = '' if protected: tag_add = "geschützt" form = forms[0] PLog(form) if len(form.split('_')) == 2: # azure=1 1920x1080_6000 res, bandw = form.split('_') if len(form.split( '_')) == 3: # azure=0 1920x1080_4148_1-7Rk8TrYftK9FVbXQWZdj res, bandw, stream_id = form.split('_') tag = "MP4 | %s | %sk" % (res, bandw) tag = tag + geoblock PLog(tag) descr_par = "%s||||%s" % (tag, descr) PlayVideo(url=mp4_url, title=title_org, thumb=img, Plot=descr_par, Merk=Merk) return descr_par = descr descr = descr_par.replace('||', '\n') if protected == False: # nicht funktionierenden Stream ausblenden title = "STREAM | %s" % title_org tag = "STREAM %s x %s | fps %s | %s | %s" % (width, height, fps, aspect, orientation) tag = tag + geoblock title = py2_encode(title) stream_url = py2_encode(stream_url) img = py2_encode(img) descr_par = py2_encode(descr_par) fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s', 'Merk': '%s'}" % \ (quote(stream_url), quote(title), quote_plus(img), quote_plus(descr_par), Merk) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, tagline=tag, summary=descr, mediatype='video') download_list = [] # 2-teilige Liste für Download: 'Titel # url' title = "MP4 | %s" % title_org # einzelne MP4-Url i = 0 for mp4_url in mp4_urls: form = forms[i] PLog("form: " + form) i = i + 1 res = '' bandw = '' stream_id = '' if len(form.split('_')) == 2: # azure=1 res, bandw = form.split('_') if len(form.split('_')) == 3: # azure=0 res, bandw, stream_id = form.split('_') PLog(res) tag = "MP4 | %s | %sk" % (res, bandw) tag = tag + geoblock PLog(tag) title = py2_encode(title) mp4_url = py2_encode(mp4_url) img = py2_encode(img) descr_par = py2_encode(descr_par) PLog("mp4_url: " + mp4_url) # hier tag (mit Auflösungen) statt title download_list.append(tag + '#' + mp4_url) # Download-Liste füllen fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s', 'Merk': '%s'}" % \ (quote(mp4_url), quote(title), quote_plus(img), quote_plus(descr_par), Merk) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, tagline=tag, summary=descr, mediatype='video') if download_list: # Downloadbutton(s), high=0: 1. Video = höchste Qualität # Qualitäts-Index high: hier Basis Bitrate (s.o.) summary_org = repl_json_chars(descr) tagline_org = repl_json_chars(tag) thumb = img # PLog(summary_org);PLog(tagline_org);PLog(thumb); li = ardundzdf.test_downloads(li, download_list, title_org, summary_org, tagline_org, thumb, high=0) xbmcplugin.endOfDirectory(HANDLE)
def yt(li, url, vid, title, tag, summ, thumb): PLog('yt_embed_url: ' + url) watch_url = 'https://www.youtube.com/watch?v=' + vid PLog('yt_watch_url: ' + watch_url) PLog(tag) PLog(summ) PLog(thumb) title_org = title yt = YouTube(watch_url) # nur mp4-Videos laden Videos = yt.streams.filter(file_extension='mp4').all() PLog(len(Videos)) PLog(str(Videos)) if SETTINGS.getSetting('pref_video_direct') == 'true': PLog('Sofortstart: yt') # <Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" # vcodec="avc1.64001F" acodec="mp4a.40.2">: stream = yt.streams.get_by_itag(22) res, fps, vcodec, acodec = get_stream_details(str(stream)) yt_url = stream.download(only_url=True) if summ == '': summ = tag summ = "%s\n\n%s" % (summ, 'Youtube-Video: %s | %s | %s | %s' % (res, fps, vcodec, acodec)) PlayVideo(url=yt_url, title=title, thumb=thumb, Plot=summ, sub_path="") return download_list = [] # 2-teilige Liste für Download: 'Titel # url' i = 1 for video in Videos: v = str(video) itag = stringextract('itag="', '"', v) mime_type = stringextract('mime_type="', '"', v) res, fps, vcodec, acodec = get_stream_details(v) PLog(video) PLog('itag: ' + itag) PLog(res) PLog(fps) PLog(vcodec) PLog(acodec) try: # Videolänge kann fehlen duration = yt.length() duration = seconds_translate(sec) except: duration = '' stream = yt.streams.get_by_itag(itag) yt_url = stream.download(only_url=True) PLog('yt_url: ' + yt_url[:100]) if res == '' and fps == '': summ = '%s. Youtube-Video (nur Audio): %s' % (str(i), acodec) else: if acodec: summ = '%s. Youtube-Video: %s | %s | %s | %s' % ( str(i), res, fps, vcodec, acodec) else: summ = '%s. Youtube-Video: %s | %s | %s' % (str(i), res, fps, vcodec) download_list.append(summ + '#' + yt_url) # Download-Liste füllen (Qual.#Url) if duration: tag = u"Dauer %s | %s" % (duration, tag) summ_par = "%s||||%s" % (tag, summ) title = "%s. %s" % (str(i), title_org) PLog(title) PLog(tag) PLog(summ) yt_url = py2_encode(yt_url) title = py2_encode(title) thumb = py2_encode(thumb) summ_par = py2_encode(summ_par) fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" % \ (quote(yt_url), quote(title), quote_plus(thumb), quote_plus(summ_par)) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=thumb, thumb=thumb, fparams=fparams, tagline=tag, summary=summ, mediatype='video') i = i + 1 if download_list: # Downloadbutton(s), high=0: 1. Video = höchste Qualität PLog(len(download_list)) # Qualitäts-Index high: hier Basis Bitrate (s.o.) title_org = title_org summary_org = '' tagline_org = repl_json_chars(tag) # PLog(summary_org);PLog(tagline_org);PLog(thumb); li = ardundzdf.test_downloads(li, download_list, title_org, summary_org, tagline_org, thumb, high=0) # return li # kann yt mehrfach aufrufen (trotz endOfDirectory in SingleBeitrag xbmcplugin.endOfDirectory(HANDLE)
def Kika_SingleBeitrag(path, title, thumb, summ, duration): PLog('Kika_SingleBeitrag: ' + path) title_call = title li = xbmcgui.ListItem() li = home(li, ID='Kinderprogramme') # Home-Button page, msg = get_page(path) if page == '': msg1 = "Fehler in Kika_SingleBeitrag:" msg2 = msg MyDialog(msg1, msg2, '') return li summ1 = stringextract('<broadcastDescription>', '</', page) summ2 = stringextract('<topline>', '</', page) summ = summ1 + ' ' + summ2 Plot_par = summ assets = blockextract('<asset>', page) url_m3u8 = stringextract('<adaptiveHttpStreamingRedirectorUrl>', '</', page) # x-mal identisch sub_path = '' if 'master.m3u8' in url_m3u8: # 04.08.2019 Sofortstart nur noch abhängig von Settings und nicht zusätzlich von # Param. Merk. if SETTINGS.getSetting('pref_video_direct') == 'true': # or Merk == 'true': # Sofortstart PLog('Sofortstart: Kika_SingleBeitrag') PLog("Plot_par: " + Plot_par) PlayVideo(url=url_m3u8, title=title_call, thumb=thumb, Plot=Plot_par, sub_path=sub_path) return title = u'[m3u8] Bandbreite und Auflösung automatisch' # "auto"-Button + Ablage master.m3u8: li = ardundzdf.ParseMasterM3u(li=li, url_m3u8=url_m3u8, thumb=thumb, title=title, tagline='', descr=Plot_par, sub_path='') download_list = [] # 2-teilige Liste für Download: 'Titel # url' oldbitrate=0 cnt=0 for s in assets: # Log(s) # bei Bedarf frameWidth = stringextract('<frameWidth>', '</frameWidth>', s) frameHeight = stringextract('<frameHeight>', '</frameHeight>', s) url_mp4 = stringextract('<progressiveDownloadUrl>', '</', s) bitrate = stringextract('<bitrateVideo>', '</', s) profil = stringextract('<profileName>', '</', s) resolution = frameWidth + 'x' + frameHeight if int(bitrate) > oldbitrate: oldbitrate = int(bitrate) high = cnt # Qualitäts-Index Downloads title = profil download_list.append(title + '#' + url_mp4) # Download-Liste füllen tagline = Plot_par.replace('||','\n') # wie m3u8-Formate PLog('Satz:') PLog(title); PLog(url_mp4); PLog(thumb); PLog(Plot_par); title_call=py2_encode(title_call) title=py2_encode(title); url_mp4=py2_encode(url_mp4); thumb=py2_encode(thumb); Plot_par=py2_encode(Plot_par); fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s', 'sub_path': '%s', 'Merk': ''}" %\ (quote_plus(url_mp4), quote_plus(title_call), quote_plus(thumb), quote_plus(Plot_par), quote_plus(sub_path)) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=thumb, thumb=thumb, fparams=fparams, mediatype='video', tagline=summ) cnt = cnt + 1 if download_list: # Downloadbutton(s) # Qualitäts-Index high: hier Basis Bitrate (s.o.) title_org = title_call summary_org = summ; tagline_org = '' PLog(summary_org);PLog(tagline_org);PLog(thumb); li = ardundzdf.test_downloads(li,download_list,title_org,summary_org,tagline_org,thumb,high=high) xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)
def SingleVideo(img, title, pid, tag, summ, dur, geo): PLog("SingleVideo: " + pid) title_call = title path = 'https://api.arte.tv/api/player/v1/config/de/%s/?autostart=0' % pid page, msg = get_page(path) if page == '': msg1 = 'Fehler in SingleVideo: %s' % title msg2 = msg MyDialog(msg1, msg2, '') return li PLog(len(page)) page = page.replace('\\/', '/') page = page.replace('\\"', '*') # Bsp. "\"Brisant\"" li = xbmcgui.ListItem() li = home(li, ID='arte') # Home-Button formitaeten = blockextract('"id":"H', page) # Bsp. "id":"HTTPS_MQ_1", "id":"HLS_XQ_1" PLog(len(formitaeten)) form_arr = [] for rec in formitaeten: r = [] mediaType = stringextract('"mediaType":"', '"', rec) bitrate = stringextract('"bitrate":', ',', rec) quality = stringextract('"quality":"', '"', rec) width = stringextract('"width":', ',', rec) height = stringextract('"height":', ',', rec) size = "%sx%s" % (width, height) url = stringextract('"url":"', '"', rec) lang = stringextract('"versionLibelle":"', '"', rec) # z.B. Deutsch (Original) lang = transl_json(lang) # versch. Streams möglich (franz, UT, ..) - in Konzert-Streams # alle Streams erlauben, sonst nur Deutsch + Originalfassung: if 'Deutsch' in lang or 'Originalfassung' in lang or '/concert/' in url: lang = lang.replace('Deutsch', '') # aus Platzgr. entf. r.append(mediaType) r.append(bitrate) r.append(size) r.append(quality) r.append(url) r.append(lang) form_arr.append(r) else: continue if 'master.m3u8' in rec: # master.m3u8 für Sofortstart holen href_m3u8 = stringextract('url":"', '"', rec) form_arr.sort() # Sortieren if len(form_arr) == 0: msg1 = 'Fehler in SingleVideo: %s' % title msg2 = 'keine verwertbaren Streams gefunden' MyDialog(msg1, msg2, '') return li Plot_par = tag if summ: Plot_par = "%s||||%s" % (tag, summ) if SETTINGS.getSetting( 'pref_video_direct') == 'true': # or Merk == 'true': # Sofortstart PLog('Sofortstart: arte SingleVideo') li.setProperty('IsPlayable', 'false') # verhindert wiederh. Starten nach Stop PlayVideo(url=href_m3u8, title=title, thumb=img, Plot=Plot_par) return download_list = [] # 2-teilige Liste für Download: 'Titel # url' for rec in form_arr: # alle Video-Url ausgeben mediaType = rec[0] bitrate = rec[1] size = rec[2] quality = rec[3] url = rec[4] lang = rec[5] PLog('Mark3') if 'master.m3u8' in url: quality = quality + ' (auto)' title = u"Typ: %s, Bitrate: %s, %s, %s" % (up_low(mediaType), bitrate, size, quality) if lang: title = "%s | %s" % (title, lang) if 'mp4' in mediaType: download_list.append(title + '#' + url) # Download-Liste füllen PLog('Satz:') PLog(title) PLog(url) thumb = img tag = tag.replace('||', '\n') title_call = py2_encode(title_call) title = py2_encode(title) url = py2_encode(url) thumb = py2_encode(thumb) Plot_par = py2_encode(Plot_par) fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" %\ (quote_plus(url), quote_plus(title_call), quote_plus(thumb), quote_plus(Plot_par)) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=thumb, thumb=thumb, fparams=fparams, mediatype='video', tagline=tag) PLog(download_list[0]) if download_list: # Downloadbutton(s), high=0: 1. Video = höchste Qualität # Qualitäts-Index high: hier Basis Bitrate (s.o.) title_org = title_call summary_org = summ tagline_org = repl_json_chars(tag) # PLog(summary_org);PLog(tagline_org);PLog(thumb); li = ardundzdf.test_downloads(li, download_list, title_org, summary_org, tagline_org, thumb, high=0) xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)
def yt_get(url, vid, title, tag, summ, thumb): PLog('yt_embed_url: ' + url) watch_url = 'https://www.youtube.com/watch?v=' + vid PLog('yt_watch_url: ' + watch_url) PLog(tag); PLog(summ);PLog(thumb); title_org=title; tag_org=tag; summ_org=summ li = xbmcgui.ListItem() li = home(li, ID='phoenix') # Home-Button try: yt_init = YouTube(watch_url) # page, msg = get_page(path=watch_url) # entfällt vorerst (s. get_duration) # if 'approxDurationMs' in page: # Extrakt aus Webseite (id="player-api" ..) # duration = get_duration(page) # Bsp.: "1:06" oder leer duration = yt_init.millisecs duration = seconds_translate(int(int(duration) / 1000)) PLog("duration: %s" % duration) except Exception as exception: PLog(str(exception)) msg1 = u"Youtube-Video nicht verfügbar." msg2 = 'Fehler: %s' % str(exception) msg3 = "Video-ID: watch?v=%s" % vid MyDialog(msg1, msg2, msg3) return # nur mp4-Videos laden Videos = yt_init.streams.filter(file_extension='mp4').all() PLog(len(Videos)); PLog(str(Videos)) if SETTINGS.getSetting('pref_video_direct') == 'true': PLog('Sofortstart: yt_init') # <Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" # vcodec="avc1.64001F" acodec="mp4a.40.2">: stream = yt_init.streams.get_by_itag(22) res,fps,vcodec,acodec = get_stream_details(str(stream)) yt_url = stream.download(only_url=True) if summ == '': summ = tag summ="%s\n\n%s" % (summ, 'Youtube-Video: %s | %s | %s | %s' % (res, fps, vcodec, acodec)) PlayVideo(url=yt_url, title=title, thumb=thumb, Plot=summ, sub_path="") return download_list = [] # 2-teilige Liste für Download: 'Titel # url' i=1 for video in Videos: v = str(video) itag = stringextract('itag="', '"', v) mime_type = stringextract('mime_type="', '"', v) res,fps,vcodec,acodec = get_stream_details(v) PLog(video); PLog('itag: ' + itag) PLog(res); PLog(fps); PLog(vcodec); PLog(acodec); ''' try: # Videolänge funktioniert (noch) nicht - s.o. duration = yt_init.length() duration = seconds_translate(sec) except: duration = '' ''' stream = yt_init.streams.get_by_itag(itag) yt_url = stream.download(only_url=True) PLog('yt_url: ' + yt_url[:100]) if res == '' and fps == '': summ='%s. Youtube-Video (nur Audio): %s' % (str(i), acodec) else: if acodec: summ='%s. Format: %s | %s | %s | %s' % (str(i), res, fps, vcodec, acodec) else: summ='%s. Format: %s | %s | %s' % (str(i), res, fps, vcodec) download_list.append(summ + '#' + yt_url) # Download-Liste füllen (Qual.#Url) if duration: tag = u"Dauer %s | %s" % (duration, tag_org) summ_par = "%s||||%s||||%s" % (tag, summ, title_org) title = "%s. %s" % (str(i),title_org) PLog(title); PLog(tag); PLog(summ) yt_url=py2_encode(yt_url); title=py2_encode(title); thumb=py2_encode(thumb) summ_par=py2_encode(summ_par) fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" % \ (quote(yt_url), quote(title), quote_plus(thumb), quote_plus(summ_par)) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=thumb, thumb=thumb, fparams=fparams, tagline=tag, summary=summ, mediatype='video') i=i+1 if download_list: # Downloadbutton(s), high=0: 1. Video = höchste Qualität PLog(len(download_list)) # Qualitäts-Index high: hier Basis Bitrate (s.o.) title_org = title_org summary_org = '' tagline_org = repl_json_chars(tag) # PLog(summary_org);PLog(tagline_org);PLog(thumb); li = ardundzdf.test_downloads(li,download_list,title_org,summary_org,tagline_org,thumb,high=0) xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)
def get_formitaeten(li, content_id, title, tagline, thumb): PLog('get_formitaeten') PLog('content_id: ' + content_id) if content_id == '': # sollte nicht vorkommen msg = '%s | content_id fehlt' % title xbmcgui.Dialog().ok(ADDON_NAME, msg1, '', '') return li url = 'https://www.phoenix.de/php/mediaplayer/data/beitrags_details.php?ak=web&ptmd=true&id=' + content_id page, msg = get_page(path=url) if page == '': msg1 = 'Fehler in get_formitaeten: %s' % title msg2 = msg xbmcgui.Dialog().ok(ADDON_NAME, msg1, msg2, '') return li PLog(len(page)) basename = stringextract( '<basename>', '</basename>', page) # Bsp. <basename>180605_phx_runde</basename> #if basename == '': # continue url = 'https://tmd.phoenix.de/tmd/2/ngplayer_2_3/vod/ptmd/phoenix/' + basename page, msg = get_page(path=url) if page == '': msg1 = 'Fehler in get_formitaeten: %s' % title msg2 = msg xbmcgui.Dialog().ok(ADDON_NAME, msg1, msg2, '') return li PLog(len(page)) formitaeten = blockextract( '"formitaeten"', page) # Video-URL's ermitteln - wie ZDF-Mediathek # PLog(formitaeten) geoblock = stringextract('geoLocation', '}', page) geoblock = stringextract('"value": "', '"', geoblock).strip() PLog('geoblock: ' + geoblock) # i.d.R. "none", sonst "de" if geoblock == 'de': # Info-Anhang für summary geoblock = ' | Geoblock!' else: geoblock = '' download_list = [] # 2-teilige Liste für Download: 'Titel # url' title_call = title tagline = "%s\n\nSendung: %s" % (tagline, title_call) Plot_par = tagline.replace('\n', '||') for rec in formitaeten: # Datensätze gesamt # PLog(rec) # bei Bedarf typ = stringextract('"type" : "', '"', rec) facets = stringextract('"facets" : ', ',', rec) # Bsp.: "facets": ["progressive"] facets = facets.replace('"', '').replace('\n', '').replace(' ', '') if facets == '[]': facets = '' PLog('typ: ' + typ) PLog('facets: ' + facets) if typ == "h264_aac_f4f_http_f4m_http": # manifest.fm auslassen continue audio = blockextract('"audio" :', rec) # Datensätze je Typ PLog(len(audio)) # PLog(audio) # bei Bedarf for audiorec in audio: url = stringextract('"uri" : "', '"', audiorec) # URL url = url.replace('https', 'http') # im Plugin kein Zugang mit https! quality = stringextract('"quality" : "', '"', audiorec) if quality == 'high': # high bisher identisch mit auto continue PLog(url) PLog(quality) PLog(tagline) if url: if url.endswith('master.m3u8'): if SETTINGS.getSetting( 'pref_video_direct' ) == 'true': # or Merk == 'true': # Sofortstart PLog('Sofortstart: phoenix get_formitaeten') li.setProperty( 'IsPlayable', 'false') # verhindert wiederh. Starten nach Stop PlayVideo(url=url, title=title_call, thumb=thumb, Plot=Plot_par) return title = u'Qualität: ' + quality + ' | Typ: ' + typ + ' ' + facets if 'mp4' in typ: download_list.append(title + '#' + url) # Download-Liste füllen title_call = py2_encode(title_call) title = py2_encode(title) url = py2_encode(url) thumb = py2_encode(thumb) Plot_par = py2_encode(Plot_par) fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" %\ (quote_plus(url), quote_plus(title_call), quote_plus(thumb), quote_plus(Plot_par)) addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=thumb, thumb=thumb, fparams=fparams, mediatype='video', tagline=tagline) if download_list: # Downloadbutton(s), high=0: 1. Video = höchste Qualität # Qualitäts-Index high: hier Basis Bitrate (s.o.) title_org = title_call summary_org = '' tagline_org = repl_json_chars(tagline) # PLog(summary_org);PLog(tagline_org);PLog(thumb); li = ardundzdf.test_downloads(li, download_list, title_org, summary_org, tagline_org, thumb, high=0) return li