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 Aug 30, 2020
1 parent 040a54a commit 3e26da8
Show file tree
Hide file tree
Showing 12 changed files with 196 additions and 126 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="3.3.1" provider-name="rols1 (rols1@gmx.de)">
<addon id="plugin.video.ardundzdf" name="ARDundZDF" version="3.3.3" provider-name="rols1 (rols1@gmx.de)">
<requires>
<import addon="xbmc.python" version="2.25.0"/>
<import addon="script.module.kodi-six" />
Expand Down
36 changes: 11 additions & 25 deletions ardundzdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

# Python
import base64 # url-Kodierung für Kontextmenüs
import shlex # Parameter-Expansion für subprocess.Popen (os != windows)
import sys # Plattformerkennung
import shutil # Dateioperationen
import re # u.a. Reguläre Ausdrücke, z.B. in CalculateDuration
Expand All @@ -43,8 +42,8 @@
# +++++ ARDundZDF - Addon Kodi-Version, migriert von der Plexmediaserver-Version +++++

# VERSION -> addon.xml aktualisieren
VERSION = '3.3.1'
VDATE = '22.08.2020'
VERSION = '3.3.3'
VDATE = '30.08.2020'

#
#
Expand Down Expand Up @@ -226,7 +225,7 @@
SUBTITLESTORE = os.path.join("%s/subtitles") % ADDON_DATA
TEXTSTORE = os.path.join("%s/Inhaltstexte") % ADDON_DATA
WATCHFILE = os.path.join("%s/merkliste.xml") % ADDON_DATA
JOBFILE = os.path.join("%s/jobliste.xml") % ADDON_DATA #Jobliste für epgRecord
JOBFILE = os.path.join("%s/jobliste.xml") % ADDON_DATA # Jobliste für epgRecord
MONITOR_ALIVE = os.path.join("%s/monitor_alive") % ADDON_DATA # Lebendsignal für JobMonitor
PLog(SLIDESTORE); PLog(WATCHFILE);
check = check_DataStores() # Check /Initialisierung / Migration
Expand Down Expand Up @@ -276,7 +275,7 @@
if SETTINGS.getSetting('pref_epgRecord') == 'true':
epgRecord.JobMain(action='init') # EPG_Record starten

# todo: Test Module
# Skin-Anpassung:
skindir = xbmc.getSkinDir()
PLog("skindir: %s" % skindir)
if 'confluence' in skindir: # ermöglicht Plot-Infos in Medienansicht
Expand Down Expand Up @@ -5762,7 +5761,7 @@ def SenderLiveListePre(title, offset=0): # Vorauswahl: Überregional, Regional,
thumb=R('tv-EPG-single.png'), fparams=fparams, summary=summary, tagline=tagline)

PLog(str(SETTINGS.getSetting('pref_LiveRecord')))
if SETTINGS.getSetting('pref_LiveRecord') == 'true' or SETTINGS.getSetting('pref_m3u8_get') == 'true':
if SETTINGS.getSetting('pref_LiveRecord') == 'true':
title = 'Recording TV-Live' # TVLiveRecord-Button anhängen
laenge = SETTINGS.getSetting('pref_LiveRecord_duration')
if SETTINGS.getSetting('pref_LiveRecord_input') == 'true':
Expand Down Expand Up @@ -5824,9 +5823,8 @@ def TVLiveRecordSender(title):
PLog('TVLiveRecordSender:')
title = unquote(title)

# nach Testphase ersetzen durch pref_m3u8_get:
#if check_Setting('pref_LiveRecord_ffmpegCall') == False:
# return
if check_Setting('pref_LiveRecord_ffmpegCall') == False:
return

