diff --git a/addon.xml b/addon.xml index 5473b19..e8ebf68 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + diff --git a/ardundzdf.py b/ardundzdf.py index bc2d62b..d1506e4 100644 --- a/ardundzdf.py +++ b/ardundzdf.py @@ -57,8 +57,8 @@ # VERSION -> addon.xml aktualisieren # 216 # Numerierung für Einzelupdate -VERSION = '5.0.9' -VDATE = '16.08.2024' +VERSION = '5.1.0' +VDATE = '18.08.2024' # (c) 2019 by Roland Scholz, rols1@gmx.de @@ -3469,10 +3469,8 @@ def ARDSportWDR(): cacheID = "Sport_Startseite" img = logo path = "https://www.sportschau.de" - title=py2_encode(title); path=py2_encode(path); img=py2_encode(img); - fparams="&fparams={'title': '%s', 'path': '%s', 'img': '%s', 'cacheID': '%s'}" %\ - (quote(title), quote(path), quote(img), cacheID) - addDir(li=li, label=title, action="dirList", dirID="ARDSportCluster", fanart=img, thumb=img, + fparams="&fparams={}" + addDir(li=li, label=title, action="dirList", dirID="ARDSportStart", fanart=img, thumb=img, fparams=fparams, tagline=tag) title = u"Livestreams der Sportschau" @@ -3484,23 +3482,12 @@ def ARDSportWDR(): fparams=fparams, tagline=tag) #--------------------------------------------------------- Großevents Start - title = u"Event: [B]OLYMPIA 2024[/B]" # Großevent - tag = u"Alles zu den Olympischen Spielen 2024 Paris - News, Ergebnisse, Livestreams" - cacheID = "Sport_OLYMPIA_2024" - img = "https://images.sportschau.de/image/8256571a-83dd-474d-9f81-982a02eea327/AAABi9KI1Ww/AAABjwnlFvA/16x9-1280/logo-olympia-paris-2024-100.jpg" - path = "https://www.sportschau.de/olympia/index.html" - title=py2_encode(title); path=py2_encode(path); img=py2_encode(img); - fparams="&fparams={'li': '', 'title': '%s', 'page': '', 'path': '%s'}" %\ - (quote(title), quote(path)) - addDir(li=li, label=title, action="dirList", dirID="ARDSportMedia", fanart=img, thumb=img, - fparams=fparams, tagline=tag) - - title = u"Event: [B]Tour de France 2024[/B]" # Großevent - tag = u"Tour de France 2024, Livestreams, Videos, Nachrichten, Rennberichte, Etappen, Ergebnisse und Wertungen" - cacheID = "Sport_TourdeFrance_2024" - img = "https://images.sportschau.de/image/b0709b8b-c4de-4632-af95-5594f03eeea3/AAABkAOw8zc/AAABjwnlFvA/16x9-1280/nizza-256.jpg" - path = "https://www.sportschau.de/radsport/tourdefrance/index.html" + title = u"Event: [B]Tour de France Femmes 2024[/B]" # Großevent + tag = u"Tour de France Femmes 2024, Rennberichte, Analysen, Bilder, Ergebnisse und Wertungen zu allen Etappen" + cacheID = "Sport_TourdeFemmes_2024" + img = "https://images.sportschau.de/image/5e488d45-7e8c-4ec6-9d90-b10cb3a43233/AAABiaIsZUA/AAABkUqnCZ0/16x9-1280/tdff-peloton-etappe-7-100.jpg" + path = "https://www.sportschau.de/radsport/tourdefrance-femmes" title=py2_encode(title); path=py2_encode(path); img=py2_encode(img); fparams="&fparams={'li': '', 'title': '%s', 'page': '', 'path': '%s'}" %\ (quote(title), quote(path)) @@ -4391,103 +4378,42 @@ def ARDSportLoadPage(title, path, func, cacheID=""): MyDialog(msg1, msg2, msg3) return page - -##--------------------------------------------------------------------------------------------------- -# Großevent der Sportschau -# 1. Aufruf: ARDSportWDR -# 2. Aufruf: ARDSportCluster mit cluster (class="trenner") -# 24.06.2022 Rückfall-Adresse www.sportschau.de - bei Großevents -# verlegt der WDR die Ankündigunsseite auf die Startseite -# -def ARDSportCluster(title, path, img, cacheID, cluster=''): - PLog('ARDSportCluster: ' + cluster) - new_url, msg = get_page(path=path, GetOnlyRedirect=True) - if new_url == '': - path = "https://www.sportschau.de/" +#--------------------------------------------------------------------------------------------------- +def ARDSportStart(): + PLog('ARDSportStart:') - page = ARDSportLoadPage(title, path, "ARDSportCluster") + base = "https://www.sportschau.de/" + page = ARDSportLoadPage("Startseite", base, "ARDSportStart") if page == '': return li = xbmcgui.ListItem() - li = home(li, ID='ARD Neu') # Home-Button - - trenner = 'class="trenner__text">' - items = blockextract(trenner, page) - PLog(len(items)) - #----------------------------------------------- # 1. Durchlauf - if cluster == '': - PLog("stage1") - #------------------ - teaser = blockextract('class="teaser-slider', page) # vor Cluster: Slider gesamte Seite auswerten - PLog(len(teaser)) - if len(teaser) > 0: - cnt=1 - for item in teaser: - Dict_ID = "ARDSportSlider_%d" % cnt - Dict("store", Dict_ID, item) - title = "[B]Sliderbox %d[/B]" % cnt - tag = u"Folgeseiten" - title=py2_encode(title); path=py2_encode(path); - img=py2_encode(img); - fparams="&fparams={'title': '%s', 'path': '%s', 'img': '%s', 'Dict_ID': '%s'}" %\ - (quote(title), quote(path), quote(img), Dict_ID) - addDir(li=li, label=title, action="dirList", dirID="ARDSportHub", fanart=img, thumb=img, - fparams=fparams, tagline=tag) - cnt=cnt+1 - #------------------ - for item in items: - if "v-instance tabnav" in item: # Webseite-Menü - continue - tag='' - title = stringextract('__headline">', '', 'Specials" in title: # redakt. Inhalte - continue - title = cleanhtml(title); title = title.strip() - title = unescape(title); title = repl_json_chars(title) - - tag = "[B]%s[/B]" % topline - tag = "%s\nFolgeseiten" % tag - tag = unescape(tag); + li = home(li, ID='ARD Neu') # Home-Button - PLog("Satz_stage1:") - PLog(title); PLog(tag); PLog(cluster); - - title=py2_encode(title); path=py2_encode(path); - img=py2_encode(img); cluster=py2_encode(cluster); - fparams="&fparams={'title': '%s', 'path': '%s', 'img': '%s', 'cacheID': '%s', 'cluster': '%s'}" %\ - (quote(title), quote(path), quote(img), cacheID, quote(title)) - addDir(li=li, label=title, action="dirList", dirID="ARDSportCluster", fanart=img, thumb=img, - fparams=fparams, tagline=tag) - - #----------------------------------------------- # 2. Durchlauf - else: - PLog("stage2") - headline = ">%s<" % cluster - PLog("headline: " + headline) - for item in items: - found=False - title = stringextract('__headline">', ' page - break - if found: - cnt = ARDSportMedia(li, title, page) - if cnt == 0: # Verbleib in Liste - return + # 1. Hamburger-Menü rechte Seite bis 1. Teiler (Live & Ergebnisse): + burger = stringextract('class="burger-navi-nav', 'class="burger-panel-divider', page) + items = blockextract("
  • ", burger, "
  • ") + PLog(len(items)) + for item in items: + path = base + stringextract('href="', '"', item) # Folgeseiten ohne http + img = R(ICON_DIR_FOLDER) # Burger-img grauslich + title = stringextract('title="', '"', item) + title = title.replace(" aufrufen", "") - xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) + PLog("Satz9:") + PLog(title); PLog(path); PLog(img); + tag = "Folgeseiten" + title=py2_encode(title); path=py2_encode(path); img=py2_encode(img); + fparams="&fparams={'li': '', 'title': '%s', 'page': '', 'path': '%s'}" %\ + (quote(title), quote(path)) + addDir(li=li, label=title, action="dirList", dirID="ARDSportMedia", fanart=img, thumb=img, + fparams=fparams, tagline=tag) + + # 2. Videos + Audios der Startseite ausgeben + ARDSportMedia(li, title, page) + + xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) #--------------------------------------------------------------------------------------------------- # Livestreams der Sportschau @@ -4570,8 +4496,7 @@ def ARDSportAudioStreams(title, path, img, cacheID): #--------------------------------------------------------------------------------------------------- # Auswertung mediaplayer-Klassen (quoted:data-v=..) -# Aufrufer ARDSportWDR, ARDSportAudioStreams, -# ARDSportCluster +# Aufrufer ARDSportWDR, ARDSportAudioStreams # 05.08.2024 Nutzung TagesschauXL.get_content_json # def ARDSportMedia(li, title, page, path=""): @@ -4611,6 +4536,9 @@ def ARDSportMedia(li, title, page, path=""): typ,av_typ,title,tag,summ,img,stream = TagesschauXL.get_content_json(item) if typ == False: # jsonloads_error continue + if stream in url_list: # Doppel möglich (Tour de France Femmes) + continue + url_list.append(stream) title=py2_encode(title); stream=py2_encode(stream); summ=py2_encode(summ); img=py2_encode(img); diff --git a/changelog.txt b/changelog.txt index f2633ce..4709cc9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -10,7 +10,25 @@ CHANGE HISTORY max_col 97 -------------- -04.08.2024 ZDF_Search: Anpassung ZDF_Search_PATH an geänderte ZDF-Parameter. +18.08.2024 5.1.0 + Auswertung ARD Sportschau.de (WDR): neues Funktionsziel ARDSportMedia für + Großevents in ARDSportWDR (ohne Cluster), Startseite: neue Funktion + ARDSportStart s.u., obsolete Funktion ARDSportCluster entfernt. + ARDSportMedia: neu - Extrakt sämtlicher Playerdaten (data-v=), Auswertung + in TagesschauXL.get_content_json, doppelte Stream-Url unterdrückt. + get_page (util): compressed-Behandlung für Stufe 2 (page2) - relevant für + json-Daten. Decoding für Stufe1 und 2 an das Funktionsende verlegt. Rücknahme + return bei http-Error aus V4.7.8 (nicht mehr benötigt für VideoEvent-Streams). + PlayVideo (util): import sqlite3 entfernt - obsolet + EPG-Suche (Haupt-PRG): Such-Button im Menü TV-Livestreams, neue Funktion + EPG_Search, einschl. Aufnahmeoption (Kontextmenü), Wiki aktualisiert. + EPG (Modul EPG): Ausgabe str(page) auskommentiert (codec-Error python2.*). + Modul epgRecord: Löschoption für abgelaufene Jobs ergänzt (Button in JobListe, + neue Funktion JobRemoveExp). + url_check: Rückgabe bei lokaler Video-Url korrigiert (Url statt True). + +04.08.2024 5.0.9 + ZDF_Search: Anpassung ZDF_Search_PATH an geänderte ZDF-Parameter. Main_NEW (ARDnew): Verzicht auf fehlende Variable summ für Suche-Button (verhinderte Öffnen des ARD-Menüs). get_json_content (ARDnew): Codec-Error gefixt mit py2_encode(page) bei @@ -25,7 +43,6 @@ CHANGE HISTORY 307 für Redirects, Addon-Wicki: Hinweis auf Proxy-Nutzung ergänzt und Verlinkung mit Beitrag @forrester # 3.735 vom 03.08.2024 - https://www.kodinerds.net/thread/64244-release-kodi-addon-ardundzdf/?postID=760618#post760618 get_VideoAudio, get_content_json (TagesschauXL): Anpassung an geänderte eingebettete Playerdaten für Investigativ, Faktenfinder, Podcasts und Audios. diff --git a/resources/lib/TagesschauXL.py b/resources/lib/TagesschauXL.py index 054498c..ad223a0 100644 --- a/resources/lib/TagesschauXL.py +++ b/resources/lib/TagesschauXL.py @@ -507,7 +507,7 @@ def XL_Search(query='', pagenr=''): PLog("cnt_video: %d, cnt_audio: %d" % (cnt_video, cnt_audio)) if cnt_video == 0 and cnt_audio == 0: - msg1 = u'keine videos und Audios gefunden' + msg1 = u'keine Videos und Audios gefunden' msg2 = query icon = ICON_MAINXL xbmcgui.Dialog().notification(msg1,msg2,icon,3000) @@ -759,6 +759,7 @@ def get_content_json(item): tag=""; img="" if "playerType" not in obj: # falsches Format + PLog("missing_playerType") return False,"","","","","","" typ = obj["playerType"] diff --git a/resources/lib/util.py b/resources/lib/util.py index 6a31698..242f81f 100644 --- a/resources/lib/util.py +++ b/resources/lib/util.py @@ -3916,12 +3916,14 @@ def PlayAudio(url, title, thumb, Plot, header=None, FavCall=''): # Aufruf: PlayVideo # 04.03.2022 Header für ZDF-Url erforderl. (Error "502 Bad Gateway") # 21.01.2023 dialog optional für add_UHD_Streams (ohne Dialog) +# Rückage url oder False def url_check(url, caller='', dialog=True): PLog('url_check:') if url.startswith('http') == False: # lokale Datei if os.path.exists(url): - return True + PLog("local_file") + return url else: if dialog: msg2 = url