Skip to content

Commit

Permalink
Einzelupdate settings.xml, ardundzdf.py, tools.py
Browse files Browse the repository at this point in the history
  • Loading branch information
rols1 committed Dec 29, 2024
1 parent 69efa5f commit ec8ba82
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 72 deletions.
30 changes: 16 additions & 14 deletions ardundzdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,23 @@
import json # json -> Textstrings
import string
import importlib # dyn. Laden zur Laufzeit, s. router
from threading import Thread


# ständige Addonmodule - Rest dyn. in router
import resources.lib.updater as updater
from resources.lib.util import *
import resources.lib.EPG as EPG
import resources.lib.tools as tools
import resources.lib.epgRecord as epgRecord


# +++++ ARDundZDF - Addon Kodi-Version, migriert von der Plexmediaserver-Version +++++

# VERSION -> addon.xml aktualisieren
# <nr>226</nr> # Numerierung für Einzelupdate
# <nr>227</nr> # Numerierung für Einzelupdate
VERSION = '5.1.6'
VDATE = '22.12.2024'
VDATE = '29.12.2024'


# (c) 2019 by Roland Scholz, rols1@gmx.de
Expand Down Expand Up @@ -258,13 +260,12 @@
os.remove(EPGACTIVE)
is_activ=False
if is_activ == False: # EPG-Daten veraltet, neu holen
from threading import Thread
bg_thread = Thread(target=EPG.thread_getepg, args=(EPGACTIVE, DICTSTORE, PLAYLIST))
bg_thread.start()

tci = int(SETTINGS.getSetting('pref_tv_store_days')) # TV-Livestream-Quellen aktualisieren
if tci >= 5: # Thread nicht bei 0 od. 1 aktivieren
ID = "ard_streamlinks" # stellvertretend auch für zdf + iptv
ID = "ard_streamlinks" # ard stellvertretend für zdf + iptv
dictfile = os.path.join(DICTSTORE, ID)
if os.path.exists(dictfile):
mtime = os.path.getmtime(dictfile)
Expand All @@ -278,12 +279,18 @@
if cache_diff <= 43200: # Refresh bereits 12 Std. vor Ablauf möglich
PLog("CacheLimit_reached: %d" % int(now-CacheLimit))
bg_thread = Thread(target=EPG.thread_getstreamlinks, args=())
bg_thread.start()
bg_thread.start()

tci = int(SETTINGS.getSetting('pref_thumbnail_days')) # Kodi-Thumbnails-Ordner bereinigen
if tci > 0: # Thread nicht bei 0 aktivieren
PLog("clear_thumbnailcache: tci %d" % tci)
nogui="1"
bg_thread = Thread(target=tools.ClearUpThumbnails, args=(nogui))
bg_thread.start()

