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 Jun 25, 2023
1 parent db73fc1 commit c5d2a25
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 55 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.7.6+matrix" provider-name="rols1 (rols1@gmx.de)">
<addon id="plugin.video.ardundzdf" name="ARDundZDF" version="4.7.7+matrix" provider-name="rols1 (rols1@gmx.de)">
<requires>
<import addon="xbmc.python" version="3.0.0"/>
<import addon="script.module.kodi-six" />
Expand Down
6 changes: 3 additions & 3 deletions ardundzdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@

# VERSION -> addon.xml aktualisieren
# <nr>116</nr> # Numerierung für Einzelupdate
VERSION = '4.7.6'
VDATE = '18.06.2023'
VERSION = '4.7.7'
VDATE = '25.06.2023'


# (c) 2019 by Roland Scholz, rols1@gmx.de
Expand Down Expand Up @@ -2836,7 +2836,7 @@ def ARDSportWDR():

title = u"Moderation der Sportschau" # Moderation
tag = u"Bildgalerie"
img = "https://images.sportschau.de/image/908ed0bc-918d-470d-bc61-377be863a818/AAABgUeOYdE/AAABgPp7JiI/16x9-640/alexander-bommes-sportschau-sp-104.jpg"
img = "https://images.sportschau.de/image/43770bba-0b81-4d0e-8dd2-b282f90859d5/AAABgUeQFuU/AAABg8tMQ7w/1x1-840/sportschaumoderator-sp-126.jpg"
path = "https://www.sportschau.de/sendung/moderation"
title=py2_encode(title); path=py2_encode(path);
img=py2_encode(img);
Expand Down
10 changes: 10 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@ CHANGE HISTORY
max_col 97
--------------

25.06.2023 4.7.7
ShowSeekPos (util): neu - blendet nach Verschieben der Pufferposition von
inputstream.adaptive die passende Uhrzeit per Notification ein (Aufruf in
PlayVideo). Neues Setting: "Stream-Uhrzeit" (pref_streamtime, default true).
arte-Modul: Ersatz der durch phoenix-Erneuerung gelöschten Funktionen
getOnline + time_state im Modul util.
livesenderTV.xml: Streamlink für Lausitzwelle aktualisiert.
ARDSportWDR: Bild Menü Moderation aktualisiert.
get_live_data (phoenix): icon leer vorbelegt (erforderl. bei Senderausfall).

18.06.2023 4.7.6
TV-Livestreams Regional Lokalzeit: return nach Sofortstart für Verbleib
in akt. Liste.
Expand Down
7 changes: 4 additions & 3 deletions resources/lib/phoenix.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
################################################################################
# <nr>11</nr> # Numerierung für Einzelupdate
# Stand: 16.06.2023
# Stand: 24.06.2023

# Python3-Kompatibilität:
from __future__ import absolute_import # sucht erst top-level statt im akt. Verz.
Expand Down Expand Up @@ -164,15 +164,16 @@ def Main_phoenix():
def get_live_data():
PLog('get_live_data:')
path = "https://www.phoenix.de/response/template/livestream_json"
page, msg = get_page(path=path)
page, msg = get_page(path=path)
if page == '':
msg1 = "get_live_data:"
msg2 = msg
# MyDialog(msg1, msg2, '')
PLog("%s | %s" % (msg1, msg2))
PLog(len(page))

title='';subtitle='';vorspann='';descr='';href='';sender='';thumb=''
title='';subtitle='';vorspann='';descr='';href='';sender='';
thumb=''; icon=''
if page:
# Kurzf. möglich: {"title":"tagesschau","subtitel":"mit Geb\u00e4rdensprache",
# "typ":"","vorspann":""}
Expand Down
117 changes: 69 additions & 48 deletions resources/lib/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
# 17.11.2019 Migration Python3 Modul kodi_six + manuelle Anpassungen
#
# <nr>55</nr> # Numerierung für Einzelupdate
# Stand: 22.06.2023
# Stand: 25.06.2023

# Python3-Kompatibilität:
from __future__ import absolute_import
Expand Down Expand Up @@ -3460,21 +3460,8 @@ def PlayVideo(url, title, thumb, Plot, sub_path=None, Merk='false', playlist='',
PLog("url: " + url); PLog("playlist: %s" % str(playlist))
if IsPlayable == 'true' and playlist =='': # true - Call via listitem
PLog('PlayVideo_Start: listitem')
xbmcplugin.setResolvedUrl(HANDLE, True, li) # indirekt
while 1: # showSubtitles nur bei akt. Player wirksam
if player.isPlaying():
xbmc.sleep(1000) # für Raspi erforderl. (500 können fehlschlagen)
if SETTINGS.getSetting('pref_UT_ON') == 'true':
PLog("Player_Subtitles_on")
xbmc.Player().showSubtitles(True)
else:
PLog("Player_Subtitles_off")
xbmc.Player().showSubtitles(False)
break
xbmc.sleep(200)
if SETTINGS.getSetting('pref_inputstream') == 'true':
ShowSeekPos(player, url) # issue #30
return
xbmcplugin.setResolvedUrl(HANDLE, True, li) # indirekt
play_time=0; video_dur=0 # hier dummies (rel. -> PlayMonitor)

else: # false, None od. Blank - Playlist
PLog('PlayVideo_Start: direkt, playlist: %s' % str(playlist))
Expand Down Expand Up @@ -3522,10 +3509,26 @@ def PlayVideo(url, title, thumb, Plot, sub_path=None, Merk='false', playlist='',
break
xbmc.sleep(200)

if SETTINGS.getSetting('pref_inputstream') == 'true':
ShowSeekPos(player, url) # issue #30, wie oben

return play_time, video_dur # -> PlayMonitor
while 1: # showSubtitles laut Settings AN/AUS
if player.isPlaying():
xbmc.sleep(1000) # für Raspi erforderl. (500 können fehlschlagen)
if SETTINGS.getSetting('pref_UT_ON') == 'true':
PLog("Player_Subtitles: on")
xbmc.Player().showSubtitles(True)
else:
PLog("Player_Subtitles: off")
xbmc.Player().showSubtitles(False)
break
xbmc.sleep(200)

if SETTINGS.getSetting('pref_inputstream') == 'true':
from threading import Thread # issue #30: SeekPos -> Streamuhrzeit
PLog("Thread_ShowSeekPos_start:")
bg_thread = Thread(target=ShowSeekPos, args=(player, url))
bg_thread.start()


return play_time, video_dur # -> PlayMonitor
# exit(0)

#-------------------------------------
Expand Down Expand Up @@ -3713,8 +3716,10 @@ def open_addon(addon_id, cmd):
return

#----------------------------------------------------------------
# Test: zeigt Abspielposition inputstream.adaptive als Zeitangabe
# Player vor Aufruf bereits aktiviert (s. Player_Subtitles_on)
# Zeigt Abspielposition inputstream.adaptive als Zeitangabe
# Keine Beschränkung auf HLS-Videos
# Aufruf: PlayAudio (direkt, indirekt)
# Player vor Aufruf bereits aktiviert (s. Player_Subtitles:)
# notification-Aufruf zu ungenau für float-Werte.
# ZDF-Werte beim Start:
# Pufferanzeige: Wert1 / Wert2 ->
Expand All @@ -3724,51 +3729,62 @@ def open_addon(addon_id, cmd):
# LastSeek: 10786 = 179 min

# Der Abstand zwischen TotalTime und LastSeek (player.getTime) variiert
# bei den Sendern und schwankt im Verlauf zwischen 0 und 10 (laut Tests).
#
# Livestream-Erkennung: LastSeek=0. inputstream startet i.d.R. kurz
# vor Ende des Puffers, bei Resume ist LastSeek > 0 (je nach Abbruchpos.)
# Bei Videos meldet LastSeek: 0.
# bei den Livestreams der Sender und schwankt im Verlauf zwischen 0 und
# 10 (laut Tests).
#
# Probleme:
# ARD-Livestream verharrt in isPlaying-Schleife (vermutl. H-Task erforderlich)
# Issues:
# Unterscheidung Live-/Videostream nicht via Url-Eigenschaften möglich -
# LastSeek bei Videos häufig 0, aber s. Sportschaustream
# Thread für Raspi und für einzelne Streams (LastSeek=0, s.u.) zwingend
# erforderlich
# Sportschaustream ../ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/..
# Start mit 2-4 absinkend auf Minuswerte
# Bisher keine ffmpeg-Analyse für Eignung/Nichteignung von Streams
#
def ShowSeekPos(player, url):
PLog('ShowSeekPos:')
if SETTINGS.getSetting('pref_streamtime') == 'false':
PLog("pref_streamtime: OFF")
return

monitor = xbmc.Monitor()
import resources.lib.EPG as EPG
icon="" # -> Kodi's i-Symbol
now = EPG.get_unixtime(onlynow=True) # unix-sec passend zu TotalTime, LastSeek
now_dt = datetime.datetime.fromtimestamp(int(now))
StartTime = now_dt.strftime("%H:%M:%S")

while 1: # auf Player warten
xbmc.sleep(500)
if player.isPlaying():
break

xbmc.sleep(2000) # Gedenksek. für Raspi u.ä., sonst LastSeek=0

TotalTime = int(player.getTotalTime()) # sec, float -> int, max. Puffergröße
LastSeek = int(player.getTime()) # Basis-Wert für akt. Uhrzeit
PLog("StartTime: %s, TotalTime: %d, LastSeek: %d" % (StartTime, TotalTime, LastSeek))

if LastSeek == 0: # vermutl. kein Livestream?
PLog("no_live_stream_detect: " + url)
if LastSeek == 0: # vermutl. kein Livestream od. endloses
PLog("no_live_stream_detect: " + url) # Buffering
xbmcgui.Dialog().notification("Stream-Uhrzeit: ", u"hier nicht möglich", icon,3000, sound=True)
return

LastBufTime = "" # für sync errors
PLog("StartTime: %s, TotalTime: %d, LastSeek: %d" % (StartTime, TotalTime, LastSeek))
if url.endswith('.m3u8'):
while player.isPlaying():
xbmc.sleep(1000)
LastBufTime = StartTime # für sync errors
while not monitor.waitForAbort(2):
xbmc.sleep(500)
if player.isPlaying():
show_time=False
play_time = player.getTime() # akt. Pos im Puffer (0=Pufferstart)
try:
play_time = player.getTime() # akt. Pos im Puffer (0=Pufferstart)
except:
play_time=LastSeek

p = int(play_time)
#PLog("play_time: %d, LastSeek: %d" % (p, LastSeek)) # Debug
if p < 0 or p > TotalTime: # bei sync error falsche Werte möglich,
continue # Bsp. LastSeek QVC: 1271296
PLog("play_time_p: %d, LastSeek: %d" % (p, LastSeek)) # Debug
# Sportschaustream: Start mit 2-4 absinkend auf Minuswerte - s.o.
if p <= 1 or p > TotalTime: # sync error? Bsp. LastSeek QVC: 1271296
PLog("break_on_getTime_1")
xbmcgui.Dialog().notification("Stream-Uhrzeit: ", u"hier nicht möglich", icon,3000, sound=True)
xbmc.sleep(2000)
break # verhind. Blockade durch Buffering (Bsp. WDR-Lokalzeit)

# regelm. Schwankung 6-10 (empirisch):
# regelm. Schwankung bei Livestreams 6-10 (empirisch):
if (LastSeek-p) > 10: # rückwärts im Puffer
show_time=True
if p > LastSeek: # vorwärts im Puffer
Expand All @@ -3786,12 +3802,17 @@ def ShowSeekPos(player, url):
PLog("new_t_string: " + t_string)

if LastBufTime != new_dt: # skip_sync_error
LastSeek=p # neuer Basis-Wert, bei Playerstop identisch
LastBufTime=new_dt
xbmcgui.Dialog().notification("Stream-Uhrzeit: ", t_string, icon,5000, sound=False)
else:
PLog("skip_sync_error")


LastSeek=p

else:
PLog("monitor_stop")
break

return
#----------------------------------------------------------------
# experimentelle Funktion thread_getsubtitles einschl. vtt_convert archiviert
Expand Down

0 comments on commit c5d2a25

Please sign in to comment.