Skip to content

Commit

Permalink
Änderungen / Korrekturen siehe changelog.txt
Browse files Browse the repository at this point in the history
  • Loading branch information
rols1 committed Mar 31, 2024
1 parent 6ccbdbf commit de8521f
Show file tree
Hide file tree
Showing 5 changed files with 238 additions and 129 deletions.
2 changes: 1 addition & 1 deletion addon.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.ardundzdf" name="ARDundZDF" version="4.9.9+nexus" provider-name="rols1 (rols1@gmx.de)">
<addon id="plugin.video.ardundzdf" name="ARDundZDF" version="5.0.0+nexus" provider-name="rols1 (rols1@gmx.de)">
<requires>
<import addon="xbmc.python" version="3.0.1"/>
<import addon="script.module.kodi-six" />
Expand Down
205 changes: 135 additions & 70 deletions ardundzdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@

# VERSION -> addon.xml aktualisieren
# <nr>189</nr> # Numerierung für Einzelupdate
VERSION = '4.9.9'
VDATE = '29.03.2024'
VERSION = '5.0.0'
VDATE = '31.03.2024'


# (c) 2019 by Roland Scholz, rols1@gmx.de
Expand Down Expand Up @@ -1987,14 +1987,15 @@ def Audio_get_sendung(url, title, page=''):

if page.startswith('<!DOCTYPE html>'):
page = Audio_get_webslice(page, mode="json") # json ausschneiden
elements = stringextract('"numberOfElements":', ',', page) # für Mehr anzeigen
PLog("elements: %s" % elements)

pos = page.find("nodes")
PLog(pos)
if pos > 0:
page = page[pos:]

page = page.replace('\\"', '*')
elements = stringextract('"numberOfElements":', ',', page) # für Mehr anzeigen
PLog("elements: %s" % elements)
items = blockextract('"id":', page, '}]},{') # bis nächste "id" (nicht trennsicher)
PLog(len(items))

Expand Down Expand Up @@ -2213,7 +2214,14 @@ def Audio_get_items_single(item, ID=''):
if mp3_url == '':
web_url = stringextract('"sharingUrl":"', '"', item) # Weblink
if mp3_url == '' and web_url == "": # neu ab 25.03.2023 (Web-json)
web_url = base + stringextract('"path":"', '"', item)
if '"path":"' in item:
web_url = base + stringextract('"path":"', '"', item)
else:
links = stringextract('"_links":', '},', item)
href = stringextract('"href":"', '"', links) # ./editorialcollections/56087830{?offset,limit}"
href = href.replace("{?offset,limit}", "") # hier ohne href_add
href = href.replace("./", ARD_AUDIO_BASE)
web_url = href
if web_url == base: # falls path leer
web_url=""

Expand Down Expand Up @@ -2323,11 +2331,13 @@ def AudioSearch_cluster(li, url, title, page='', key='', query=''):
msg2 = msg
MyDialog(msg1, msg2, '')
return
PLog(len(page))
search_url = url # für Step2

PLog(len(page))

page = json.loads(page)
PLog(str(page)[:100])

search_url = url # für erneuten Aufruf Step2
try:
page = json.loads(page)
objs = page["data"]["search"]
except Exception as exception:
PLog("search_error: " + str(exception))
Expand All @@ -2348,36 +2358,55 @@ def AudioSearch_cluster(li, url, title, page='', key='', query=''):

# Der zusätzl. Abschnitt "deviceType": "responsive" mit
# allen Rubriken wird nicht gelistet
cluster = [u"editorialCategories|Rubriken",
u"editorialCollections|Sammlungen",
u"programSets|Sendungen",
u"items|Episoden (Einzelbeiträge)"]
cluster = [
u"programSets|Sendungen (Podcasts)|Sendung",
u"editorialCollections|Sammlungen/Themen|Thema",
u"editorialCategories|Rubriken|Rubrik",
u"items|Episoden (alle Einzelbeiträge)|Episode"]

tag = "Folgeseiten"
for clus in cluster:
key, tag = clus.split("|")
PLog("%s | %s" % (key, tag))
key, tag1, tag2 = clus.split("|") # tag1, tag2 -> Infotext 1. + 2.Zeile
PLog("%s | %s | %s" % (key, tag1, tag2))
anz = str(objs[key]["numberOfElements"])