li = xbmcgui.ListItem()
li = home(li, ID=NAME) # Home-Button
Expand Down Expand Up @@ -5876,24 +5874,14 @@ def TVLiveRecordSender(title):
# LiveRecord verlagert nach util (import aus ardundzdf klappt nicht in epgRecord,
# dto. MakeDetailText).
#
# 29.06.0219 Erweiterung Sendung aufnehmen, Call K-Menü <- EPG_ShowSingle
# 29.06.0219 Erweiterung "Sendung aufnehmen", Call K-Menü <- EPG_ShowSingle
# Check auf Setting pref_epgRecord in EPG_ShowSingle
# Todo: bei Wegfall m3u8-Verfahren Mehrkanal-Check entf. - dto. in LiveRecord
# 30.08.2020 Wegfall m3u8-Verfahren: Mehrkanal-Check entf. (dto. in LiveRecord)
#
def ProgramRecord(url, sender, title, descr, start_end):
PLog('ProgramRecord:')
PLog(url); PLog(sender); PLog(title);
PLog(start_end);

import resources.lib.m3u8 as m3u8
body, new_url = m3u8.get_m3u8_body(url) # Check Mehrkanal-m3u8 vorschalten
if '#EXT-X-MEDIA:TYPE=AUDIO' in body: # Mehrkanal-m3u8 -> Hinw. ffmpeg, Abbruch
msg1 = "Mehrkanalstream - ffmpeg erforderlich!"
msg2 = "Bitte in Settings <Recording TV-Live> die Option"
msg3 = "<Aufnehmen/Recording ohne ffmpeg> ausschalten"
PLog(msg1)
MyDialog(msg1, msg2, msg3)
return

now = EPG.get_unixtime(onlynow=True)

Expand All @@ -5905,10 +5893,8 @@ def ProgramRecord(url, sender, title, descr, start_end):
PLog("now %s, von %s, bis %s"% (now, von, bis))

#---------------------------------------------- # Voraussetzungen prüfen
# nach Testphase ersetzen durch pref_m3u8_get:
if SETTINGS.getSetting('pref_m3u8_get') == 'false':
if check_Setting('pref_LiveRecord_ffmpegCall') == False: # Dialog dort
return
if check_Setting('pref_LiveRecord_ffmpegCall') == False: # Dialog dort
return
if check_Setting('pref_download_path') == False: # Dialog dort
return

Expand Down
24 changes: 24 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,30 @@ CHANGE HISTORY
max_col 97
--------------

30.08.2020 3.3.3 Einstellung m3u8-Aufnahmeverfahren
Setting "experimentell: Aufnehmen/Recording ohne ffmpeg" entfernt.
Anpassungen: SenderLiveListePre, ProgramRecord, LiveRecord (Modul util).
Modul m3u8: entfernt, Anpassung epgRecord.
Url-Korrektur https -> http für ünchen.tv, Leipzig Fernsehen, Rhein-Neckar
Fernsehen, Franken Fernsehen - Funktion: url_correction (Modul util).
Kika_Videos (Modul childs): Folgeseiten-Auswertung hinzugefügt für Menü
"Videos und Bilder (A-Z)".
KikaninchenLieder (Modul childs): Fix Host-Adresse für img_src (Bilder fehlten).

not on Github 3.3.2
Modul 3sat: Themen (www.3sat.de/themen) hinzugefügt, Anpassungen in Main_3Sat
und Rubriken
Icons hinzugefügt: zdf-themen.png (für 3sat-Themen).
Icons entfernt (obsolet): tv-zdf-kultur.png, tv-mdr-sachsen-anhalt.png,
tv-mdr-thueringen.png.
ardundzdf.py: shlex-import entfernt (Nutzung in Modulen util + Podcontent).
Kika_SingleBeitrag: Leerinhalte für Bitrate abgefangen (div. Video-Einzelauf-
lösungen nicht verfügbar), repl_json_chars für Param. summ.
Audiothek / Podcast-Favoriten: "KabarettPost SR 2" (weggefallen) ausgetauscht
gegen "Zugabe Pur - der Satire-Podcast WDR 2".
ttsMP3_Monitor_Aufnahme_gestartet.mp3: leicht-dB-verstärkt (war zu leise).


22.08.2020 3.3.1
Hintergrundroutine für Audiothek-Bilder, die von den Ziel-Webseiten
im Voraus geladen werden müssen: neue Funktion thread_img_via_web,
Expand Down
Binary file added resources/images/zdf-themen.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
53 changes: 44 additions & 9 deletions resources/lib/childs.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# 17.11.2019 Migration Python3 Modul kodi_six + manuelle Anpassungen
################################################################################
#
# Stand: 25.06.2020
# Stand: 30.08.2020

