From 1bd0705d32278d220ee034523c574275f29be3b8 Mon Sep 17 00:00:00 2001 From: rols1 Date: Sun, 29 Oct 2023 10:48:52 +0100 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 | 60 +++++++++++++++-------- changelog.txt | 21 +++++++- resources/images/tv-livestreams.png | Bin 6748 -> 2926 bytes resources/images/tv-livestreams_grey.png | Bin 0 -> 2926 bytes resources/lib/EPG.py | 50 +++++++++---------- resources/lib/util.py | 57 ++++++++++++--------- 7 files changed, 118 insertions(+), 72 deletions(-) create mode 100644 resources/images/tv-livestreams_grey.png diff --git a/addon.xml b/addon.xml index 5b2dd40..a9f1a61 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + diff --git a/ardundzdf.py b/ardundzdf.py index 69c6d06..8833ea5 100644 --- a/ardundzdf.py +++ b/ardundzdf.py @@ -56,9 +56,9 @@ # +++++ ARDundZDF - Addon Kodi-Version, migriert von der Plexmediaserver-Version +++++ # VERSION -> addon.xml aktualisieren -# 154 # Numerierung für Einzelupdate -VERSION = '4.8.7' -VDATE = '23.10.2023' +# 155 # Numerierung für Einzelupdate +VERSION = '4.8.8' +VDATE = '29.10.2023' # (c) 2019 by Roland Scholz, rols1@gmx.de @@ -551,10 +551,10 @@ def Main(): # freischalten nach Posting im Kodi-Forum tag = '[B]Infos, Tools und Filter zu diesem Addon[/B]' # Menü Info + Tools - summ= u'- Ausschluss-Filter bearbeiten (nur für Beiträge von ARD und ZDF)' + summ= u'- Ausschluss-Filter bearbeiten' summ= u"%s\n- Merkliste bereinigen" % summ - summ= u'%s\n- Suchwörter bearbeiten (nur für die gleichzeitige Suche in ARD Mediathek und ZDF Mediathek)' % summ - + summ= u'%s\n- Suchwörter bearbeiten' % summ + summ= u'%s\n- Refresh TV-Livestream-Quellen' % summ summ = "%s\n-%s" % (summ, "Download- und Aufnahme-Tools") if SETTINGS.getSetting('pref_strm') == 'true': summ = "%s\n-%s" % (summ, "strm-Tools") @@ -643,6 +643,14 @@ def InfoAndFilter(): addDir(li=li, label=title, action="dirList", dirID="resources.lib.tools.SearchWordTools", fanart=R(FANART), thumb=R('icon_searchwords.png'), tagline=tag, fparams=fparams) + title = u"Refresh: Addon-Cache für TV-Livestream-Quellen" + ays = int(SETTINGS.getSetting('pref_tv_store_days')) + tag = u"ARD- und ZDF-TV-Livestream-Quellen aktualisieren.\n" + tag = u"%sDas eingestellte Setting ([B]%s Tage[/B]) bleibt unverändert" % (tag, days) + fparams="&fparams={}" + addDir(li=li, label=title, action="dirList", dirID="refresh_streamlinks", + fanart=R(FANART), thumb=R('tv-livestreams_grey.png'), tagline=tag, fparams=fparams) + # hier ohne Abhängigkeit vom Setting pref_use_downloads: tagline = u'[B]Downloads und Aufnahmen[/B]\n\nVerschieben, Löschen, Ansehen, Verzeichnisse bearbeiten' fparams="&fparams={}" @@ -1180,7 +1188,7 @@ def ZDF_Teletext_Table(li, body, aktpg): for i, hl in enumerate(html_lines[2:]): # ab Zeile 2 line=""; h1=""; left=""; leftp=""; center=""; right="" hl = hl.strip() - PLog("%d. %s" %(i, hl)) + PLog("%d. %s" %(i, hl[:80])) if hl.startswith('

'): line = stringextract('

', '', '

', hl) lines.append(cleanhtml(h2)) continue - if hl.startswith('

'): # Einzelzeile - txt = stringextract('copy" >', '

', hl) - lines.append(cleanhtml(txt)) + if hl.startswith('

