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
+