# Python3-Kompatibilität:
from __future__ import absolute_import # sucht erst top-level statt im akt. Verz.
Expand Down Expand Up @@ -474,10 +474,17 @@ def Kika_VideosBeliebt():
xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)

# ----------------------------------------------------------------------
# Kika-Videos eines Bündels aus Kika_VideosBuendelAZ oder Kika_VideosBeliebt -
# enthält playerContainer() der Plex-Version
def Kika_Videos(path, title, thumb):
# Kika-Videos eines Bündels aus Kika_VideosBuendelAZ oder Kika_VideosBeliebt
# 30.08.2020 Folgeseiten-Auswertung hinzugefügt
#
def Kika_Videos(path, title, thumb, pagenr=''):
PLog('Kika_Videos:')
if pagenr == '':
pagenr = 1
pagenr = int(pagenr)
PLog(pagenr)
title_org = title; thumb_org = thumb

li = xbmcgui.ListItem()
li = home(li, ID='Kinderprogramme') # Home-Button

Expand All @@ -501,9 +508,9 @@ def Kika_Videos(path, title, thumb):
if SETTINGS.getSetting('pref_video_direct') == 'true': # Kennz. Video für Sofortstart
mediatype='video'
for s in videos:
href = ref = stringextract('dataURL:\'', '\'}', s) # Link Videodetails (..avCustom.xml)
href = ref = stringextract('dataURL:\'', '\'}', s) # Link Videodetails (..avCustom.xml)
# PLog(href); # PLog(s); # Bei Bedarf
img = stringextract('<noscript>', '</noscript>', s).strip() # Bildinfo separieren
img = stringextract('<noscript>', '</noscript>', s).strip() # Bildinfo separieren
img_alt = stringextract('alt=\"', '\"', img)
img_alt = unescape(img_alt)
img_src = stringextract('src="', '"', img)
Expand All @@ -525,6 +532,29 @@ def Kika_Videos(path, title, thumb):
(quote(href), quote(stitle), quote(img_src), quote(img_alt), quote(duration))
addDir(li=li, label=stitle, action="dirList", dirID="resources.lib.childs.Kika_SingleBeitrag", fanart=img_src,
thumb=img_src, fparams=fparams, tagline=img_alt, mediatype=mediatype)

pos = page.find('<!--The bottom navigation') # Seite auf Folgeseiten prüfen
page = page[pos:]
if 'class="bundleNavi' in page:
pagelist = blockextract('class="bundleNaviItem', page)
next_pagenr = int(pagenr + 1)
PLog('pagelist: %d, next_pagenr: %d' % (len(pagelist), next_pagenr))
href=''
if next_pagenr-1 < len(pagelist): # Basis 0
for item in pagelist:
title = stringextract('title="">', '</a>', item)
PLog(title)
if title == str(next_pagenr): # Basis 0
href = BASE_KIKA + stringextract('href="', '"', item)
break
if href:
tag = "weiter zu Seite %s" % str(next_pagenr)
href=py2_encode(href); title_org=py2_encode(title_org);
thumb_org=py2_encode(thumb_org);
fparams="&fparams={'path': '%s', 'title': '%s', 'thumb': '%s', 'pagenr': '%d'}" %\
(quote(href), quote(title_org), quote(thumb_org), next_pagenr)
addDir(li=li, label="Mehr..", action="dirList", dirID="resources.lib.childs.Kika_Videos",
fanart=R(ICON_MEHR), thumb=R(ICON_MEHR), fparams=fparams, tagline=tag)

xbmcplugin.endOfDirectory(HANDLE, cacheToDisc=True)