if SETTINGS.getSetting('pref_dl_cnt') == 'true': # laufende Downloads anzeigen
if os.path.exists(DL_CHECK) == False: # Lock beachten (Datei dl_check_alive)
PLog("Haupt_PRG: get_active_dls")
from threading import Thread
bg_thread = Thread(target=epgRecord.get_active_dls, args=())
bg_thread.start()
else: # Check Dateileiche
Expand Down Expand Up @@ -321,7 +328,6 @@
open(STRM_CHECK, 'w').close() # Lock strm_check_alive anlegen
PLog("Haupt_PRG: start_strm_sync")
import resources.lib.strm as strm
from threading import Thread
bg_thread = Thread(target=strm.strm_sync, args=())
bg_thread.start()
else:
Expand Down Expand Up @@ -577,7 +583,7 @@ def Main():
summ = "%s\n-%s" % (summ, "strm-Tools")
if SETTINGS.getSetting('pref_playlist') == 'true':
summ = "%s\n-%s\n-%s" % (summ, "PLAYLIST-Tools", "Settings inputstream.adaptive")
summ = "%s\n-%s" % (summ, "Kodis Thumbnails-Ordner bereinigen")
summ = "%s\n-%s" % (summ, "Kodi-Thumbnails-Ordner bereinigen")
summ = "%s\n\n%s" % (summ, u"[B]Einzelupdate[/B] (für einzelne Dateien des Addons)")
fparams="&fparams={}"
addDir(li=li, label='Infos + Tools', action="dirList", dirID="InfoAndFilter", fanart=R(FANART), thumb=R(ICON_INFO),
Expand Down Expand Up @@ -725,8 +731,8 @@ def InfoAndFilter():

dz = get_dir_size(THUMBNAILS) # Thumbnails-Ordner bereinigen
dz = "[B](%s)[/B]" % dz
title = u"Kodis Thumbnails-Ordner bereinigen %s" % dz
tag = u'[B]Kodis Thumbnails-Ordner bereinigen[/B]'
title = u"Kodi-Thumbnails-Ordner bereinigen %s" % dz
tag = u'[B]Kodi-Thumbnails-Ordner bereinigen[/B]'
summ = u"Das Bereinigen schafft Platz, indem es ältere Bilder entfernt (Auswahl: Dateien älter als 1-100 Tage)."
summ = u"%s\nDadurch kann sich die Anzeige älterer Beiträge anfangs verzögern." % summ
summ = u"%s\n\nDer aktuelle Füllstand %s kann auch im Menü Addon-Infos eingesehen werden." % (summ, dz)
Expand Down Expand Up @@ -3658,7 +3664,6 @@ def ARDSportBilder(title, path, img):
image += 1

if background and len(path_url_list) > 0: # Übergabe Url-Liste an Thread
from threading import Thread # thread_getfile
textfile=''; pathtextfile=''; storetxt=''; url=img_src;
fulldestpath=local_path; notice=True; destdir="Slide-Show-Cache"
now = datetime.datetime.now()
Expand Down Expand Up @@ -5674,7 +5679,6 @@ def DownloadExtern(url, title, dest_path, key_detailtxt, sub_path=''):
# Untertiteldatei hinzufügen:
PLog(dtyp); PLog(SETTINGS.getSetting('pref_load_subtitles'))

from threading import Thread # thread_getfile
path_url_list=''; timemark=''; notice=True
background_thread = Thread(target=thread_getfile, args=(textfile,pathtextfile,storetxt,url,fulldestpath,path_url_list,timemark,notice,sub_path,dtyp))
background_thread.start()
Expand Down Expand Up @@ -8575,7 +8579,6 @@ def BilderDasErsteSingle(title, path):

if background and len(path_url_list) > 0: # Thread-Call mit Url- und Textliste
PLog("background: " + str(background))
from threading import Thread # thread_getpic
folder = fname
background_thread = Thread(target=thread_getpic,
args=(path_url_list, text_list, folder))
Expand Down Expand Up @@ -11338,7 +11341,6 @@ def ZDF_BildgalerieSingle(path, title, li=''):

if background and len(path_url_list) > 0: # Thread-Call mit Url- und Textliste
PLog("background: " + str(background))
from threading import Thread # thread_getpic
folder = fname
background_thread = Thread(target=thread_getpic,
args=(path_url_list, text_list, folder))
Expand Down
154 changes: 98 additions & 56 deletions resources/lib/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
# Filterliste, Suchwortliste

################################################################################
# <nr>9</nr> # Numerierung für Einzelupdate
# Stand: 19.07.2024
# <nr>10</nr> # Numerierung für Einzelupdate
# Stand: 29.12.2024

# Python3-Kompatibilität:
from __future__ import absolute_import # sucht erst top-level statt im akt. Verz.
Expand All @@ -35,6 +35,7 @@
pass

# Standard:
import time, datetime

# Addonmodule:
from resources.lib.util import *
Expand All @@ -53,7 +54,7 @@
if os.path.exists(FILTER_SET):
AKT_FILTER = RLoad(FILTER_SET, abs_path=True)
AKT_FILTER = AKT_FILTER.splitlines() # gesetzte Filter initialiseren

THUMBNAIL_CHECK = os.path.join(ADDON_DATA, "thumbnail_check")

################################################################################

Expand Down Expand Up @@ -401,75 +402,115 @@ def FilterToolsWork(action):
# Kodis Thumbnails-Ordner bereinigen
# Hinw.: ClearUp (util) nicht geeignet (ohne Check einz. Dateien
# in Unterverz.)
#
def ClearUpThumbnails():
PLog('ClearUpThumbnails:')
# 12/2024 autom. Bereinigung ergänzt (Tread-Start Haupt-PRG,
# Zeitstempel THUMBNAIL_CHECK). Setting pref_thumbnail_days ist
# gleichzeitig Intervall und Löschalter (kleines Intervall=große
# Löschmenge)
#
def ClearUpThumbnails(nogui=""):
PLog('ClearUpThumbnails: ' + nogui)
thumb=R("icon-clear.png")
notimsg1 = "Thumbnails-Bereinigung"

now = time.time() # Unix-Format 1735387316.4195263
stamp = str(now).split('.')[0] # Zeitstempel (int)
PLog("stamp: " + stamp)

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

THUMBNAILS = os.path.join(USERDATA, "Thumbnails")
directory = THUMBNAILS
#directory = "/tmp/Thumbnails/" # Debug

akt_size_raw = get_dir_size(directory, raw=True)
akt_size = humanbytes(akt_size_raw)
dialog = xbmcgui.Dialog()

#----------------------- # 1. Auswahl Lösch-Alter
title = u"Bitte das Lösch-Alter in Tagen auswählen (Dateien älter als x Tage):"
day_list = ["1","5","10","30","100"]
sel = dialog.select(title, day_list)
if sel < 0:
return
if nogui == "": # Start aus Menü
li = xbmcgui.ListItem()
li = home(li, ID=NAME) # Home-Button
dialog = xbmcgui.Dialog()

sel = day_list[sel]
PLog("Auswahl: " + sel)
#------------------------------- # 1. Auswahl Lösch-Alter
title = u"Bitte das Lösch-Alter in Tagen auswählen (Dateien älter als x Tage):"
day_list = ["1","5","10","30","100"]
sel = dialog.select(title, day_list)
if sel < 0:
return
sel = day_list[sel]

title = u"Thumbnails-Bereinigung starten?"
msg1 = u"Aktuelle Größe: [B]%s[/B] | löschen älter als: [B]%s[/B] Tag(e)" % (akt_size, sel)
msg2 = u"Thumbnails-Bereinigung jetzt starten?"
msg3 = u"Rückgängig nicht möglich!"
ret = MyDialog(msg1, msg2, msg3, ok=False, cancel='Abbruch', yes='JA', heading=title)
PLog(ret)
if ret != 1:
return
PLog("days_selected: " + sel)

else: # Start aus Haupt-PRG (Thread)
sel = SETTINGS.getSetting('pref_thumbnail_days') # Intervall + Lösch-Alter aus Setting
if os.path.exists(THUMBNAIL_CHECK) == False: # Zeitstempel noch nicht gesetzt,
RSave(THUMBNAIL_CHECK, stamp) # setzen und Ende
return
else:
PLog("set_days: " + sel)
last_check = RLoad(THUMBNAIL_CHECK, abs_path=True)
last_check = last_check.strip()
maxtime = int(last_check) + int(sel)*86400
PLog("last_check: %s, maxtime: %d, now: %d" % (last_check, maxtime, now))
diff = maxtime - now
if now >= maxtime: # Diff last_check / Tage-Auswahl erreicht?
PLog("reach_day_limit: diff %d" % diff) # -> Bereinigung
else:
remain = seconds_translate(diff) # Tage-Auswahl noch nicht erreicht -> Ende
PLog("reach_day_limit_in: %s (diff %d sec)" % (remain, diff))
return

#----------------------- # 2. Bereinigung / Abbruch
title = u"Thumbnails-Bereinigung starten?"
msg1 = u"Aktuelle Größe: [B]%s[/B] | Lösch-Alter: [B]%s[/B] Tage" % (akt_size, sel)
msg2 = u"Thumbnails-Bereinigung jetzt starten?"
msg3 = u"Rückgängig nicht möglich!"
ret = MyDialog(msg1, msg2, msg3, ok=False, cancel='Abbruch', yes='JA', heading=title)
PLog(ret)
if ret != 1:
return
#------------------------------- # 2. Bereinigung

PLog("days_selected: " + sel)
maxdays = int(sel)
PLog("ClearUp_Start: %s | days: %d" % (directory, maxdays))
max_secs = maxdays*86400 # 1 Tag=86400 sec
now = time.time()
cnt=0; del_cnt=0;
for dirpath, dirnames, filenames in os.walk(directory):
for f in filenames:
fp = os.path.join(dirpath, f) # Filepath
# PLog(fp) # Debug
# skip symbolic link
if not os.path.islink(fp):
cnt = cnt+1
if os.stat(fp).st_mtime < (now - max_secs):
os.remove(fp)
del_cnt = del_cnt+1
cnt=0; del_cnt=0; ok=True
try:
for dirpath, dirnames, filenames in os.walk(directory):
for f in filenames:
fp = os.path.join(dirpath, f) # Filepath
# PLog(fp) # Debug
# skip symbolic link:
if not os.path.islink(fp):
cnt = cnt+1
if os.stat(fp).st_mtime < (now - max_secs):
os.remove(fp)
del_cnt = del_cnt+1
except Exception as exception:
ok=False
msg2 = str(exception)
PLog("clearup_error " + msg2)

#----------------------- # 3. Abschluss-Info
if ret == False:
msg1 = u"Bereinigung fehlgeschlagen"
msg2 = u"Fehler siehe Addon-Log (Plugin-Logging einschalten)"
msg3 = ""
MyDialog(msg1, msg2, '')
return
#------------------------------- # 3. Abschluss-Info

RSave(THUMBNAIL_CHECK, stamp) # Zeitstempel aktualisieren
new_size_raw = get_dir_size(directory, raw=True)
new_size = humanbytes(new_size_raw)
win = akt_size_raw - new_size_raw
PLog(del_cnt); PLog(win)
msg1 = u"Fertig | Entfernte Thumbnails: [B]%s[/B]" % del_cnt
msg2 = u"Größe vorher / nachher: %s / %s." % (akt_size, new_size)
msg3 = "Speicherplatz unverändert."
if win > 0:
msg3 = "Speicherplatz freigegeben: [B]%s[/B]." % humanbytes(win)
MyDialog(msg1, msg2, msg3)
PLog("del_cnt: %d, win: %d" % (del_cnt, win))
if ok:
msg1 = u"Fertig | Entfernte Thumbnails: [B]%s[/B]" % del_cnt
msg2 = u"Größe vorher / nachher: %s / %s." % (akt_size, new_size)
msg3 = "Speicherplatz unverändert."
notimsg2 = u"vor/nach: %s/%s" % (akt_size, new_size)

if win > 0:
msg3 = "Speicherplatz freigegeben: [B]%s[/B]." % humanbytes(win)
notimsg2 = "frei: [B]%s[/B]" % humanbytes(win)
else:
msg1 = "Problem in Bereinigung! Fehler:"
msg3=""
notimsg1 = "Bereinigungsproblem:"; notimsg2 = msg2

if nogui == "": # Start aus Menü
MyDialog(msg1, msg2, msg3)
else: # Start aus Haupt-PRG
xbmcgui.Dialog().notification(notimsg1,notimsg2,thumb,5000)

return # Verbleib in Tools-Liste

Expand All @@ -481,7 +522,8 @@ def ClearUpThumbnails():
#
def get_foruminfo():
PLog('get_foruminfo:')

# return "","" # Debug

dt=''
path = "https://www.kodinerds.net/index.php?thread/64244-release-kodi-addon-ardundzdf/"
page, msg = get_page(path=path)
Expand Down
5 changes: 3 additions & 2 deletions resources/settings.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- <nr>14</nr> # Numerierung für Einzelupdate -->
<!-- <nr>15</nr> # Numerierung für Einzelupdate -->
<settings>
<category label="Allgemein">
<setting label="Debug: Plugin-Logging einschalten" type="bool" id="pref_info_debug" default="false"/>
Expand Down Expand Up @@ -62,8 +62,9 @@
<setting label="Untertitel" type="select" values="1|10|30|100" default="30" id="pref_UT_store_days"/>
<setting label="Bildersammlungen (Slide Shows)" type="select" values="1|10|30|100" default="30" id="pref_SLIDES_store_days"/>
<setting label="Inhaltstexte (im Voraus geladen)" type="select" values="5|10|30|100" default="30" id="pref_TEXTE_store_days"/>
<setting label="ARD- und ZDF-TV-Livestream-Quellen" type="select" values="0|1|5|10|20|60|100" default="20" id="pref_tv_store_days"/>
<setting label="ARD- und ZDF-TV-Livestream-Quellen" type="select" values="0|1|5|10|20|60|100" default="60" id="pref_tv_store_days"/>
<setting label="EPG: Intervall für die Aktualisierung" type="select" values="12 Std.|1 Tag|5 Tage|10 Tage" default="12 Std." id="pref_epg_intervall"/>
<setting label="Kodi-Thumbnails-Ordner bereinigen" type="select" values="0|1|5|10|30|100" default="0" id="pref_thumbnail_days"/>
</category>

<category label="Favoriten / Merkliste / strm-Dateien">
Expand Down

0 comments on commit ec8ba82

Please sign in to comment.