if objs[key]["numberOfElements"] > 0:
item = objs[key]["nodes"][0] # 1. Beitrag
tag = u"Folgeseiten | [B]%s[/B]" % (tag)
if key != "items": #
tag = u"%s\nAnzahl: %s" % (tag, anz)
# Anpassung für string-Auswertung:
s=str(item); s=s.replace("'", '"'); s=s.replace('": "', '":"'); s=s.replace('", "', '","')
s = s.replace('\\"', '*')
if objs[key]["numberOfElements"] > 0:
if key != "items": # nur Beiträge aus 1. Suchseite verfügbar,
anz_api = anz # "_links" nicht verwendbar (s.u.)
anz = str(len(objs[key]["nodes"]))
if anz != anz_api: # tatsächliche Anzahl in api-Quelle abweichend!
PLog("anz_correct: %s statt %s" % (anz, anz_api))
item = objs[key]["nodes"][0] # 1. Beitrag
tag = u"Folgeseiten | [B]%s | Anzahl: %s[/B]" % (tag1, anz) # 1. tagline
tag = u"%s\nTitel + Bild: 1. %s" % (tag, tag2) # 2. tagline

# Anpassung für string-Auswertung -> Audio_get_items_single:
s=str(item)
s=(s.replace("'", '"').replace('": "', '":"')\
.replace('", "', '","').replace('\\"', '*').replace(':""', ':"'))
mp3_url, web_url, attr, img, dur, title, summ, source, sender, pubDate = Audio_get_items_single(s)
if mp3_url == "" and web_url == "":
PLog("skip_empty_mp3_and_web_url")
continue

PLog("1Satz_a:")
label = title
PLog(key); PLog(title); PLog(search_url); PLog(attr);

search_url=py2_encode(search_url); title=py2_encode(title); # -> 2. Aufruf mit web_url
# nur die Links der items funktionieren. Für die übrigen
# Cluster stehen nur die Beiträge der 1. Suchseite zur
# Verfügung, trotz kompl. Linksätze (first, next,..) -
# Ursache nicht bekannt.
if key == "items": # Episoden (Einzelbeiträge)
url_first = objs[key]["_links"]["first"]["href"]
PLog("url_first: " + url_first)
search_url = url_first.replace("./", ARD_AUDIO_BASE)
PLog("search_url: " + search_url)

search_url=py2_encode(search_url); title=py2_encode(title); # -> 2. Aufruf
fparams="&fparams={'li': '','url': '%s', 'title': '%s', 'key': '%s'}" % (quote(search_url),
quote(title), key)
addDir(li=li, label=title, action="dirList", dirID="AudioSearch_cluster", \
addDir(li=li, label=label, action="dirList", dirID="AudioSearch_cluster", \
fanart=img, thumb=img, fparams=fparams, tagline=tag, summary=summ)

xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)
Expand All @@ -2396,50 +2425,84 @@ def AudioSearch_cluster(li, url, title, page='', key='', query=''):
#
def Audio_get_search_cluster(objs, key):
PLog('Audio_get_search_cluster: ' + key)

li = xbmcgui.ListItem()
href_add = "offset=0&limit=12&order=descending"
li = home(li,ID='ARD Audiothek') # Home-Button

items = objs[key]["nodes"]
PLog(len(items))

if key=="items" : # Einzel (Episoden)
items = objs[key]["nodes"]
PLog(len(items))
s=str(items); s=s.replace(u"'", '"'); s=s.replace(u'": "', '":"'); s=s.replace(u'", "', '","')
s = s.replace(u'\\"', '*')
s = s.replace(u'""', '"*')
Audio_get_sendung(url="", title="Search_%s" % key, page=s)
else: # Kategorien, Kollektionen, ProgrammSets
li = home(li,ID='ARD Audiothek') # Home-Button
items = objs[key]["nodes"]
PLog(len(items))
cnt=0
for item in items:
node_id = item["id"] # -> api-Path
# Anpassung für string-Auswertung:
s=str(item); s=s.replace("'", '"'); s=s.replace('": "', '":"'); s=s.replace('", "', '","')
s = s.replace('\\"', '*')
mp3_url, web_url, attr, img, dur, title, summ, source, sender, pubDate = Audio_get_items_single(s, key)
tag = "Folgeseiten"
if "programSets" in key: # Sendungen der Sender
tag = "%s\nSender: %s" % (tag, sender)
href = ARD_AUDIO_BASE + "%s/%s/?offset=0&limit=20" % (key, node_id)