Expand Down Expand Up @@ -641,7 +671,9 @@ def KikaninchenLieder():
continue
img_src = stringextract('urlScheme":"', '**imageVariant**', rec)
PLog(img_src)
img_src = 'http://www.kikaninchen.de' + img_src + 'ident.jpg' # ident = 800x800
if img_src.startswith('http') == False:
img_src = 'http://www.kikaninchen.de' + img_src
img_src = img_src + 'ident.jpg' # ident = 800x800
title = stringextract('title":"', '"', rec)
altText = stringextract('altText":"', '"', rec)
titleText = stringextract('titleText":"', '"', rec)
Expand Down Expand Up @@ -717,6 +749,7 @@ def Kika_SingleBeitrag(path, title, thumb, summ, duration):
summ1 = stringextract('<broadcastDescription>', '</', page)
summ2 = stringextract('<topline>', '</', page)
summ = summ1 + ' ' + summ2
summ = repl_json_chars(summ)
Plot_par = summ

assets = blockextract('<asset>', page)
Expand All @@ -738,13 +771,15 @@ def Kika_SingleBeitrag(path, title, thumb, summ, duration):

download_list = [] # 2-teilige Liste für Download: 'Titel # url'
oldbitrate=0
cnt=0
cnt=0; high=0
for s in assets:
# Log(s) # bei Bedarf
frameWidth = stringextract('<frameWidth>', '</frameWidth>', s)
frameHeight = stringextract('<frameHeight>', '</frameHeight>', s)
url_mp4 = stringextract('<progressiveDownloadUrl>', '</', s)
bitrate = stringextract('<bitrateVideo>', '</', s)
bitrate = stringextract('<bitrateVideo>', '</', s)
if bitrate == '':
bitrate = '0'
profil = stringextract('<profileName>', '</', s)
resolution = frameWidth + 'x' + frameHeight

Expand Down
43 changes: 13 additions & 30 deletions resources/lib/epgRecord.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#
####################################################################################################
# 01.07.2020 Start
# Stand 27.07.2020
# Stand 30.08.2020

# Python3-Kompatibilität:
from __future__ import absolute_import # sucht erst top-level statt im akt. Verz.
Expand Down Expand Up @@ -83,7 +83,7 @@
#
# Verfahren Recording-TV-Live-Jobs: LiveRecord erzeugt Job via JobMain +
# startet direkt ffmpeg oder m3u8-Verfahren (je nach Setting)
#
# 30.08.2020 experimentelles m3u8-Verfahren entf.

def JobMonitor():
PLog("JobMonitor:")
Expand Down Expand Up @@ -141,7 +141,7 @@ def JobMonitor():
myjob = jobs[cnt]
PLog(myjob[:80])
status = stringextract('<status>', '</status>', myjob)
PLog("Job %d status: %s" % (cnt+1, status))
PLog("scan_Job %d status: %s" % (cnt+1, status))

start_end = stringextract('<startend>', '</startend>', myjob)
start, end = start_end.split('|') # 1593627300|1593633300
Expand Down Expand Up @@ -199,10 +199,6 @@ def JobMonitor():
job_changed = True

PIDffmpeg = LiveRecord(url, title, duration, laenge='', epgJob=mydate, JobID=JobID) # Aufnehmen
# m3u8-Verfahren statt ffmpeg - LiveRecord startet direkt m3u8.Main_m3u8:
if SETTINGS.getSetting('pref_m3u8_get') == 'true':
PIDffmpeg = "Thread_%s" % JobID # -> KillFile (JobRemove)

myjob = myjob.replace('<pid></pid>', '<pid>%s</pid>' % PIDffmpeg)

