From 81ad19043a2d1223f9567dbafead3f4868772dac Mon Sep 17 00:00:00 2001 From: DYefremov Date: Thu, 10 May 2018 00:44:42 +0300 Subject: [PATCH] new source for sat update dialog --- app/tools/satellites.py | 129 ++++++++++++++++++++++++--------- app/ui/satellites_dialog.glade | 5 +- app/ui/satellites_dialog.py | 9 ++- 3 files changed, 106 insertions(+), 37 deletions(-) diff --git a/app/tools/satellites.py b/app/tools/satellites.py index 790b260f..83863eda 100644 --- a/app/tools/satellites.py +++ b/app/tools/satellites.py @@ -1,18 +1,31 @@ """ Module for download satellites from internet ("flysat.com") for replace or update current satellites.xml file. """ +import re +from enum import Enum + import requests from html.parser import HTMLParser from app.eparser import Satellite, Transponder +class SatelliteSource(Enum): + FLYSAT = ("https://www.flysat.com/satlist.php",) + LYNGSAT = ("https://www.lyngsat.com/asia.html", "https://www.lyngsat.com/europe.html", + "https://www.lyngsat.com/atlantic.html", "https://www.lyngsat.com/america.html") + + @staticmethod + def get_sources(src): + return src.value + + class SatellitesParser(HTMLParser): """ Parser for satellite html page. """ _HEADERS = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/59.02"} - def __init__(self, url="https://www.flysat.com/satlist.php", entities=False, separator=' '): + def __init__(self, source=SatelliteSource.FLYSAT, entities=False, separator=' '): HTMLParser.__init__(self) @@ -24,7 +37,7 @@ class SatellitesParser(HTMLParser): self._current_row = [] self._current_cell = [] self._rows = [] - self._url = url + self._source = source def handle_starttag(self, tag, attrs): if tag == 'td': @@ -57,18 +70,37 @@ class SatellitesParser(HTMLParser): def error(self, message): pass - def get_satellites_list(self): + def get_satellites_list(self, source): self.reset() - request = requests.get(url=self._url, headers=self._HEADERS) - reason = request.reason - if reason == "OK": - self.feed(request.text) - if self._rows: + self._rows.clear() + self._source = source + + for src in SatelliteSource.get_sources(self._source): + request = requests.get(url=src, headers=self._HEADERS) + reason = request.reason + if reason == "OK": + self.feed(request.text) + else: + print(reason) + + if self._rows: + if self._source is SatelliteSource.FLYSAT: def get_sat(r): - return r[1], "".join(c for c in r[2] if c.isdigit() or c.isalpha() or c == "."), r[3], r[0], False + return r[1], self.parse_position(r[2]), r[3], r[0], False + return list(map(get_sat, filter(lambda x: all(x) and len(x) == 5, self._rows))) - else: - print(reason) + elif self._source is SatelliteSource.LYNGSAT: + rows = filter(lambda x: len(x) in (5, 7), self._rows) + sats = [] + current_pos = "0" + for row in rows: + r_len = len(row) + if r_len == 7: + current_pos = self.parse_position(row[2]) + sats.append((row[4], current_pos, row[5], row[1], False)) + elif r_len == 5: + sats.append((row[2], current_pos, row[3], row[1], False)) + return sats def get_satellite(self, sat): pos = sat[1] @@ -77,42 +109,73 @@ class SatellitesParser(HTMLParser): position=self.get_position(pos.replace(".", "")), transponders=self.get_transponders(sat[3])) + @staticmethod + def parse_position(pos_str): + return "".join(c for c in pos_str if c.isdigit() or c.isalpha() or c == ".") + @staticmethod def get_position(pos): return "{}{}".format("-" if pos[-1] == "W" else "", pos[:-1]) def get_transponders(self, sat_url): self._rows.clear() - url = "https://www.flysat.com/" + sat_url + url = "https://www.flysat.com/" + sat_url if self._source is SatelliteSource.FLYSAT else sat_url request = requests.get(url=url, headers=self._HEADERS) reason = request.reason trs = [] if reason == "OK": self.feed(request.text) - if self._rows: - zeros = "000" - for r in self._rows: - if len(r) < 3: - continue - data = r[2].split(" ") - if len(data) != 2: - continue - sr, fec = data - data = r[1].split(" ") - if len(data) < 3: - continue - freq, pol, tr_type = data[0], data[1], data[2] - tr_type = tr_type.split("/") - if len(tr_type) != 2: - continue - tr_type, mod = tr_type - mod = "QPSK" if tr_type == "DVB-S" else mod - trs.append(Transponder(freq + zeros, sr + zeros, pol, fec, tr_type, mod, None, None, None)) + if self._source is SatelliteSource.FLYSAT: + self.get_transponders_for_fly_sat(trs) + elif self._source is SatelliteSource.LYNGSAT: + self.get_transponders_for_lyng_sat(trs) + return trs + + def get_transponders_for_fly_sat(self, trs): + """ Parsing transponders for FlySat """ + if self._rows: + zeros = "000" + for r in self._rows: + if len(r) < 3: + continue + data = r[2].split(" ") + if len(data) != 2: + continue + sr, fec = data + data = r[1].split(" ") + if len(data) < 3: + continue + freq, pol, sys = data[0], data[1], data[2] + sys = sys.split("/") + if len(sys) != 2: + continue + sys, mod = sys + mod = "QPSK" if sys == "DVB-S" else mod + trs.append(Transponder(freq + zeros, sr + zeros, pol, fec, sys, mod, None, None, None)) + + def get_transponders_for_lyng_sat(self, trs): + """ Parsing transponders for LyngSat """ + frq_pol_pattern = re.compile("(\d{4,5}).*([RLHV])(.*\d$)") + sr_fec_pattern = re.compile("(\d{4,5})-(\d/\d) (.*PSK).*$") + # sys_pattern = re.compile("(DVB-S|DVB-S2).*") + zeros = "000" + for r in filter(lambda x: len(x) > 8, self._rows): + freq = re.match(frq_pol_pattern, r[2]) + if not freq: + continue + frq, pol = freq.group(1), freq.group(2) + + sr_fec = re.match(sr_fec_pattern, r[-3]) + if not sr_fec: + continue + sr, fec, mod = sr_fec.group(1), sr_fec.group(2), sr_fec.group(3) + # if not sys: + # continue + sys = "" + trs.append(Transponder(frq + zeros, sr + zeros, pol, fec, sys, mod, None, None, None)) return trs if __name__ == "__main__": pass - - diff --git a/app/ui/satellites_dialog.glade b/app/ui/satellites_dialog.glade index b8fa7323..23de40ff 100644 --- a/app/ui/satellites_dialog.glade +++ b/app/ui/satellites_dialog.glade @@ -1447,6 +1447,9 @@ FlySat + + LyngSat + @@ -1522,7 +1525,7 @@ True False - + True False update_source_store diff --git a/app/ui/satellites_dialog.py b/app/ui/satellites_dialog.py index b19c89a3..72fdd2d7 100644 --- a/app/ui/satellites_dialog.py +++ b/app/ui/satellites_dialog.py @@ -5,7 +5,7 @@ from math import fabs from app.commons import run_idle, run_task from app.eparser import get_satellites, write_satellites, Satellite, Transponder -from app.tools.satellites import SatellitesParser +from app.tools.satellites import SatellitesParser, SatelliteSource from .search import SearchProvider from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN, MOVE_KEYS from .dialogs import show_dialog, DialogType, WaitDialog @@ -466,6 +466,7 @@ class SatellitesUpdateDialog: self._main_model = main_model # self._dialog.get_content_area().set_border_width(0) self._sat_view = builder.get_object("sat_update_tree_view") + self._source_box = builder.get_object("source_combo_box") self._sat_update_expander = builder.get_object("sat_update_expander") self._text_view = builder.get_object("text_view") self._receive_button = builder.get_object("receive_sat_list_tool_button") @@ -506,9 +507,11 @@ class SatellitesUpdateDialog: model = get_base_model(self._sat_view.get_model()) model.clear() self._download_task = True + src = self._source_box.get_active() if not self._parser: - self._parser = SatellitesParser(url="https://www.flysat.com/satlist.php") - sats = self._parser.get_satellites_list() + self._parser = SatellitesParser() + + sats = self._parser.get_satellites_list(SatelliteSource.FLYSAT if src == 0 else SatelliteSource.LYNGSAT) if sats: model = get_base_model(self._sat_view.get_model()) for sat in sats: