From d45dab547b7170b28fee5cc9ef7aa19fd1cb14e8 Mon Sep 17 00:00:00 2001 From: rols1 Date: Sat, 18 Jun 2022 15:32:24 +0200 Subject: [PATCH] =?UTF-8?q?=C3=84nderungen=20/=20Korrekturen=20siehe=20cha?= =?UTF-8?q?ngelog.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addon.xml | 2 +- ardundzdf.py | 645 +++++++++++++--------------- changelog.txt | 15 + resources/images/ard-sportschau.png | Bin 0 -> 11561 bytes resources/lib/ARDnew.py | 3 +- resources/lib/util.py | 5 +- 6 files changed, 331 insertions(+), 339 deletions(-) create mode 100644 resources/images/ard-sportschau.png diff --git a/addon.xml b/addon.xml index b2053b5..a7d2dde 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + diff --git a/ardundzdf.py b/ardundzdf.py index 8f44b3d..8b1113f 100644 --- a/ardundzdf.py +++ b/ardundzdf.py @@ -56,8 +56,8 @@ # VERSION -> addon.xml aktualisieren # 53 # Numerierung für Einzelupdate -VERSION = '4.4.0' -VDATE = '16.06.2022' +VERSION = '4.4.1' +VDATE = '18.06.2022' # (c) 2019 by Roland Scholz, rols1@gmx.de @@ -609,7 +609,7 @@ def InfoAndFilter(): if SETTINGS.getSetting('pref_strm') == 'true': title = u"strm-Tools" # Button für strm-Tools - tag = u"[B]strm-Tools - Details siehe Addon-Wicki[/B]" + tag = u"[B]strm-Tools - Details siehe Addon-Wicki auf Github[/B]" tag = u"%s\n\nAbgleichintervall in Stunden\nListen anzeigen\nListeneinträge löschen\n" % tag tag = u"%sMonitorreset\nstrm-Log anzeigen\nAbgleich einer Liste erzwingen\n" % tag tag = u"%sunterstützte Sender/Beiträge\nzu einem strm-Verzeichnis wechseln" % tag @@ -644,7 +644,7 @@ def InfoAndFilter(): title = u"Einzelupdate (Dateien und Module)" # Update von Einzeldateien tag = u'[B]Update einzelner, neuer Bestandteile des Addons vom Github-Repo %s[/B]' % REPO_NAME - tag = u"%s\n\nNach Abgleich werden neue Dateien heruntergeladen und ersetzen lokale Dateien im Addon." % tag + tag = u"%s\n\nNach Abgleich werden neue Dateien heruntergeladen - diese ersetzen lokale Dateien im Addon." % tag summ = u"Anstehende Einzelupdates werden im Forum kodinerds im Startpost des Addons angezeigt." fparams="&fparams={'PluginAbsPath': '%s'}" % PluginAbsPath addDir(li=li, label=title, action="dirList", dirID="resources.lib.EPG.update_single",\ @@ -2574,6 +2574,8 @@ def AudioPlayMP3(url, title, thumb, Plot, ID=''): #def ARDSportTable(path, title, table_path=''): #def ARDSportAudioStreamsSingle(title, path, img, tag, summ, ID): #def ARDSportPodcast(path, title): +#def ARDSportEventLive(path, page, title, oss_url='', url='', thumb='', Plot=''): +#def ARDSportSingleTab(title, path, img, page=''): #-------------------------------------------------------------------------------------------------- # Liste der ARD Audio Event Streams in livesenderTV.xml @@ -2590,6 +2592,8 @@ def ARDSportAudioXML(channel, img=''): # Bilder für ARD Sportschau, z.B. Moderatoren # Einzelnes Listitem in Video-Addon nicht möglich - s.u. # Slideshow: ZDF_SlideShow +# 17.06.2022 angepasst an Webänderungen +# def ARDSportBilder(title, path, img): PLog('ARDSportBilder:'); PLog(title); PLog(path) @@ -2606,15 +2610,16 @@ def ARDSportBilder(title, path, img): return li PLog(len(page)) - content = blockextract('class="teaser', page) + pos = page.find('_topline">Bilderstrecke<') + page = page[pos:] + cont = stringextract('data-v="', '"', page) # json-Inhalt (Bildstrecke.json) + cont = decode_url(cont) + cont = unescape(cont) + cont = (cont.replace('\\"','*').replace('','[B]').replace('','[/B]')) + PLog(cont[:30]) + + content = blockextract('"description"', cont) PLog(len(content)) - if len(content) == 0: - msg1 = 'Keine Bilder gefunden.' - PLog(msg1) - msg2 = 'Seite:' - msg3 = path - MyDialog(msg1, msg2, msg3) - return li fname = make_filenames(title) # Ablage: Titel + Bildnr fpath = os.path.join(SLIDESTORE, fname) @@ -2629,28 +2634,17 @@ def ARDSportBilder(title, path, img): MyDialog(msg1, msg2, '') return li - SBASE = 'https://www.sportschau.de' image = 0; background=False; path_url_list=[]; text_list=[] - for rec in content: - pos = rec.find('') # "Javascript-Fehler" entfernen - if pos > 0: - rec = rec[pos:] - + for rec in content: # größere Bilder erst auf der verlinkten Seite für einz. Moderator - img_src = stringextract('srcset="', '"', rec) # erste = größtes Bild - if img_src.startswith('//'): # //www1.wdr.de/.. - img_src = 'https:' + img_src - else: # /sendung/moderatoren/ - img_src = SBASE + img_src - if img_src == 'https://www.sportschau.de': - continue + img_src = stringextract('"l":"', '"', rec) # + if img_src == "": + img_src = stringextract('"m":"', '"', rec) - headline = stringextract('Fotostrecke:', '', '', rec) - summ = mystrip(summ); summ = unescape(summ); summ = cleanhtml(summ) - summ = repl_json_chars(summ) - title=summ.strip() + headline = stringextract('"title":"', '"', rec) + headline = unescape(headline); headline=repl_json_chars(headline) + summ = stringextract('"description":"', '"', rec) + PLog("summ: " + summ[:80]) if img_src: # Kodi braucht Endung für SildeShow; akzeptiert auch Endungen, die @@ -2662,7 +2656,6 @@ def ARDSportBilder(title, path, img): PLog("Bildtitel: " + title) title = unescape(title) lable = "%s: %s" % (title, headline) # Listing-Titel - summ = unescape(summ) thumb = '' local_path = os.path.abspath(local_path) @@ -2731,7 +2724,7 @@ def ARDSportBilder(title, path, img): # hier mit py2_decode # 22.12.2021 auch verwendet von list_WDRstreamlinks->WDRstream mit page (Livesender # WRD-Lokalzeit) -# +# 18.06.2022 ARDSportSingleTab als Fallback entfernt (nach Webänderung obsolet) def ARDSportVideo(path, title, img, summ, Merk='false', page=''): PLog('ARDSportVideo:'); PLog(path); PLog(summ); PLog(len(page)) @@ -2752,27 +2745,6 @@ def ARDSportVideo(path, title, img, summ, Merk='false', page=''): PLog(len(page)) page=py2_decode(page) - ''' - # Livestream-Problematik - # todo: für nächstes Großereignis anpassen - # s. Forum https://www.kodinerds.net/index.php/Thread/64244-RELEASE-Kodi-Addon-ARDundZDF Post 472ff - # Button ist Behelfslösung für Frauen-Fußball-WM - url via chrome-developer-tools ermittelt - # Button ist zusätzl. dauerhaft im Menü ARD Sportschau (Livestream 3) platziert. - if "/frankreich2019/live" in path: - url = "https://ndrspezial-lh.akamaihd.net/i/spezial_3@430237/master.m3u8" - summ = 'bitte die FRAUEN WM 2019 Livestreams testen, falls dieser nicht funktioniert' - mediatype = 'video' - url=py2_encode(url); title=py2_encode(title); img=py2_encode(img); summ=py2_encode(summ); - fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s', 'sub_path': '', 'Merk': '%s'}" %\ - (quote_plus(url), quote_plus(title), quote_plus(img), quote_plus(summ), Merk) - addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, - mediatype=mediatype, summary=summ) - xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) - ''' - - if path.endswith('/tokio2020/live/index.html'): # Sonderbehandlung Livestreams Paralympics - ARDSportEventLive(path, page, title) # für künft. Events prüfen (aktuell OK) - return # Bsp. video_src: "url":"http://deviceids-medp.wdr.de/ondemand/167/1673848.js"} # -> //ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master.m3u8 @@ -2793,7 +2765,7 @@ def ARDSportVideo(path, title, img, summ, Merk='false', page=''): if video_src == '': if 'class="media mediaA video' in page: # ohne Quellen, aber Videos gefunden - ARDSportSingleTab(title, path, img, page) # -> ARDSportSingleTab + ARDSportSingleTab(title, path, img, page) # -> ARDSportSingleTab - obsolet, s.o. return xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) @@ -2929,216 +2901,6 @@ def ARDSportVideo(path, title, img, summ, Merk='false', page=''): xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) - -#------------------------------------ -# 24.11.2021 bisher nur Fallback für ARDSportVideo (direkt): ohne Quellen, -# aber Videos vorhanden -# -def ARDSportSingleTab(title, path, img, page=''): - PLog('ARDSportSingleTab:') - - SBASE = 'https://www.sportschau.de' - sendungen = blockextract('class="teaser">', page) # video - PLog(len(sendungen)) - - li = xbmcgui.ListItem() - li = home(li, ID='ARD') # Home-Button - - mediatype='' - if SETTINGS.getSetting('pref_video_direct') == 'true': - mediatype='video' - - for s in sendungen: - if '"Javascript-Fehler"' in s: # Info Javascript-Fehler - continue - media = ARDSportgetMedia(s) # Audio, Video - markiert - if media == '': - PLog('ohne_Video_Audio:') - continue - - styp = media - path = stringextract('href="', '"', s) - if 'avascript:void(0)' in path: - continue - if path.startswith('http') == False: - path = SBASE + path - title = stringextract('data-pre-headline="', '"', s) - if title == '': - title = stringextract('title="', '"', s) # Altern. in href - title=repl_json_chars(title); - - img = stringextract('srcset="', '"', s) - img_txt = stringextract('title="', '"', s) - img_txt=unescape(img_txt); - - if img.startswith('//'): # z.B. //www1.wdr.de/.. - img = "https:" + img - if img.startswith('/'): # z.B. /regional/rbb/.. - img = SBASE + img - mediaDate = stringextract('mediaDate">', '<', s) - mediaDuration = stringextract('mediaDuration">', '<', s) - tag = img_txt - tag=styp - if mediaDate and mediaDuration: - tag = "%s | [B]%s | %s[/B]" % (tag,mediaDate, mediaDuration) - if img_txt: - tag = "%s\n\nBild: %s" % (tag, img_txt) - - summ = stringextract('teasertext">', '', s) - summ=mystrip(summ); summ=cleanhtml(summ); - summ = summ.replace(' | ', ''); summ=repl_json_chars(summ); - summ_par = summ.replace('\n', '||') - - PLog("Satz26:") - PLog(path); PLog(img); PLog(title); PLog(summ); - title=py2_encode(title) - path=py2_encode(path); img=py2_encode(img); summ_par=py2_encode(summ_par); - - fparams="&fparams={'path': '%s', 'title': '%s', 'img': '%s', 'summ': '%s'}" %\ - (quote(path), quote(title), quote(img), quote(summ_par)) - addDir(li=li, label=title, action="dirList", dirID="ARDSportVideo", fanart=img, thumb=img, - fparams=fparams, tagline=tag, summary=summ, mediatype=mediatype) - - xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) - - -#------------------------------------ -# Sonderbehandlung Livestreams Paralympics -# page (aktuell): https://tokio.sportschau.de/tokio2020/live/index.html - kein -# verwertbarer Inhalt (Streambezüge komplett js-generiert) -# pgm_id osslive100: Sportschau -# pgm_id osslive102: Einzelsendung -# 2. Durchlauf mit oss_url -> PlayVideo -# anpassen: path in ARDSportVideo -def ARDSportEventLive(path, page, title, oss_url='', url='', thumb='', Plot=''): - PLog('ARDSportEventLive:') - PLog(path); PLog(oss_url); - title_org=title - - if oss_url: # 2. Durchlauf - page, msg = get_page(path=oss_url) - if page == '': - msg1 = "Fehler in ARDSportEventLive" - msg2 = "%s nicht gefunden" % oss_url.split('/')[-1] - msg3 = msg - PLog(msg2) - MyDialog(msg1, msg2, msg3) - return - - url = stringextract('"_stream": "', '"', page) - tag, descr = Plot.split('||||') - PLog(url); PLog(tag); PLog(descr[:80]) - - li = xbmcgui.ListItem() - li = home(li, ID='ARD') # Home-Button - - img=py2_encode(thumb); Plot=py2_encode(Plot); - title=py2_encode(title); url=py2_encode(url); - - if SETTINGS.getSetting('pref_video_direct') == 'true': # or Merk == 'true': # Sofortstart - PLog('Sofortstart: ARDSportEventLive') - PLog(xbmc.getInfoLabel('ListItem.Property(IsPlayable)')) - PlayVideo(url=url, title=title, thumb=img, Plot=Plot) - #xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) - return - - if url.endswith('master.m3u8'): - li = Parseplaylist(li=li, url_m3u8=url, thumb=thumb, geoblock='', descr=Plot) - else: - fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" %\ - (quote_plus(url), quote_plus(title), quote_plus(img), quote_plus(Plot)) - addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, - tagline=tag, summary=descr) - xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) - return - - #------------------------------------------------------------------ # 1. Durchlauf - #img = "https://tokio.sportschau.de/tokio2020/olympiastadiontokio100_v-original.jpg" - # Bsp. path: "https://tokio.sportschau.de/tokio2020/live/index.html", - # path: "https://tokio.sportschau.de/tokio2020/paralympics/live/livestreams180.html" - # json-Inhalt für beide Beisp. identisch - base = "%s/live" % path.split('/live/')[0] - page, msg = get_page(path=base + "/lcconfig110-extappjson.json") # Liste zusätzl. json-Dateien - if page == '': - msg1 = "Fehler in ARDSportEventLive" - msg2 = "lcconfig110-extappjson.json nicht gefunden" - PLog(msg2) - MyDialog(msg1, msg2, '') - return - - url = stringextract('"additionalTitleClass":"","url":"', '"', page) # livestreams184-extappjson.json (channels) - url = base + url - page, msg = get_page(path=url) - if page == '': - msg1 = "Fehler in ARDSportEventLive" - msg2 = "%s nicht gefunden" % url.split('/')[-1] - PLog(msg2) - MyDialog(msg1, msg2, '') - return - - li = xbmcgui.ListItem() - li = home(li, ID='ARD') # Home-Button - - - channels = blockextract('"starttime":', page) # Beiträge - PLog(len(channels)) - # Bsp: "/paralympics/live/osslive102-ardjson_image-36c61add-66fc-4fd8-8050-126ef2095659.json": - oss_url_templ = base + "/paralympics/live/%s-ardjson_image-%s.json" - now = EPG.get_unixtime(onlynow=True) # akt. Zeit für Abgleich - now = int(now) - now_human = epgRecord.date_human("%Y.%m.%d_%H:%M:%S", now='') # Debug - PLog("now_human: " + now_human) - live_flag=False - for rec in channels: - start = stringextract('"starttime": ', ',', rec) # Unix-Time - end = stringextract('"endtime": ', ',', rec) # -"- - PLog("start, end: %s, %s" % (epgRecord.date_human("%Y.%m.%d_%H:%M:%S", now=start), - epgRecord.date_human("%Y.%m.%d_%H:%M:%S", now=end))) - start=int(start); end=int(end); - if end < now: # abgelaufen - continue - - datum = stringextract('"displaystartdate": "', '"', rec) - zeitstart = stringextract('"displaystarttime": "', '"', rec) - zeitende = stringextract('"displayendtime": "', '"', rec) - headline = stringextract('"headline": "', '"', rec) - sender = stringextract('"channel": "', '"', rec) - pgm_id = stringextract('"pgm_id": "', '"', rec) - descr = stringextract('"description": "', '"', rec) - img = base + stringextract('"displayimage": "', '"', rec) - image_uuid = stringextract('"displayimage_uuid": "', '"', rec) - mod = stringextract('"moderation": "', '"', rec) - if mod == '': - mod = stringextract('"reporter": "', '"', rec) - mod = mod.replace('\\t', '') # italic entf. - - title = repl_json_chars(headline); descr= repl_json_chars(descr) - if now >= start and now <= end: # Zeitabgleich für Titel - title = '[B] LIVE [/B] | %s' % (title) - live_flag=True - else: - title = '[B]%s[/B] | %s' % (datum, title) - - tag = '[B]Start: %s, %s[/B] | Ende: %s | %s' % (datum, zeitstart, zeitende, mod) - Plot = "%s||||%s" % (tag, descr) - oss_url = oss_url_templ % (pgm_id, image_uuid) - - PLog("Satz2:") - PLog(title); PLog(pgm_id); PLog(image_uuid); PLog(oss_url); PLog(Plot[:80]); - - img=py2_encode(img); Plot=py2_encode(Plot); - title=py2_encode(title); oss_url=py2_encode(oss_url); - - fparams="&fparams={'path': '', 'page': '', 'oss_url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" %\ - (quote(oss_url), quote(title), quote(img), quote(Plot)) - addDir(li=li, label=title, action="dirList", dirID="ARDSportEventLive", fanart=img, thumb=img, fparams=fparams, - tagline=tag, summary=descr) - - if live_flag == False: - icon = R("icon-info.png") - msg1 = "Derzeit keine Livestreams" - xbmcgui.Dialog().notification(msg1,'',icon,2000) - xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) #--------------------------------------------------------------------------------------------------- # Neues Menü sportschau.de (WDR) @@ -3180,8 +2942,19 @@ def ARDSportWDR(): addDir(li=li, label=title, action="dirList", dirID="ARDSportWDRCluster", fanart=img, thumb=img, fparams=fparams, tagline=tag) + title = u"Event: [B]Fußball WM 2022 in Katar[/B]" # Großevent + tag = u"" + cacheID = "Sport_WMKatar" + img = "https://images.sportschau.de/image/a12b67b2-9716-4be8-9462-79391892a4c2/AAABgRPCPcU/AAABgPp7Db4/16x9-1280/wm-katar-logo-sp-100.jpg" + path = "https://www.sportschau.de/fussball/fifa-wm-2022" + 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="ARDSportWDRCluster", fanart=img, thumb=img, + fparams=fparams, tagline=tag) + title = u"ARD Audio Event Streams" # Audio Event Streams im Haupt-PRG - tag = u"Events und Liste der Netcast-Streams" + tag = u"Event- und Netcast-Streams, Sport in der Audiothek, Audiostreams auf sportschau.de" img = R("radio-livestreams.png") fparams="&fparams={}" addDir(li=li, label=title, action="dirList", dirID="ARDAudioEventStreams", fanart=img, thumb=img, @@ -3327,82 +3100,82 @@ def ARDSportAudioStreams(title, path, img, cacheID): # Streamquellen im mediaplayer hinterlegt # def ARDSportMedia(li, title, page): - PLog('ARDSportMedia:') + PLog('ARDSportMedia: ' + title) + base = "https://www.sportschau.de" - items = blockextract('class="mediaplayer', page) - PLog(len(items)) + teaser_xs=[]; teaser_slider=[] + if "Livestreams" in title: + teaser = blockextract('class="teaser__media"', page) + else: + teaser = blockextract('class="teaser__media"', page) + teaser = teaser + blockextract('class="teaser__link"', page) + teaser_xs = blockextract('class="teaser-xs__link"', page) + teaser_slider = blockextract('class="teaser-slider', page) + + PLog(len(teaser)) + PLog(len(teaser_xs)) + PLog(len(teaser_slider)) + items = teaser + teaser_xs + teaser_slider if len(items) == 0: icon = R("ard-sportschau.png") msg1 = u"%s:" % title - msg2 = u'keine Videos/Audios gefunden' + msg2 = u'keine Videos/Audios/Bilder gefunden' xbmcgui.Dialog().notification(msg1,msg2,icon,2000,sound=True) - return 0 + return 0 + + mediatype='' # json.loads scheiterte in cont (char 360) - vermutl. vergessenes Komma: - cnt=0 - for item in items: - mp3_url=''; stream_url=''; live=False + cnt=0; skip_list=["dummy"] + for item in items: + player=''; live=False; title=''; mp3_url=''; stream_url=''; + img=''; tag=''; summ=''; Plot=''; player="text" + PLog(item[:60]) + title = stringextract('__headline">', '', 'Bilderstrecke<') >= 0: # Ausleitung Bildgalerie + if item.startswith('class="teaser__link'): + player = "pics" + url = stringextract('href="', '"', item) + skip_list.append(url) + if url.startswith("http") == False: + url = base + url + + tag = "[B]Bilderstrecke[/B]" + img = stringextract('src="', '"', item) + PLog("Satz12_pic:") + PLog(title); PLog(url); PLog(img); PLog(summ[:80]); + fparams="&fparams={'title': '%s', 'path': '%s', 'img': '%s'}" % (quote(title), + quote(url), quote(img)) + addDir(li=li, label=title, action="dirList", dirID="ARDSportBilder", fanart=img, thumb=img, + fparams=fparams, tagline=tag, summary=summ) + continue + #--------------------------------------------------- + if item.find('class="teaser-slider') >= 0: # Ausleitung Slider + player = "slider" + skip_list = ARDSportMediaSlider(li, item, skip_list) # -> addDir + if 'class="mediaplayer' in item == False: + continue + #--------------------------------------------------- - TimeDate=''; tag=''; - - if duration: - if duration == "0 sec": - duration = "unbekannt" - - chapter = stringextract('chapter1":"', '"', cont) - creator = stringextract('creator":"', '"', cont) - genre = stringextract('_genre":"', '"', cont) - - if player == "audio": - tag = "Audio" - else: - tag = "Video" - if live: - tag = "%s-Livestream" % tag - tag = "[B]%s[/B]" % tag - PLog("duration: " + duration) - if live == False and duration: - tag = "%s | Dauer %s" % (tag, duration) - - tag = "%s\n%s | %s | %s" % (tag, chapter, creator, genre) - - if summ: - tag = "%s\n\n%s" % (tag, summ) - Plot = tag.replace("\n", "||") + if item.find('class="mediaplayer') > 0: + if player != "pics": + data = stringextract('class="mediaplayer', '"MediaPlayer"', item) # von slider abgrenzen + if data: + player,live,title,mp3_url,stream_url,img,tag,summ,Plot = ARDSportMediaPlayer(li, data) + if title in skip_list: # Doppel in Blöcken möglich + continue + skip_list.append(title) + PLog("Satz12:") - PLog(player); PLog(title); PLog(mp3_url); PLog(stream_url); PLog(img); - PLog(summ[:80]); + PLog(player); PLog(live); PLog(title); PLog(mp3_url); PLog(stream_url); + PLog(img); PLog(summ[:80]); title=py2_encode(title); mp3_url=py2_encode(mp3_url); img=py2_encode(img); tag=py2_encode(tag); Plot=py2_encode(Plot); @@ -3419,18 +3192,220 @@ def ARDSportMedia(li, title, page): addDir(li=li, label=title, action="dirList", dirID="AudioPlayMP3", fanart=img, thumb=img, fparams=fparams, tagline=tag) if player == "video": - if live: # Video Livestream - fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" % (quote(stream_url), + fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" % (quote(stream_url), + quote(title), quote(img), quote_plus(Plot)) + addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, + tagline=tag, mediatype='mediatype') + + if player == "text": # Textbeiträge, Verbleib in Liste + if item.find('__headline"') < 0: # Kombi-Satz aus 2 Blöcken mögl. + continue + + img = stringextract('src="', '"', item) + label = stringextract("", "", item) + if "Audio" in label or "Podcast" in label or "Video" in label: # ähnlich ARDSportMediaSlider + url = stringextract('href="', '"', item) + if url.startswith("http") == False: + url = base + url + PLog("Satz12_xslink: %s, %s" % (title,url)) + title=py2_encode(title); url=py2_encode(url); + img=py2_encode(img); Plot=py2_encode(Plot); + tag = "weiter zum [B]%s[/B]-Beitrag" % label + fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" % (quote(url), quote(title), quote(img), quote_plus(Plot)) - addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, - tagline=tag, mediatype='music') + addDir(li=li, label=title, action="dirList", dirID="ARDSportSingle", fanart=img, thumb=img, fparams=fparams, + tagline=tag) else: - continue # ausbauen - + if img == "": # kann fehlen + img = R(ICON_DIR_FOLDER) + tag = "[B]ohne Videos, Audios, Bilder[/B]\nMehr auf sportschau.de.." + title = "[COLOR grey]%s[/COLOR]" % title + PLog("Satz12_text: %s" % title) + fparams="&fparams={}" + addDir(li=li, label=title, action="dirList", dirID="dummy", fanart=img, thumb=img, fparams=fparams, + tagline=tag, summary=Plot) + cnt = cnt + 1 return cnt +#---------------------------------------------------------------- +# Auswertung Mediaplayerdaten +# +def ARDSportMediaPlayer(li, item): + PLog('ARDSportMediaPlayer:') + player=''; live=False; title=''; mp3_url=''; stream_url=''; + img=''; tag=''; summ=''; Plot=''; + + cont = stringextract('data-v="', '"', item) # json-Inhalt zum Player + cont = decode_url(cont) + cont = unescape(cont) + cont = (cont.replace('\\"','*').replace('','[B]').replace('','[/B]')) + PLog(cont[:30]) + #if "xxx" in cont: + # RSave('/tmp/x1.json', py2_encode(cont)) # Debug + + player = stringextract('playerType":"', '"', cont) # audio, video + media = stringextract('streams":', '"meta"', cont) # für video dash.mpd, m3u8 + ts + if player == "audio": + mp3_url = stringextract('url":"', '"', media) # 1 x mp3 + else: + urls = blockextract('url":', media) + for url in urls: + if "index.m3u8" in url or "master.m3u8" in url: + stream_url = stringextract('url":"', '"', url) + break + + title = stringextract('page_title":"', ',"', cont) # kann " enthalten + title = repl_json_chars(title) + + duration = stringextract('durationSeconds":"', '"', cont) + if duration == '': + dur = stringextract('content_duration":', ',', cont) # Altern. außerhalb media (int, milli-secs) + PLog("dur_raw: " + dur) + try: + dur = int(dur) + duration = str(int(dur / 1000)) + except: + duration="" + PLog("duration: " + duration) + duration = seconds_translate(duration) + + imgs = blockextract('"minWidth":', cont, "}") + img = stringextract('value":"', '"', imgs[-1]) # letztes=größtes + mode = stringextract('_broadcasting_type":"', '"', cont) + if mode == "live": + live=True + + TimeDate=''; tag=''; + + if duration: + if duration == "0 sec": + duration = "unbekannt" + + chapter = stringextract('chapter1":"', '"', cont) + creator = stringextract('creator":"', '"', cont) + genre = stringextract('_genre":"', '"', cont) + + if player == "audio": + tag = "Audio" + else: + tag = "Video" + if live: + tag = "%s-Livestream" % tag + tag = "[B]%s[/B]" % tag + PLog("duration: " + duration) + if live == False and duration: + tag = "%s | Dauer %s" % (tag, duration) + + tag = "%s\n%s | %s | %s" % (tag, chapter, creator, genre) + + if summ: + tag = "%s\n\n%s" % (tag, summ) + Plot = tag.replace("\n", "||") + + return player, live, title, mp3_url, stream_url, img, tag, summ, Plot + +#---------------------------------------------------------------- +# Auswertung Slider-Beiträge mit json-Bereich +# +def ARDSportMediaSlider(li, item, skip_list): + PLog('ARDSportMediaSlider:') + base = "https://www.sportschau.de" + player=''; live=False; title=''; mp3_url=''; stream_url=''; + img=''; tag=''; summ=''; Plot=''; + + cont = stringextract('data-v="', '"', item) # json-Inhalt zum Player + cont = decode_url(cont) + cont = unescape(cont) + cont = (cont.replace('\\"','*').replace('','[B]').replace('','[/B]')) + PLog(cont[:80]) + #RSave('/tmp/x7.json', py2_encode(cont)) # Debug + + content = blockextract('"teaserUrl"', cont) + PLog(len(content)) + + for rec in content: + label = stringextract('label":"', '"', rec) # audio, video, podcast + + url = stringextract('teaserUrl":"', '"', rec) + if url.startswith('http') == False: + url = base + url + topline = stringextract('topline":"', '"', rec) + title = stringextract('headline":"', '"', rec) + if title in skip_list: + continue + skip_list.append(title) + + + img = stringextract('imageUrl":"', '"', rec) + alt = stringextract('alttext":"', '"', rec) + cr = stringextract('copyright":"', '"', rec) + + summ = "[B]%s[/B] | %s | %s " % (topline, alt, cr) + + PLog("Satz12_slider:") + PLog(label); PLog(title); PLog(topline);PLog(url);PLog(img);PLog(alt);PLog(cr); + title=py2_encode(title); url=py2_encode(url); + img=py2_encode(img); Plot=py2_encode(Plot); + if "audio" in label or "podcast" in label or "video" in label: + tag = "weiter zum [B]%s[/B]-Beitrag" % label + fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" % (quote(url), + quote(title), quote(img), quote_plus(Plot)) + addDir(li=li, label=title, action="dirList", dirID="ARDSportSingle", fanart=img, thumb=img, fparams=fparams, + tagline=tag) + else: # nur Textinhalte + tag = "[B]ohne Videos, Audios, Bilder[/B]\nMehr auf sportschau.de.." + title = "[COLOR grey]%s[/COLOR]" % title + PLog("Satz12_slider_text: %s" % title) + fparams="&fparams={}" + addDir(li=li, label=title, action="dirList", dirID="dummy", fanart=img, thumb=img, fparams=fparams, + tagline=tag, summary=summ) + + return skip_list + +#---------------------------------------------------------------- +# Auswertung Slider-Beiträge mit json-Bereich +# +def ARDSportSingle(url, title, thumb, Plot): + PLog('ARDSportSingle: ' + title) + PLog(url) + CacheTime = 60 * 60 # 1 Std. + cacheID=url.split("/")[-1] + + li = xbmcgui.ListItem() + li = home(li, ID='ARD') # Home-Button + + page = Dict("load", cacheID, CacheTime=CacheTime) + if page == False or page == '': # Cache miss od. leer - vom Sender holen + page, msg = get_page(path=url) + if page: + Dict("store", cacheID, page) # Seite -> Cache: aktualisieren + if page == '': + msg1 = "Fehler in ARDSportSingle" + msg2 = 'Seite kann nicht geladen werden.' + msg3 = msg + MyDialog(msg1, msg2, msg3) + return + + mediatype="" + item = stringextract('class="mediaplayer', '"MediaPlayer"', page) # erster json-Bereich + player,live,title,mp3_url,stream_url,img,tag,summ,Plot = ARDSportMediaPlayer(li, item) + + if player == "audio": + ID="ARD" # ID Home-Button + fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s', 'ID': '%s'}" % (quote(mp3_url), + quote(title), quote(img), quote_plus(Plot), ID) + addDir(li=li, label=title, action="dirList", dirID="AudioPlayMP3", fanart=img, thumb=img, + fparams=fparams, tagline=tag) + if player == "video": + fparams="&fparams={'url': '%s', 'title': '%s', 'thumb': '%s', 'Plot': '%s'}" % (quote(stream_url), + quote(title), quote(img), quote_plus(Plot)) + addDir(li=li, label=title, action="dirList", dirID="PlayVideo", fanart=img, thumb=img, fparams=fparams, + tagline=tag, mediatype='mediatype') + + xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True) + # ---------------------------------------- Ende ARD Sportschau.de --------------------------------- #################################################################################################### # Aufrufer: Main diff --git a/changelog.txt b/changelog.txt index dd2386c..10501cf 100644 --- a/changelog.txt +++ b/changelog.txt @@ -10,6 +10,21 @@ CHANGE HISTORY max_col 97 -------------- +18.06.2022 4.4.1 + decode_url (Modul util): weitere Ersetzungen für Audiostreams sportschau.de. + ARDAudioEventStreams: Button "aktuelle Livestreams (sportschau.de)" entfernt + (keine Audios), Button Audiostreams angepasst (Audios, keine Livestreams). + ARDSportAudioStreams: Anpassungen an Webänderungen für audio- und netcast- + Streams sportschau.de. + Neuauflage Sportschau.de: neue Funktionen ARDSportAudioStreams, ARDSportMedia, + ARDSportWDR, ARDSportWDRLive, ARDSportSingle, + ARD-Livestream + inputstream.adaptive: startet 2-Std. zu früh - Startposition + manuell korrigiert (wie in V4.3.8 für UT-Livestream der ARD). Zusätzlich + Wartezeit zwischen Start des Kodi-Players und manueller Seek-Korrektur auf + 1 Sekunde verdoppelt. + Menü-Zusatz "NEU" bzw. "(neu)" entfernt: ARD Mediathek, ARD Audiothek, ARD + Sport. + 12.06.2022 4.4.0 Überarbeitung PLAYLIST-Modul Parseplaylist: Param. live hinzugefügt zur Unterscheidung bei Mehrkanal- Streams mit '#EXT-X-MEDIA' (live=True + skip=False: Einzelauflösungen) diff --git a/resources/images/ard-sportschau.png b/resources/images/ard-sportschau.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c20a698f700afe016cce3f8f4e6371bba7785f GIT binary patch literal 11561 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�w!i|;GCPPJP9AU7M=L5;80hZ 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 literal 0 HcmV?d00001 diff --git a/resources/lib/ARDnew.py b/resources/lib/ARDnew.py index 304db9d..002df46 100644 --- a/resources/lib/ARDnew.py +++ b/resources/lib/ARDnew.py @@ -202,12 +202,11 @@ def Main_NEW(name='', CurSender=''): fanart=R(ICON_MAIN_ARD), thumb=R(ICON_ARD_AZ), tagline=tag, fparams=fparams) title = 'ARD Sport' - tag = u"einschließlich: WDR sportschau.de (Auszüge)" summ = sender_summ img = R("ard-sport.png") fparams="&fparams={}" addDir(li=li, label=title, action="dirList", dirID="resources.lib.ARDnew.ARDSportneu", - fanart=img, thumb=img, fparams=fparams, tagline=tag, summary=summ) + fanart=img, thumb=img, fparams=fparams, summary=summ) # ARD Sportschau nach Web-Änderung abgeschaltet - s. Forum Post vom 12.06.2022 # Ausgesuchte Inhalte sportschau.de in ARDSportWDR diff --git a/resources/lib/util.py b/resources/lib/util.py index aa99550..12ccf82 100644 --- a/resources/lib/util.py +++ b/resources/lib/util.py @@ -1427,7 +1427,8 @@ def repl_json_chars(line): # für json.loads (z.B.. in router) json-Zeichen in l for r in ((u'"', u''), (u'\\', u''), (u'\'', u'') , (u'&', u'und'), ('(u', u'<'), (u'(', u'<'), (u')', u'>'), (u'∙', u'|') , (u'„', u'>'), (u'“', u'<'), (u'”', u'>'),(u'°', u' Grad'), (u'u00b0', u' Grad') - , (u'\r', u''), (u'#', u'*'), (u'u003e', u''), (u'❤', u'love')): # u'u003e' -> u'®' + , (u'\r', u''), (u'#', u'*'), (u'u003e', u''), (u'❤', u'love') # u'u003e' -> u'®' + , (u'%C3%A9', u'é')): line_ret = line_ret.replace(*r) return line_ret @@ -1638,6 +1639,8 @@ def decode_url(line): line = line.replace(u'%28', u'(') line = line.replace(u'%29', u')') + line = line.replace(u'%7C', u'|') + return line #---------------------------------------------------------------- # Migration PY2/PY3: py2_decode aus kodi-six