diff --git a/app/tools/picons.py b/app/tools/picons.py index 3e37a7f7..9403bcce 100644 --- a/app/tools/picons.py +++ b/app/tools/picons.py @@ -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 diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index 2dc9a9f1..c7bf3e1a 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -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)) diff --git a/app/ui/picons_dialog.glade b/app/ui/picons_dialog.glade index ea982557..cd9d773a 100644 --- a/app/ui/picons_dialog.glade +++ b/app/ui/picons_dialog.glade @@ -71,7 +71,6 @@ Author: Dmitriy Yefremov False - False True True emblem-photos @@ -524,7 +523,7 @@ Author: Dmitriy Yefremov - False + True True 1 @@ -824,7 +823,7 @@ Author: Dmitriy Yefremov - False + True True 8 diff --git a/app/ui/picons_downloader.py b/app/ui/picons_downloader.py index aef8a27f..67b54513 100644 --- a/app/ui/picons_downloader.py +++ b/app/ui/picons_downloader.py @@ -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):