예제 #1
0
파일: ARDnew.py 프로젝트: Torben2000/repo
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)
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
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)
예제 #8
0
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)
예제 #9
0
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)
예제 #10
0
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