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 Oct 29, 2023
1 parent 31c158f commit 1bd0705
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 72 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.8.7+nexus" provider-name="rols1 (rols1@gmx.de)">
<addon id="plugin.video.ardundzdf" name="ARDundZDF" version="4.8.8+nexus" provider-name="rols1 (rols1@gmx.de)">
<requires>
<import addon="xbmc.python" version="3.0.1"/>
<import addon="script.module.kodi-six" />
Expand Down
60 changes: 40 additions & 20 deletions ardundzdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@
# +++++ ARDundZDF - Addon Kodi-Version, migriert von der Plexmediaserver-Version +++++

# VERSION -> addon.xml aktualisieren
# <nr>154</nr> # Numerierung für Einzelupdate
VERSION = '4.8.7'
VDATE = '23.10.2023'
# <nr>155</nr> # Numerierung für Einzelupdate
VERSION = '4.8.8'
VDATE = '29.10.2023'


# (c) 2019 by Roland Scholz, rols1@gmx.de
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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={}"
Expand Down Expand Up @@ -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('<h1>'):
line = stringextract('<h1>', '</', hl)
lines.append(cleanhtml(line))
Expand All @@ -1193,10 +1201,15 @@ def ZDF_Teletext_Table(li, body, aktpg):
h2 = stringextract('headline_normal">', '</h2>', hl)
lines.append(cleanhtml(h2))
continue
if hl.startswith('<p class="copy" >'): # Einzelzeile
txt = stringextract('copy" >', '</p>', hl)
lines.append(cleanhtml(txt))
if hl.startswith('<p class="copy" >'): # 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("<a href="):
PLog("<a href=:")
part_list = html_lines[i+2:]
Expand Down Expand Up @@ -1237,8 +1250,8 @@ def ZDF_Teletext_Table(li, body, aktpg):
PLog(line)
lines.append(line)
i=new_ind+1 # neuer Index
continue

continue
if hl.startswith('<div class="link_button_a"'): # ohne Link, z.B. Trennzeile bei A-Z
PLog("link_button_a:")
part_list = html_lines[i+2:]
Expand Down Expand Up @@ -2584,7 +2597,7 @@ def Audio_get_homescreen(page='', cluster_id=''):
cluster_id = stringextract('"id":"', '"', item)
title = stringextract('"title":"', '"', item) # Cluster-Titel deutsch
cluster_type = stringextract('"type":"', '"', item) # Cluster-Titel engl.
if title == '' or title == None:
if title == '' or title == None or title == "Login-Banner":
continue
if title == 'Stage' or u'für dich' in title: # -> Highlights s. Step 2 / pers. Inhalte
continue
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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];
Expand All @@ -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);
Expand All @@ -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)
Expand Down Expand Up @@ -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)
#
Expand Down Expand Up @@ -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 == '':
Expand Down Expand Up @@ -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).
Expand Down
21 changes: 20 additions & 1 deletion changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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-
Expand Down
Binary file modified resources/images/tv-livestreams.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added resources/images/tv-livestreams_grey.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
50 changes: 24 additions & 26 deletions resources/lib/EPG.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#
# 20.11.2019 Migration Python3 Modul kodi_six + manuelle Anpassungen
# <nr>11</nr> # Numerierung für Einzelupdate
# Stand: 23.10.2023
# Stand: 28.10.2023
#

from kodi_six import xbmc, xbmcgui, xbmcaddon
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -298,24 +298,23 @@ 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
Dict_ID = "EPG_%s" % ID
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 ''
Expand All @@ -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
Expand All @@ -353,43 +352,43 @@ def EPG(ID, mode=None, day_offset=None, load_only=False):
sname = unescape(sname)
stime = stringextract('class=\"h7 time\">', '</p>', 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

sname_org = sname
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,
Expand All @@ -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')
Expand Down
Loading

0 comments on commit 1bd0705

Please sign in to comment.