'): # Tochterzeile o. Link + pre_line = lines[len(lines)-1] + PLog("pre_line: " + pre_line); + new_line = cleanhtml(hl).rjust(len(pre_line)-5, ' ') + PLog("pre_line: %s" % pre_line) + PLog("new_line: %s" % new_line) + lines.append(new_line) continue + if hl.startswith(" Highlights s. Step 2 / pers. Inhalte continue @@ -4912,6 +4925,12 @@ def test_downloads(li,download_list,title_org,summary_org,tagline_org,thumb,high Format = 'Podcast ' else: Format = 'Video ' # .mp4, .webm, .. + if url.endswith('.aac') and "/event" in url: # z.B. liveradio.swr.de + msg1 = u"vermutlich Livestream - Download nicht möglich!" + msg2 = title_org + MyDialog(msg1, msg2, "") + return + #lable = 'Download ' + Format + ' | ' + quality lable = 'Download' + ' | ' + quality # 09.01.2021 Wegfall Format aus Platzgründen dest_path = SETTINGS.getSetting('pref_download_path') @@ -6743,8 +6762,7 @@ def EPG_ShowSingle(ID, name, stream_url, pagenr=0): MyDialog(msg1, msg2, '') return li - today_human = 'ab ' + EPG_rec[0][7] - + today_human = 'ab ' + EPG_rec[0][7] for rec in EPG_rec: href=rec[1]; img=rec[2]; sname=rec[3]; stime=rec[4]; summ=rec[5]; vonbis=rec[6]; starttime=rec[0]; endtime=rec[8]; @@ -6762,7 +6780,7 @@ def EPG_ShowSingle(ID, name, stream_url, pagenr=0): summ = "[B]LAUFENDE SENDUNG![/B]\n\n%s" % summ title = sname PLog("title: " + title) - tagline = 'Zeit: ' + vonbis + tagline = 'Datum: %s\nZeit: %s' % (today_human, vonbis) descr = summ.replace('\n', '||') # \n aus summ -> || title=py2_encode(title); stream_url=py2_encode(stream_url); img=py2_encode(img); descr=py2_encode(descr); @@ -6776,7 +6794,7 @@ def EPG_ShowSingle(ID, name, stream_url, pagenr=0): max = 12 pagenr = int(pagenr) + 1 if pagenr < max: - summ = u'nächster Tag' + summ = u'nächster Tag (%d von %d)' % (pagenr+1, max) name=py2_encode(name); stream_url=py2_encode(stream_url); fparams="&fparams={'ID': '%s', 'name': '%s', 'stream_url': '%s', 'pagenr': %s}" % (ID, quote(name), quote(stream_url), pagenr) @@ -7055,7 +7073,7 @@ def SenderLiveListe(title, listname, fanart, offset=0, onlySender=''): # -- # Cache - PLog('Mark2') + PLog('Mark2:') # Spezialbehandlung für N24 in SenderLiveResolution - Test auf Verfügbarkeit der Lastserver (1-4) # EPG: ab 10.03.2017 einheitlich über Modul EPG.py (vorher direkt bei den Sendern, mehrere Schemata) # @@ -7917,7 +7935,8 @@ def ZDF_PageMenu(DictID, jsonObject="", urlkey="", mark="", li="", homeID=""): # skip: personalisierten Inhalte, Addon-Menüs: skip_list = ['Alles auf einen Blick', u'Das könnte Dich', 'Direkt zu', - 'Mein Programm', 'Deine', 'KiKA live sehen', 'Weiterschauen' + 'Mein Programm', 'Deine', 'KiKA live sehen', 'Weiterschauen', + 'Mehr zu funk' ] skip=False if title == '': @@ -9816,8 +9835,9 @@ def build_Streamlists_buttons(li,title_org,thumb,geoblock,Plot,sub_path,\ return played_direct #------------------------- -# HBBTV Videoquellen (nur ZDF) +# HBBTV-MP4 Videoquellen (nur ZDF) # 17.05.2023 Auswertung vorerst nur "main"|"deu" und "ad"|"deu" +# mit MP4-Links (s. form_list) # ähnlich in m3satSourcesHBBTV (["vidurls"] statt ["streams"]) # 23.10.2023 Ausfilterung DGS bei Sofortstart (ungeeignet für # Sortierung in PlayVideo_Direct). diff --git a/changelog.txt b/changelog.txt index 9752f51..e61fa2a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -10,6 +10,25 @@ CHANGE HISTORY max_col 97 -------------- +29.10.2023 4.8.8 + ARDSportLiga3: Python2-Anpassung (py2_encode für ard_streamlinks, sender1, + sender2, ohne Bearbeitung der Umlaute). + ZDF-HBBTV: Kennzeichnung DGS-Streams - Anpassung ZDFSourcesHBBTV + test_downloads: Verhinderung Downloads bei Livestreams (Bsp. Audiothek: + liveradio.swr.de/../play.aac). + Audiothek: Login-Banner ausgefiltert im Menü Entdecken. + EPG via Kontextmenü (Modul EPG): unvollständige Daten und Exceptions + abgefangen (index-error). + ZDF_PageMenu: Menü 'Mehr zu funk' ausgeblendet (-> skip_list), Links + verweisen auf www.funk.net/ und presse.funk.net/ (nicht mehr unterstützt). + Infos + Tools: zusätzl. Button "Refresh: Addon-Cache für TV-Livestream-Quellen", + neue Funktion refresh_streamlinks(util), Anpassungen in get_*streamlinks neues + Icon tv-livestreams_grey.png + EPG: Prüfung Codeverbesserung (Ablage xml-Format vs. 2-Dim-Array) - negativ, + relativ lange Ladedauer wg. 12-Tage-EPG für Recording. Wicki aktualisiert + (Seite 01 Zif.5 und 5.1, Seite 04 Zif. 9). + EPG_ShowSingle: akt. Datum in Info-Text eingefügt. + 22.10.2023 4.8.7 time_translate (util): Mitnutzung durch ShowSeekPos (add_hour_only=True). Sendungsnavigation im Zeitpuffer bei ARD-Livestreams (util): neue Funktionen @@ -27,7 +46,7 @@ CHANGE HISTORY time_translate (util): "Noch %s Stunden!" -> "NOCH %s Stunden!", Warnspanne von 6 auf 7 vergrößert (Nutzung durch ARDSportLiga3). SearchARDundZDFnew (ARDnew): Auswertung Suchergebnis '0' statt ''. - + 08.10.2023 4.8.6 AudioStartLive (Audiothek): py2_decode(Plot) - relevant für PYTHON2. time_translate (Modul util): re.search-Code für Verfügbarkeitswarnung ver- diff --git a/resources/images/tv-livestreams.png b/resources/images/tv-livestreams.png index db331ead26d12b7f7e2a5e04a028f2da58c9c628..7fb9718d79b8bb8371e6d2af71b54cb2705a0aa1 100644 GIT binary patch literal 2926 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 VipZs-@}C&MaP`^q>u%P`e*=_|fvx}m literal 0 HcmV?d00001 diff --git a/resources/lib/EPG.py b/resources/lib/EPG.py index eb26666..816d392 100644 --- a/resources/lib/EPG.py +++ b/resources/lib/EPG.py @@ -11,7 +11,7 @@ # # 20.11.2019 Migration Python3 Modul kodi_six + manuelle Anpassungen # 11 # Numerierung für Einzelupdate -# Stand: 23.10.2023 +# Stand: 28.10.2023 # from kodi_six import xbmc, xbmcgui, xbmcaddon @@ -89,7 +89,7 @@ def thread_getepg(EPGACTIVE, DICTSTORE, PLAYLIST): PLog("EPG_%s noch aktuell" % ID) if os.path.exists(fname) == False: # n.v. oder soeben entfernt - rec = EPG(ID=ID, load_only=True) # Seite laden + rec = EPG(ID=ID, load_only=True) # Seite laden + speichern xbmc.sleep(1000) # Systemlast verringern xbmcgui.Dialog().notification("EPG-Download", "abgeschlossen",icon,3000) @@ -298,8 +298,9 @@ def update_single(PluginAbsPath): # mode: falls 'OnlyNow' dann JETZT-Sendungen # day_offset: 1,2,3 ... Offset in Tagen (Verwendung zum Blättern in EPG_ShowSingle) # Aufruf: EPG_ShowAll (Haupt-PRG), thread_getepg +# def EPG(ID, mode=None, day_offset=None, load_only=False): - PLog('EPG ID: ' + ID) + PLog('EPG_ID: ' + ID) PLog(mode) CacheTime = 43200 # 12 Std.: (60*60)*12 url="http://www.tvtoday.de/programm/standard/sender/%s.html" % ID @@ -307,15 +308,13 @@ def EPG(ID, mode=None, day_offset=None, load_only=False): PLog(url) page = Dict("load", Dict_ID, CacheTime=CacheTime) - if page == False: # Cache miss - vom Server holen + if page == False: # Cache miss - vom Server holen page, msg = get_page(path=url) - pos = page.find('tv-show-container js-tv-show-container') # ab hier relevanter Inhalt + pos = page.find('tv-show-container js-tv-show-container') # ab hier relevanter Inhalt page = page[pos:] - Dict("store", Dict_ID, page) # Seite -> Cache: aktualisieren + Dict("store", Dict_ID, page) # Seite -> Cache: aktualisieren # PLog(page[:500]) # bei Bedarf - pos = page.find('tv-show-container js-tv-show-container') # ab hier relevanter Inhalt - page = page[pos:] PLog(len(page)) if load_only: return '' @@ -339,10 +338,10 @@ def EPG(ID, mode=None, day_offset=None, load_only=False): # PLog("neuer Satz:") EPG_rec = [] for i in range (len(liste)): # ältere + jüngere Sendungen in Liste - daher Schleife + Zeitabgleich - # PLog(liste[i]) # bei Bedarf + # PLog(liste[i]) # bei Bedarf rec = [] starttime = stringextract('data-start-time=\"', '\"', liste[i]) # Sendezeit, Bsp. "1488827700" (UTC) - if starttime == '': # Ende (Impressum) + if starttime == '': # Ende (Impressum) break endtime = stringextract('data-end-time=\"', '\"', liste[i]) # Format wie starttime href = stringextract('href=\"', '\"', liste[i]) # wenig zusätzl. Infos @@ -353,25 +352,25 @@ def EPG(ID, mode=None, day_offset=None, load_only=False): sname = unescape(sname) stime = stringextract('class=\"h7 time\">', '

