mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2026-07-01 00:17:31 +02:00
lazy xmltv loading
This commit is contained in:
@@ -237,7 +237,7 @@ class XmlTvReader(Reader):
|
||||
|
||||
@run_task
|
||||
def download(self, clb=None):
|
||||
""" Downloads and processes an XMLTV file. """
|
||||
""" Downloads an XMLTV file. """
|
||||
res = urlparse(self._url)
|
||||
if not all((res.scheme, res.netloc)):
|
||||
log(f"{self.__class__.__name__} [download] error: Invalid URL {self._url}")
|
||||
@@ -310,15 +310,13 @@ class XmlTvReader(Reader):
|
||||
import gzip
|
||||
|
||||
with gzip.open(self._path, "rb") as gzf:
|
||||
self.process_data(gzf)
|
||||
log("Processing XMLTV data...")
|
||||
for n in ET.iterparse(gzf):
|
||||
yield from self.process_node(n)
|
||||
log("XMLTV data parsing is complete.")
|
||||
except OSError as e:
|
||||
log(f"{self.__class__.__name__} [parse] error: {e}")
|
||||
|
||||
def process_data(self, data):
|
||||
log("Processing XMLTV data...")
|
||||
list(map(self.process_node, ET.iterparse(data)))
|
||||
log("XMLTV data parsing is complete.")
|
||||
|
||||
def process_node(self, node):
|
||||
event, element = node
|
||||
if element.tag == self.CH_TAG:
|
||||
@@ -352,6 +350,8 @@ class XmlTvReader(Reader):
|
||||
if all((start, stop, title)):
|
||||
events.append(self.Event(start, stop, title, desc))
|
||||
|
||||
yield node
|
||||
|
||||
def to_epg_dat(self):
|
||||
""" Converts and saves imported data to 'epg.dat' file. """
|
||||
raise ValueError("Not implemented yet!")
|
||||
|
||||
@@ -69,20 +69,24 @@ class EpgCache(dict):
|
||||
|
||||
self.init()
|
||||
|
||||
@run_task
|
||||
@run_idle
|
||||
def init(self):
|
||||
if self._src is EpgSource.XML:
|
||||
url = self._settings.epg_xml_source
|
||||
gz_file = f"{self._settings.profile_data_path}epg{os.sep}epg.gz"
|
||||
self._reader = XmlTvReader(gz_file, url)
|
||||
|
||||
def process_data():
|
||||
gen = self._reader.parse()
|
||||
GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
|
||||
|
||||
if os.path.isfile(gz_file):
|
||||
# Difference calculation between the current time and file modification.
|
||||
dif = datetime.now() - datetime.fromtimestamp(os.path.getmtime(gz_file))
|
||||
# We will update daily. -> Temporarily!!!
|
||||
self._reader.download(self._reader.parse) if dif.days > 0 else self._reader.parse()
|
||||
self._reader.download(process_data) if dif.days > 0 else process_data()
|
||||
else:
|
||||
self._reader.download(self._reader.parse)
|
||||
self._reader.download(process_data)
|
||||
elif self._src is EpgSource.DAT:
|
||||
self._reader = EPG.DatReader(f"{self._settings.profile_data_path}epg{os.sep}epg.dat")
|
||||
self._reader.download()
|
||||
|
||||
Reference in New Issue
Block a user