PLog('13Satz_a:');
PLog(title); PLog(href); PLog(img);
title=py2_encode(title); href=py2_encode(href);
try: # nexturl?
href = objs[key]["_links"]["next"]["href"]
nexturl = href.replace("./", ARD_AUDIO_BASE)
total = stringextract("numberOfElements': ", ",", str(objs))
except Exception as exception:
PLog("nexturl_error: " + str(exception))
nexturl=""; total=""
PLog('nexturl: %s, total: %s ' % (nexturl, total))
PLog(str(objs)[:80])
PLog(len(items))

cnt=0
for item in items:
node_id = item["id"] # -> api-Path
# Anpassung für string-Auswertung -> Audio_get_items_single:
s=str(item)
s=(s.replace("'", '"').replace('": "', '":"')\
.replace('", "', '","').replace('\\"', '*').replace(':""', ':"'))
if "Hohenberg" in s:
PLog(s)
mp3_url, web_url, attr, img, dur, title, summ, source, sender, pubDate = Audio_get_items_single(s, key)
tag = "Folgeseiten"
if "programSets" in key: # Sendungen der Sender
tag = "%s\nSender: %s" % (tag, sender)
href = ARD_AUDIO_BASE + "%s/%s/?offset=0&limit=20" % (key, node_id)

PLog('13Satz_a:');
PLog(title); PLog(href); PLog(img);
title=py2_encode(title); href=py2_encode(href);

if key=="editorialCollections" or key=="programSets":# Kollektionen, ProgrammSets
fparams="&fparams={'url': '%s', 'title': '%s'}" % (quote(href), quote(title))
addDir(li=li, label=title, action="dirList", dirID="Audio_get_sendung", \
fanart=img, thumb=img, fparams=fparams, tagline=tag, summary=summ)
elif key=="editorialCategories": # editorialCategories / Kategorien
PLog('13Satz_b: ' + href);
href = "https://www.ardaudiothek.de/rubrik/%s" % node_id
fparams="&fparams={'li': '','url': '%s', 'title': '%s', 'ID': 'Audio_get_search_cluster'}" %\
(quote(href), quote(title))
addDir(li=li, label=title, action="dirList", dirID="Audio_get_cluster_rubrik", \
fanart=img, thumb=img, fparams=fparams)
else: # items: Episoden (Einzelbeiträge)
PLog('13Satz_c: ' + mp3_url);
tag = "Dauer %s" % dur
if pubDate:
tag = "%s | Datum %s" % (tag, pubDate)
if sender:
tag = "%s | Sender %s\n[B]%s[/B]" % (tag, sender, attr)
summ_par = summ

mp3_url=py2_encode(mp3_url); img=py2_encode(img); summ_par=py2_encode(summ_par);
fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" % (quote(mp3_url),
quote(title), quote(img), quote_plus(summ_par))
addDir(li=li, label=title, action="dirList", dirID="AudioPlayMP3", fanart=img, thumb=img,
fparams=fparams, tagline=tag, summary=summ)

cnt=cnt+1

if key=="editorialCollections" or key=="programSets":# Kollektionen, ProgrammSets
fparams="&fparams={'url': '%s', 'title': '%s'}" % (quote(href), quote(title))
addDir(li=li, label=title, action="dirList", dirID="Audio_get_sendung", \
fanart=img, thumb=img, fparams=fparams, tagline=tag, summary=summ)
else: # editorialCategories / Kategorien
PLog('13Satz_b: ' + href);
href = "https://www.ardaudiothek.de/rubrik/%s" % node_id
fparams="&fparams={'li': '','url': '%s', 'title': '%s', 'ID': 'Audio_get_search_cluster'}" %\
(quote(href), quote(title))
addDir(li=li, label=title, action="dirList", dirID="Audio_get_cluster_rubrik", \
fanart=img, thumb=img, fparams=fparams)
cnt=cnt+1
if key == "items" and nexturl: # nexturl aus json-Quelle, Audio_get_nexturl entf.
img=R(ICON_MEHR)
offset = re.search(u'offset=(\d+)', nexturl).group(1)
offset = int(offset) +1 # Basis 0
title = "Mehr: [B]%s[/B]" % stringextract("searchText': '", "'", str(objs))
tag = u"Mehr (ab Beitrag %d von %s)" % (offset, total)
nexturl=py2_encode(nexturl); title=py2_encode(title); # -> 2. Aufruf
fparams="&fparams={'li': '','url': '%s', 'title': '%s', 'key': '%s'}" % (quote(nexturl),
quote(title), key)
addDir(li=li, label=title, action="dirList", dirID="AudioSearch_cluster", \
fanart=img, thumb=img, fparams=fparams, tagline=tag, summary=summ)


xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)


Expand Down Expand Up @@ -2732,13 +2795,15 @@ def Audio_get_homescreen(page='', cluster_id=''):
PLog('6Satz:');
PLog(title); PLog(typ); PLog(cluster_id);
cluster_id=py2_encode(cluster_id);

if typ == "STAGE": # Button Highlights
label=title
if typ == "STAGE": # Button Highlights -> Audio_get_cluster_single
cluster_id = "Highlights"
title = "[B]%s[/B]" % cluster_id
label = "[B]%s[/B]" % cluster_id
if typ == "NAVIGATION": # neu ab 29.03.2024 -> node_load
label = "[B]%s[/B]" % typ

fparams="&fparams={'cluster_id': '%s'}" % cluster_id
addDir(li=li, label=title, action="dirList", dirID="Audio_get_homescreen",
addDir(li=li, label=label, action="dirList", dirID="Audio_get_homescreen",
fanart=R(ICON_MAIN_AUDIO), thumb=img, tagline=tag, fparams=fparams)

xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)
Expand Down
30 changes: 30 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,36 @@ CHANGE HISTORY
max_col 97
--------------

31.03.2024 5.0.0
ZDF_PageMenu: CacheTime für DictID (30 min), um Aktualisierung bei Favoriten
und Merkliste sicherzustellen, ergänzt mit url i.V.m. jsonpath zum Nachladen
von Startseiten (ZDF, ZDFtivi, ZDF-funk) durch ZDF_Rubriken, Anpassung
ZDF_Start (url=path), global HEADERS.
ZDF_Rubriken: CacheTime für DictID (30 min), url i.V.m. jsonpath=Fallback
bei Ausfall Dict (DictID), Param path -> jsonpath umbenannt, global HEADERS.
router: Dialoge für fehlende Funktionen und Module (z.B. bei alten Favoriten-
/Merklisteneinträgen).
ARDStartVideoHLSget (ARDnew): Param href vorbelegt (Absicherung gegen leere
Url in StreamArray).
GetContent (arte): in Mehr-Beiträgen json-keys für ID=Beitrag_Liste nach arte-
Änderung angepasst.
Modul Merkliste: für mydict_error (exception) nicht funktionierenden Dialog
ersetzt durch notification.
ARDStartRubrik: router-inkompatible Zeichen in Info-Text ersetzt - relevant
beim Hinzufügen von Serien zur Merkliste.
PlayVideo (util): if not live-Statement für Video-Startlist eingefügt - für
Aufrufe von ARDSportLiga3 relevant.
Zuletzt-gesehen-Liste: "gesehen bis .." in Info-Text ergänzt bei Videoabbruch.
url_check (util): Berücksichtigung leere Url bei Dialog.
Audio_get_homescreen: neuer Buttontitel NAVIGATION für Rubriken nach Highlights
(ARD-Änderung).
AudioSearch_cluster, Audio_get_search_cluster (Audiothek): Anpassungen an api-
Änderungen, Anlehnung der Ausgaben an Webseite, Korrektur falscher Anzahl in
api-Quelle (numberOfElements geringer möglich als tatsächliche Menge.
Audio_get_items_single: Url-Auswertung für Sammlungen (Themen) ergänzt.
Audio_get_sendung: Auswertung numberOfElements für nexturl korrigiert (Meta-
Bereich statt 1. node).

17.03.2024 4.9.9
Modul childs: neue Funktion tivi_Verpasst - Anpassung Main_TIVI, Nutzung
ZDF_VerpasstWoche, ZDF_get_content, neues Icon zdftivi-cal.png, Menü
Expand Down
2 changes: 1 addition & 1 deletion resources/lib/merkliste.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@
# Nutzung von save_merkliste)
#
def Watch_items(action, name, thumb='', Plot='', url=''):
PLog('Watch: ' + action)
PLog('Watch_items: ' + action)

url = unquote_plus(url)
PLog(unquote_plus(url)[100:]) # url in fparams zusätzlich quotiert
Expand Down
Loading

0 comments on commit de8521f

Please sign in to comment.