providers parsing optimisation for picons

This commit is contained in:
DYefremov
2018-09-19 23:02:26 +03:00
parent 49605b87f9
commit 562a5e5c6d
4 changed files with 33 additions and 22 deletions

View File

@@ -106,6 +106,10 @@ class ProviderParser(HTMLParser):
""" Parser for satellite html page. (https://www.lyngsat.com/*sat-name*.html) """
_POSITION_PATTERN = re.compile("at\s\d+\..*(?:E|W)']")
_DOMAIN = "https://www.lyngsat.com"
_TV_DOMAIN = _DOMAIN + "/tvchannels/"
_RADIO_DOMAIN = _DOMAIN + "/radiochannels/"
_PKG_DOMAIN = _DOMAIN + "/packages/"
def __init__(self, entities=False, separator=' '):
@@ -121,6 +125,7 @@ class ProviderParser(HTMLParser):
self._current_cell = []
self.rows = []
self._ids = set()
self._prv_names = set()
self._positon = None
def handle_starttag(self, tag, attrs):
@@ -132,8 +137,9 @@ class ProviderParser(HTMLParser):
if attrs[0][1].startswith("logo/"):
self._current_row.append(attrs[0][1])
if tag == "a":
if "https://www.lyngsat.com/packages/" in attrs[0][1]:
self._current_row.append(attrs[0][1])
url = attrs[0][1]
if url.startswith((self._PKG_DOMAIN, self._TV_DOMAIN, self._RADIO_DOMAIN)):
self._current_row.append(url)
def handle_data(self, data):
""" Save content to a cell """
@@ -151,20 +157,33 @@ class ProviderParser(HTMLParser):
self._current_row.append(final_cell)
self._current_cell = []
elif tag == 'tr':
row = self._current_row
r = self._current_row
# Satellite position
if not self._positon:
pos = re.findall(self._POSITION_PATTERN, str(row))
pos = re.findall(self._POSITION_PATTERN, str(r))
if pos:
self._positon = "".join(c for c in str(pos) if c.isdigit() or c in ".EW")
if len(row) == 12:
on_id, sep, tid = str(row[-2]).partition("-")
len_row = len(r)
if len_row == 12:
name = r[5]
self._prv_names.add(name)
on_id, sep, tid = str(r[-2]).partition("-")
if tid and on_id not in self._ON_ID_BLACK_LIST and on_id not in self._ids:
row[-2] = on_id
self.rows.append(row)
r[-2] = on_id
self._ids.add(on_id)
row[0] = self._positon
r[0] = self._positon
if name + on_id not in self._prv_names:
self._prv_names.add(name + on_id)
self.rows.append(Provider(logo=r[2], name=name, pos=r[0], url=r[6], on_id=r[-2], selected=True))
elif len_row == 8 and r[0].startswith(self._DOMAIN):
self.rows.append(
Provider(logo=None, name=r[1], pos=self._positon, url=r[0], on_id=None, selected=False))
elif len_row == 9 and r[1].startswith(self._DOMAIN):
self.rows.append(
Provider(logo=None, name=r[2], pos=self._positon, url=r[1], on_id=None, selected=False))
self._current_row = []
def error(self, message):
@@ -180,10 +199,8 @@ def parse_providers(open_path):
with open(open_path, encoding="utf-8", errors="replace") as f:
parser.feed(f.read())
rows = parser.rows
if rows:
return [Provider(logo=r[2], name=r[5], pos=r[0], url=r[6], on_id=r[-2], selected=True) for r in rows]
return parser.rows
@run_task

View File

@@ -479,11 +479,6 @@ class MainAppWindow:
top_iter = model.get_iter(path)
if model.iter_n_children(top_iter): # parent
pass
# for index, itr in enumerate(itrs):
# ch_itr = model.insert(top_iter, index, rows[index])
# print("PARENT")
# ch_itr = model.insert(itr, 0, bq)
# scroll_to(model.get_path(ch_itr), view, paths)
else:
list(map(lambda itr: model.move_before(itr, top_iter), itrs))

View File

@@ -71,7 +71,6 @@ Author: Dmitriy Yefremov
</object>
<object class="GtkDialog" id="picons_dialog">
<property name="can_focus">False</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="destroy_with_parent">True</property>
<property name="icon_name">emblem-photos</property>
@@ -524,7 +523,7 @@ Author: Dmitriy Yefremov
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
@@ -824,7 +823,7 @@ Author: Dmitriy Yefremov
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">8</property>
</packing>

View File

@@ -9,7 +9,7 @@ from app.commons import run_idle, run_task
from app.ftp import upload_data, DownloadType
from app.tools.picons import PiconsParser, parse_providers, Provider, convert_to
from app.properties import Profile
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN, TV_ICON
from .dialogs import show_dialog, DialogType, get_message
from .main_helper import update_entry_data, append_text_to_tview
@@ -108,7 +108,7 @@ class PiconsDialog:
providers = parse_providers(self._TMP_DIR + url[url.find("w"):])
if providers:
for p in providers:
model.append((self.get_pixbuf(p[0]), p.name, p.pos, p.url, p.on_id, p.selected))
model.append((self.get_pixbuf(p[0]) if p[0] else TV_ICON, p.name, p.pos, p.url, p.on_id, p.selected))
self.update_receive_button_state()
def get_pixbuf(self, img_url):