', liste[i]) # Format: 06:00 stime = stime.strip() - summ = get_summ(liste[i]) # Beschreibung holen + summ = get_summ(liste[i]) # Beschreibung holen summ = unescape(summ) - sname = stime + ' | ' + sname # Titel: Bsp. 06:40 | Nachrichten + sname = stime + ' | ' + sname # Titel: Bsp. 06:40 | Nachrichten - s_start = datetime.datetime.fromtimestamp(int(starttime)) # Zeit-Konvertierung UTC-Startzeit - s_startday = s_start.strftime("%A") # Locale’s abbreviated weekday name + s_start = datetime.datetime.fromtimestamp(int(starttime)) # Zeit-Konvertierung UTC-Startzeit + s_startday = s_start.strftime("%A") # Locale’s abbreviated weekday name von = stime bis = datetime.datetime.fromtimestamp(int(endtime)) bis = bis.strftime("%H:%M") vonbis = von + '-' + bis - # PLog("diff_%d: %s, %s-%s" % (i, now, starttime, endtime)) # bei Bedarf + # PLog("diff_%d: %s, %s-%s" % (i, now, starttime, endtime)) # bei Bedarf # Auslese - nur akt. Tag 05 Uhr (einschl. Offset in Tagen ) + Folgetag 05 Uhr: - if starttime < today_5Uhr: # ältere verwerfen + if starttime < today_5Uhr: # ältere verwerfen # PLog(starttime); PLog(nextday_5Uhr) continue - if starttime > nextday_5Uhr: # jüngere verwerfen + if starttime > nextday_5Uhr: # jüngere verwerfen # PLog(starttime); PLog(nextday_5Uhr) continue @@ -379,17 +378,17 @@ def EPG(ID, mode=None, day_offset=None, load_only=False): if now >= starttime and now < endtime: # PLog("diffnow_%d: %s, %s-%s" % (i, now, starttime, endtime)) # bei Bedarf # Farb-/Fettmarkierung bleiben im Kontextmenü erhalten (addDir): - sname = "[B]JETZT: %s[/B]" % sname_org # JETZT: fett - PLog(sname); PLog(img) # bei Bedarf - if mode == 'OnlyNow': # aus EPG_ShowAll - nur aktuelle Sendung - rec = [starttime,href,img,sname,stime,summ,vonbis] # Index wie EPG_rec + sname = "[B]JETZT: %s[/B]" % sname_org # JETZT: fett + PLog(sname); PLog(img) + if mode == 'OnlyNow': # aus EPG_ShowAll - nur aktuelle Sendung + rec = [starttime,href,img,sname,stime,summ,vonbis] # Index wie EPG_rec # PLog(rec) PLog('EPG_EndOnlyNow') - return rec # Rest verwerfen - Ende + return rec # Rest verwerfen - Ende iWeekday = transl_wtag(s_startday) - sname = iWeekday[0:2] + ' | ' + sname # Wochentag voranstellen - if endtime < now: # vergangenes: grau markieren + sname = iWeekday[0:2] + ' | ' + sname # Wochentag voranstellen + if endtime < now: # vergangenes: grau markieren sname = "[COLOR grey][B]%s[/B][/COLOR]" % sname_org # Indices EPG_rec: 0=starttime, 1=href, 2=img, 3=sname, 4=stime, 5=summ, 6=vonbis, @@ -398,8 +397,7 @@ def EPG(ID, mode=None, day_offset=None, load_only=False): rec.append(starttime);rec.append(href); rec.append(img); rec.append(sname); # Listen-Element rec.append(stime); rec.append(summ); rec.append(vonbis); rec.append(today_human); rec.append(endtime) - EPG_rec.append(rec) - # Liste Gesamt (2-Dim-Liste) + EPG_rec.append(rec) # Liste Gesamt (2-Dim-Liste) EPG_rec.sort() # Sortierung PLog(len(EPG_rec)); PLog('EPG_End') diff --git a/resources/lib/util.py b/resources/lib/util.py index 5bc87ea..c650279 100644 --- a/resources/lib/util.py +++ b/resources/lib/util.py @@ -11,8 +11,8 @@ # 02.11.2019 Migration Python3 Modul future # 17.11.2019 Migration Python3 Modul kodi_six + manuelle Anpassungen # -# 75 # Numerierung für Einzelupdate -# Stand: 25.10.2023 +# 76 # Numerierung für Einzelupdate +# Stand: 28.10.2023 # Python3-Kompatibilität: from __future__ import absolute_import @@ -2536,6 +2536,16 @@ def get_summary_pre(path,ID='ZDF',skip_verf=False,skip_pubDate=False,page='',pat return summ #----------------------------------------------- +# aktualisiert die TV-Livestream-Quellen unabhängig +# vom Setting +# Aufruf: InfoAndFilter +def refresh_streamlinks(): + PLog('refresh_streamlinks:') + get_ARDstreamlinks(skip_log=True, force=True) + get_ZDFstreamlinks(skip_log=True, force=True) + get_IPTVstreamlinks(skip_log=True, force=True) + return +#----------------------------------------------- # ARD-Links s. get_ARDstreamlinks # Sender: ZDF, ZDFneo, 3sat, Phoenix, KiKA, ZDFinfo. # @@ -2556,15 +2566,15 @@ def get_summary_pre(path,ID='ZDF',skip_verf=False,skip_pubDate=False,page='',pat # Mehrkanal-Streamlinks seit Aug. 2020 - die enth. Audiolinks in # Kodi nicht getrennt verwertbar. #----------------------------------------------- -def get_ZDFstreamlinks(skip_log=False): +def get_ZDFstreamlinks(skip_log=False, force=False): PLog('get_ZDFstreamlinks:') - PLog(skip_log) + PLog(skip_log); PLog(force) days = int(SETTINGS.getSetting('pref_tv_store_days')) PLog("days: %d" % days) CacheTime = days*86400 # Default 1 Tag #days=0 # Debug - if days: # skip CacheTime=0 + if days and force == False: # skip CacheTime=0 page = Dict("load", 'zdf_streamlinks', CacheTime=CacheTime) if len(str(page)) > 100: # bei Error nicht leer od. False von Dict if skip_log == False: @@ -2642,16 +2652,16 @@ def get_ZDFstreamlinks(skip_log=False): # 01.12.2021 erweitert um Liste für Untertitel-Links # 17.02.2021 Auswertung publicationService/name statt # longTitle -def get_ARDstreamlinks(skip_log=False): +def get_ARDstreamlinks(skip_log=False, force=False): PLog('get_ARDstreamlinks:') - PLog(skip_log) + PLog(skip_log); PLog(force) days = int(SETTINGS.getSetting('pref_tv_store_days')) PLog("days: %d" % days) - CacheTime = days*86400 # Default 1 Tag + CacheTime = days*86400 # Default 1 Tag #days=0 # Debug ID = "ard_streamlinks" - if days: # skip CacheTime=0 + if days and force == False: # skip CacheTime=0 page = Dict("load", ID, CacheTime=CacheTime) page = py2_encode(page) @@ -2712,16 +2722,16 @@ def get_ARDstreamlinks(skip_log=False): # holt Details von githubs iptv-Listen, falls # livesenderTV.xml den Tag IPTVSource enthält # -def get_IPTVstreamlinks(skip_log=False): +def get_IPTVstreamlinks(skip_log=False, force=False): PLog('get_IPTVstreamlinks:') - PLog(skip_log) + PLog(skip_log); PLog(force) days = int(SETTINGS.getSetting('pref_tv_store_days')) PLog("days: %d" % days) CacheTime = days*86400 # Default 1 Tag #days=0 # Debug ID = "iptv_streamlinks" - if days: # skip CacheTime=0 + if days and force == False: # skip CacheTime=0 page = Dict("load", ID, CacheTime=CacheTime) page = py2_encode(page) @@ -3746,10 +3756,10 @@ def open_addon(addon_id, cmd): return #---------------------------------------------------------------- -# Zeigt Abspielposition inputstream.adaptive als Zeitangabe -# Keine Beschränkung auf HLS-Videos +# Zeigt bei Livestreams die Abspielposition von inputstream.adaptive +# als Zeitangabe # Aufruf: PlayAudio (direkt, indirekt) -# Player vor Aufruf bereits aktiviert (s. Player_Subtitles:) +# Player vor Aufruf bereits aktiviert (s. PlayAudio->Player_Subtitles:) # notification-Aufruf zu ungenau für float-Werte. # ZDF-Werte beim Start: # Pufferanzeige: Wert1 / Wert2 -> @@ -3786,10 +3796,9 @@ def open_addon(addon_id, cmd): # diese Streams korrekt am Pufferende, puffern dann aber in der # waitForAbort-Schleife endlos. Dabei geben sie korrekte play_time- und # TotalTime-Werte zurück und verhindern so die Buffering-Erkennung. -# Gibt man vor der Schleife einige Sek. -# Sync-Zeit, fallen sie auf TotalTime 1 od. 2 zurück - praktisch wird -# ein korrekter Start angetäuscht. -# Dieses Streams hier nicht zugelassen (live=""). +# Gibt man vor der Schleife einige Sek. Sync-Zeit, fallen sie auf +# TotalTime 1 od. 2 zurück - praktisch wird ein korrekter Start angetäuscht. +# Solche Streams hier beim Aufruf ausschließen (PlayVideo: live=""). # Allgemeine Problemlage: inputstream hat mit einigen Streams Syncprobleme # (Video- und/oder Sound-Streams). Dies kann zu endlosem Bufern führen, # wenn das Addon nach Playerstart Funktionen des Players abfragt (getTime, @@ -3804,8 +3813,7 @@ def open_addon(addon_id, cmd): # getestet wurde mit den Defaultsettings. # Bisher keine ffmpeg-Analyse für Eignung/Nichteignung von Streams # monitor.waitForAbort() blockiert - für die while-Schleife sind mind. 1 sec -# Timeout und "not" erforderlich. Wieder entfernt und durch while-Schleife -# ersetzt. +# Timeout und "not" erforderlich. # def ShowSeekPos(player, url): # "Streamuhrzeit" PLog('ShowSeekPos: ' + url) @@ -3849,10 +3857,11 @@ def ShowSeekPos(player, url): # "Streamuhrzeit" if linkid: # ARD-EPG für Zeitstrahl laden buf_events, event_end = get_ARD_LiveEPG(epg_url, title_sender, date_format, now, TotalTime) event_end = int(event_end) + header = "Sendungen (r. Maustaste)" txt = "Anzahl Sendungen: %d" % len(buf_events) if len(buf_events) == 0: txt = "KEINE weitere Sendung" - xbmcgui.Dialog().notification("Zeitpuffer", txt, icon,3000, sound=True) + xbmcgui.Dialog().notification(header, txt, icon,4000, sound=True) KeyListener_run=True PLog("buf_events: %d" % len(buf_events)) @@ -3860,7 +3869,7 @@ def ShowSeekPos(player, url): # "Streamuhrzeit" monitor = xbmc.Monitor() LastBufTime = StartTime # detect sync errors direkt - p_list=[] # dto. im 3-sec-Rahmen + p_list=[] # dto. im 3-sec-Rahmen while not monitor.waitForAbort(1): if player.isPlaying(): show_time=False; syncfail=False @@ -3893,7 +3902,7 @@ def ShowSeekPos(player, url): # "Streamuhrzeit" PLog("monitor_break_on_syncfail") xbmcgui.Dialog().notification("Stream-Uhrzeit: ", u"Sync-Error - Abbruch", icon,3000, sound=True) xbmc.sleep(2000) - break # verhind. Blockade durch Buffering + break # verhind. Blockade durch Buffering # ---------------------------------- # regelm. Schwankung bei Livestreams 6-10 (empirisch):