#--------------------------------------------------- # Job zurück in Liste
Expand Down Expand Up @@ -317,7 +313,8 @@ def JobMain(action, start_end='', title='', descr='', sender='', url='', setSet

#------------------------
# die für Recording Live (LiveRecord) erzeugten Jobs werden nicht im JobMonitor
# abgearbeitet, sondern direkt in m3u8.Main_m3u8
# abgearbeitet, sondern direkt in m3u8.Main_m3u8 - entfallen mit Ende des
# experimentellen m3u8-Aufnahmeverfahrens 30.08.2020
if action == 'setjob': # neuen Job an Aufnahmeliste anhängen + Bereinigung: Doppler
# verhindern, Einträge auf pref_max_reclist beschränken
title = cleanmark(title) # Farbe/fett aus ProgramRecord
Expand All @@ -330,8 +327,7 @@ def JobMain(action, start_end='', title='', descr='', sender='', url='', setSet
status = 'waiting'
if PIDffmpeg: # Aufruf: LiveRecord via ffmpeg
status = 'gestartet' # -> <status>, für JobMonitor tabu
pid = PIDffmpeg # aus LiveRecord direkt oder via JobMonitor

pid = PIDffmpeg # aus LiveRecord direkt oder via JobMonitor

job_line = JOBLINE_TEMPL % (start_end,title,descr,sender,url,status,pid,JobID)
new_job = JOB_TEMPL % job_line
Expand Down Expand Up @@ -372,8 +368,8 @@ def JobMain(action, start_end='', title='', descr='', sender='', url='', setSet

xbmcgui.Dialog().notification("Aufnahme-Monitor:", "Job hinzugefügt",MSG_ICON,3000)
PLog("JobID: %s" % JobID)
if "Recording Live" or "ffmpeg-recording" in descr: # LiveRecord ffmpeg oder -> m3u8.Main_m3u8
return JobID # mit JobID
if "ffmpeg-recording" in descr: # LiveRecord ffmpeg
return JobID
else:
if os.path.exists(MONITOR_ALIVE) == False: # JobMonitor läuft bereits?
bg_thread = Thread(target=JobMonitor, # sonst Thread JobMonitor starten
Expand Down Expand Up @@ -437,7 +433,7 @@ def JobListe(): # Liste, Job-Status, Jobs löschen
PLog(myjob[:80])
status = stringextract('<status>', '</status>', myjob)
status_real = status # wird aktualisiert s.u.
PLog("Job %d status: %s" % (cnt+1, status))
PLog("JobListe_Job %d status: %s" % (cnt+1, status))

start_end = stringextract('<startend>', '</startend>', myjob)
start, end = start_end.split('|') # 1593627300|1593633300
Expand Down Expand Up @@ -551,15 +547,9 @@ def JobRemove(sender, job_title, start_end, job_active, pid, JobID):
if ret !=1:
return

KillFile = os.path.join("%s/ThreadKill_%s") % (ADDON_DATA, JobID) # Stopfile, Ausführung download_ts
PLog("KillFile: %s, %s" % (KillFile, os.path.exists(KillFile)))
if job_active == 'True' and pid != '':
if 'Thread_' in pid: # in JobMonitor ergänzt mit JobID
PLog("setze: %s" % KillFile)
open(KillFile, 'w').close() # KillFile anlegen
else:
PLog("kill_pid: %s" % str(pid))
os.kill(int(pid), signal.SIGTERM) # auch Windows10 OK (aber Teilvideo beschäd.)
PLog("kill_pid: %s" % str(pid))
os.kill(int(pid), signal.SIGTERM) # auch Windows10 OK (aber Teilvideo beschäd.)

jobs = ReadJobs() # s. util
newjob_list = []; # newjob_list: Liste nach Änderungen
Expand Down Expand Up @@ -594,15 +584,8 @@ def JobStop(sender, job_title, start_end, job_active, pid, JobID):
else:
msg1 = job_title

KillFile = os.path.join("%s/ThreadKill_%s") % (ADDON_DATA, JobID) # Stopfile, Ausführung download_ts
PLog("KillFile: %s, %s" % (KillFile, os.path.exists(KillFile)))
if job_active == 'True' and pid != '':
if 'Thread_' in pid: # in JobMonitor ergänzt mit JobID
PLog("setze: %s" % KillFile)
open(KillFile, 'w').close() # KillFile anlegen
else:
PLog("kill_pid: %s" % str(pid))
os.kill(int(pid), signal.SIGTERM) # auch Windows10 OK (aber Teilvideo beschäd.)
PLog("kill_pid: %s" % str(pid))
os.kill(int(pid), signal.SIGTERM) # auch Windows10 OK (aber Teilvideo beschäd.)

icon = MSG_ICON
xbmcgui.Dialog().notification("Jobliste:", u"Job wird gestoppt",icon,3000)
Expand Down
Loading

0 comments on commit 3e26da8

Please sign in to comment.