diff --git a/ardundzdf.py b/ardundzdf.py
index ed2f615..a515110 100644
--- a/ardundzdf.py
+++ b/ardundzdf.py
@@ -55,9 +55,9 @@
# +++++ ARDundZDF - Addon Kodi-Version, migriert von der Plexmediaserver-Version +++++
# VERSION -> addon.xml aktualisieren
-# 87 # Numerierung für Einzelupdate
+# 88 # Numerierung für Einzelupdate
VERSION = '4.6.0'
-VDATE = '05.02.2023'
+VDATE = '10.02.2023'
# (c) 2019 by Roland Scholz, rols1@gmx.de
@@ -363,7 +363,7 @@
CurSender = ARDSender[0] # Default ARD-Alle
fname = os.path.join(DICTSTORE, 'CurSender') # init CurSender (aktueller Sender)
if os.path.exists(fname): # kann fehlen (Aufruf Merkliste)
- CurSender = Dict('load', "CurSender") # Übergabe -> ARDnew in Main
+ CurSender = Dict('load', "CurSender") # Übergabe -> Main_NEW (ARDnew)
#----------------------------------------------------------------
@@ -9705,7 +9705,7 @@ def ZDF_getVideoSources(url,title,thumb,tagline,Merk='false',apiToken='',sid='',
# 08.03.2022 Anpassung für Originalton + Audiodeskription (class_add)
# 21.01.2023 UHD-Streams für Testbetrieb ergänzt (add_UHD_Streams)
#
-def build_Streamlists(li,title,thumb,geoblock,tagline,sub_path,formitaeten,scms_id='',ID="ZDF"):
+def build_Streamlists(li,title,thumb,geoblock,tagline,sub_path,formitaeten,scms_id='',ID="ZDF",weburl=''):
PLog('build_Streamlists:'); PLog(ID)
title_org = title
@@ -9826,13 +9826,22 @@ def build_Streamlists(li,title,thumb,geoblock,tagline,sub_path,formitaeten,scms_
MyDialog(msg1, '', '')
return HLS_List, MP4_List, HBBTV_List
- UHD_DL_list=[] # UHD-Download-Streams
- if ID == "ZDF": # o. Abbruch-Dialog
- HBBTV_List = ZDFSourcesHBBTV(title, scms_id)
+ # ------------ # HBBTV + UHD-Streams von ZDF + 3sat:
+ UHD_DL_list=[]
+ if ID == "ZDF": # ZDF, ZDF-funk
+ HBBTV_List = ZDFSourcesHBBTV(title, scms_id) #
PLog("HBBTV_List: " + str(len(HBBTV_List)))
- # UHD-Streams erzeugen: # UHD-Streams
+ # UHD-Streams erzeugen+testen: # UHD-Streams -> HBBTV_List
HBBTV_List, UHD_DL_list = add_UHD_Streams(HBBTV_List)
Dict("store", '%s_HBBTV_List' % ID, HBBTV_List)
+ if ID == "3sat": # 3sat
+ HBBTV_List = m3satSourcesHBBTV(weburl, title_org)
+ PLog("HBBTV_List: " + str(len(HBBTV_List)))
+ # UHD-Streams erzeugen+testen: # UHD-Streams -> HBBTV_List
+ HBBTV_List, UHD_DL_list = add_UHD_Streams(HBBTV_List)
+ Dict("store", '%s_HBBTV_List' % ID, HBBTV_List)
+
+ PLog("UHD_DL_list: " + str(len(UHD_DL_list)))
Dict("store", '%s_HLS_List' % ID, HLS_List)
# MP4_List = add_UHD_Streams(MP4_List) # entf., nur in HBBTV-Quellen (?)
@@ -9857,7 +9866,7 @@ def build_Streamlists(li,title,thumb,geoblock,tagline,sub_path,formitaeten,scms_
#-------------------------
# Aufruf: build_Streamlists
-# UHD-Streams erzeugen + Verfügbarkeit testen:
+# ZDF-UHD-Streams erzeugen + Verfügbarkeit testen:
# verfügbare UHD-Streams werden oben in HBBTV_List
# und MP4_List (->Downloadliste) eingefügt,
#
@@ -9873,7 +9882,6 @@ def add_UHD_Streams(Stream_List):
#PLog(item)
uhd_list.append(item.replace(mark1, mark2))
cnt_find=cnt_find+1
-
PLog(len(uhd_list));
for item in uhd_list: # Verfügbarkeit testen
@@ -9887,8 +9895,63 @@ def add_UHD_Streams(Stream_List):
if len(UHD_DL_list) > 0:
Stream_List = UHD_DL_list + Stream_List
- PLog(u"found_UDH-Streams: %d, verfügbar: %d" % (cnt_find, cnt_ready))
+ PLog(u"found_UDH_Template: %d, Stream_verfügbar: %d" % (cnt_find, cnt_ready))
return Stream_List, UHD_DL_list
+
+#-------------------------
+# Aufruf: build_Streamlists
+# 3sat-HBBTV-MP4-Streams ermitteln, URL-Schema aus
+# add_UHD_Streams testen + ggfls uhd_list
+# Verzicht auf HLS-HBBTV-Streams (bei Bedarf ergänzen)
+#
+def m3satSourcesHBBTV(weburl, title):
+ PLog('m3satSourcesHBBTV: ' + weburl)
+
+ stream_list=[]; HBBTV_List=[]
+ base= "http://hbbtv.zdf.de/3satm/dyn/get.php?id="
+
+ try:
+ url = weburl.split("/")[-1] # ../kultur/kulturdoku/kuenstlerduelle-vangogh-gaugin-100.html
+ url = url.split(".html")[0]
+ except Exception as exception:
+ PLog(str(exception))
+ return HBBTV_List
+
+ path = base + url
+ page,msg = get_page(path)
+
+ mp4_obs={}; hls_obs={}
+ try:
+ objs = json.loads(page)
+ PLog(len(objs))
+ if "h264_aac_mp4_http_na_na" in objs["vidurls"]:
+ PLog(str(objs["vidurls"]["h264_aac_mp4_http_na_na"]["main"]))
+ mp4_obs = objs["vidurls"]["h264_aac_mp4_http_na_na"]["main"]["deu"] # MP4-Streams
+ if "h264_aac_ts_http_m3u8_http" in objs["vidurls"]:
+ hls_obs = objs["vidurls"]["h264_aac_ts_http_m3u8_http"]["main"]["deu"] # HLS-Streams, fehlen ev.
+ except Exception as exception:
+ PLog(str(exception))
+ page=""
+ if page == '':
+ PLog("no_vidurls_found")
+ return HBBTV_List
+
+ PLog("mp4_obs: %d, hls_obs: %d" % (len(mp4_obs), len(hls_obs)))
+ objs = dict(mp4_obs, **hls_obs) # + nicht bei dicts
+ PLog(str(objs)) # {'q3': 'http://tvdlzdf-..v15.mp4'}
+
+ for obj in objs.items():
+ PLog(str(obj))
+ qual = obj[0]
+ url = obj[1]
+ stream_list.append("%s|%s" % (qual, url))
+
+ label="deu"
+ HBBTV_List = form_HBBTV_Streams(stream_list,label,title) # Formatierung
+ PLog(str(HBBTV_List))
+
+ return HBBTV_List
+
#-------------------------
# Sofortstart + Buttons für die einz. Streamlisten
# Aufrufer: build_Streamlists (ZDF, 3sat), ARDStartSingle (ARD Neu),
@@ -9923,7 +9986,7 @@ def build_Streamlists_buttons(li,title_org,thumb,geoblock,Plot,sub_path,\
img=thumb;
PLog(title_org); PLog(tagline[:60]); PLog(img); PLog(sub_path);
- uhd_cnt_hb = str(HBBTV_List).count("UHD_") # UHD-Kennz. -> Titel
+ uhd_cnt_hb = str(HBBTV_List).count("UHD_") # UHD-Kennz. -> Titel ZDF+3sat
uhd_cnt_hls = str(HLS_List).count("UHD_") # Arte
uhd_cnt_mp4 = str(MP4_List).count("UHD_")
PLog("uhd_cnt: %d, %d, %d" % (uhd_cnt_hb, uhd_cnt_hls, uhd_cnt_mp4))
@@ -9942,7 +10005,7 @@ def build_Streamlists_buttons(li,title_org,thumb,geoblock,Plot,sub_path,\
# title_list: Titel + Dict-ID + Anzahl Streams
title_list.append("%s###%s###%s" % (title_hls, '%s_HLS_List' % ID, len(HLS_List)))
- if ID == "ZDF" or ID == "arte": # HBBTV: ZDF + arte
+ if ID == "ZDF" or ID == "arte" or ID == "3sat": # HBBTV: ZDF, arte, 3sat
listtyp = "%s_HBBTV_List" % ID
title_list.append("%s###%s###%s" % (title_hb, listtyp, len(HBBTV_List)))
title_list.append("%s###%s###%s" % (title_mp4, '%s_MP4_List' % ID, len(MP4_List)))
@@ -9978,7 +10041,7 @@ def ZDFSourcesHBBTV(title, scms_id):
msg1 = u'HBBTV-Quellen nicht vorhanden / verfügbar'
msg2 = u'Video: %s' % title
MyDialog(msg1, msg2, '')
- return
+ return HBBTV_List
page = page.replace('": "', '":"') # für funk-Beiträge erforderlich
PLog('page_hbbtv: ' + page[:100])
@@ -10008,48 +10071,65 @@ def ZDFSourcesHBBTV(title, scms_id):
stream_list.append("%s|%s" % (q, url))
PLog(len(stream_list))
- for stream in stream_list:
- q, url = stream.split("|")
- if q == 'q1':
- quality = u'HOHE'
- w = "960"; h = "540" # Probeentnahme
- bitrate = u"1812067"
- if u'm3u8' in stream:
- bitrate = u"16 MB/Min."
- if q == 'q2':
- quality = u'SEHR HOHE'
- w = "1024"; h = "576" # Probeentnahme
- bitrate = u"3621101"
- if u'm3u8' in stream:
- bitrate = u"19 MB/Min."
- if q == 'q3':
- quality = u'HD'
- w = "1280"; h = "720" # Probeentnahme, bisher fehlend: w = "1920"; h = "1080"
- bitrate = u"6501324"
- if u'm3u8' in stream:
- bitrate = u"23 MB/Min."
-
- res = "%sx%s" % (w,h)
-
- if u'm3u8' in stream:
- stream_title = u'HLS, Qualität: [B]%s | %s[/B]' % (quality, label) # label: Normal, DGS, .
- else:
- stream_title = u'MP4, Qualität: [B]%s | %s[/B]' % (quality, label)
- try:
- bitrate = re.search(u'_(\d+)k_', url).group(1) # bitrate überschreiben
- bitrate = bitrate + "000" # k ergänzen
- except Exception as exception: # ts möglich: http://cdn.hbbtvlive.de/zdf/106-de.ts
- PLog(str(exception))
- PLog(url)
-
- title_url = u"%s#%s" % (title, url)
- item = u"%s ** Bitrate %s ** Auflösung %s ** %s" %\
- (stream_title, bitrate, res, title_url)
- PLog("item: " + item)
- HBBTV_List.append(item)
+ HBBTV_List = form_HBBTV_Streams(stream_list, label, title) # Formatierung
PLog(len(HBBTV_List))
return HBBTV_List
+
+#-------------------------
+# Aufruf: ZDFSourcesHBBTV, m3satSourcesHBBTV
+# Formatierung der Streamlinks ("Qual.|Link")
+def form_HBBTV_Streams(stream_list, label, title):
+ PLog('form_HBBTV_Streams:')
+ HBBTV_List=[]
+
+ for stream in stream_list:
+ q, url = stream.split("|")
+ if q == 'q0':
+ quality = u'GERINGE'
+ w = "640"; h = "360" # Probeentnahme
+ bitrate = u"1812067"
+ if u'm3u8' in stream:
+ bitrate = u"16 MB/Min."
+ if q == 'q1':
+ quality = u'HOHE'
+ w = "960"; h = "540" # Probeentnahme
+ bitrate = u"1812067"
+ if u'm3u8' in stream:
+ bitrate = u"16 MB/Min."
+ if q == 'q2':
+ quality = u'SEHR HOHE'
+ w = "1024"; h = "576" # Probeentnahme
+ bitrate = u"3621101"
+ if u'm3u8' in stream:
+ bitrate = u"19 MB/Min."
+ if q == 'q3':
+ quality = u'HD'
+ w = "1280"; h = "720" # Probeentnahme, bisher fehlend: w = "1920"; h = "1080"
+ bitrate = u"6501324"
+ if u'm3u8' in stream:
+ bitrate = u"23 MB/Min."
+
+ res = "%sx%s" % (w,h)
+
+ if u'm3u8' in stream:
+ stream_title = u'HLS, Qualität: [B]%s | %s[/B]' % (quality, label) # label: Normal, DGS, .
+ else:
+ stream_title = u'MP4, Qualität: [B]%s | %s[/B]' % (quality, label)
+ try:
+ bitrate = re.search(u'_(\d+)k_', url).group(1) # bitrate überschreiben
+ bitrate = bitrate + "000" # k ergänzen
+ except Exception as exception: # ts möglich: http://cdn.hbbtvlive.de/zdf/106-de.ts
+ PLog(str(exception))
+ PLog(url)
+
+ title_url = u"%s#%s" % (title, url)
+ item = u"%s ** Bitrate %s ** Auflösung %s ** %s" %\
+ (stream_title, bitrate, res, title_url)
+ PLog("item: " + item)
+ HBBTV_List.append(item)
+
+ return HBBTV_List
#-------------------------
# Aufrufer: ZDF_get_playerbox
diff --git a/resources/lib/my3Sat.py b/resources/lib/my3Sat.py
index d0b2168..6bf81fb 100644
--- a/resources/lib/my3Sat.py
+++ b/resources/lib/my3Sat.py
@@ -11,8 +11,8 @@
# 18.11.2019 Migration Python3 Modul kodi_six + manuelle Anpassungen
#
################################################################################
-# 6 # Numerierung für Einzelupdate
-# Stand: 28.01.2023
+# 7 # Numerierung für Einzelupdate
+# Stand: 10.02.2023
# Python3-Kompatibilität:
from __future__ import absolute_import # sucht erst top-level statt im akt. Verz.
@@ -1516,6 +1516,7 @@ def get_zdfplayer_content(li, page):
def SingleBeitrag(title, path, img_src, summ, dauer):
PLog('SingleBeitrag: ' + title)
PLog(dauer);PLog(summ);PLog(path)
+ path_org = path
Plot = title
Plot_par = summ # -> PlayVideo
@@ -1579,11 +1580,13 @@ def SingleBeitrag(title, path, img_src, summ, dauer):
page = (page.replace('\\', '').replace('": "', '":"'))
PLog(page[:100])
- 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
+ player = "ngplayer_2_4"
+ pos = page.find('"programmeItem"')
+ page = page[max(0, pos):]
+ streams = stringextract('streams":', '}}', page) # in "mainVideoContent":..
+ videodat_url= stringextract('ptmd-template":"', '"', streams)
+ videodat_url = "https://api.3sat.de" + videodat_url
+ videodat_url = videodat_url.replace('{playerId}', player)
PLog("videodat_url: " + videodat_url)
page,msg = get_page(path=videodat_url, header=headers)
@@ -1633,7 +1636,7 @@ def SingleBeitrag(title, path, img_src, summ, dauer):
#
thumb=img_src; sub_path=''; scms_id=''
HLS_List,MP4_List,HBBTV_List = build_Streamlists(li,title,thumb,geoblock,tagline,\
- sub_path,formitaeten,scms_id,ID="3sat")
+ sub_path,formitaeten,scms_id,ID="3sat",weburl=path_org)
xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)