From 9a0aa1e28ff6f216d7c4bd7e90af3ac403d87ce3 Mon Sep 17 00:00:00 2001 From: Dmitriy Yefremov Date: Thu, 4 Jan 2018 01:23:22 +0300 Subject: [PATCH] get services skeleton for neutrino (v3) --- app/eparser/ecommons.py | 8 +-- app/eparser/neutrino/bouquets.py | 17 ++--- app/eparser/neutrino/services.py | 120 ++++++++++++++++++------------- app/ui/main_app_window.py | 20 ++++-- app/ui/satellites_dialog.py | 4 +- 5 files changed, 99 insertions(+), 70 deletions(-) diff --git a/app/eparser/ecommons.py b/app/eparser/ecommons.py index 854584e5..a4dd652d 100644 --- a/app/eparser/ecommons.py +++ b/app/eparser/ecommons.py @@ -51,10 +51,10 @@ POLARIZATION = {"0": "H", "1": "V", "2": "L", "3": "R"} PLS_MODE = {"0": "Root", "1": "Gold", "2": "Combo"} -FEC = {"0": "Auto", "1": "1/2", "2": "2/3", - "3": "3/4", "4": "5/6", "5": "7/8", - "6": "8/9", "7": "3/5", "8": "4/5", - "9": "9/10", "15": None} +FEC = {"0": "Auto", "1": "1/2", "2": "2/3", "3": "3/4", "4": "5/6", "5": "7/8", "6": "8/9", "7": "3/5", "8": "4/5", + "9": "9/10", "10": "1/2", "11": "2/3", "12": "3/4", "13": "5/6", "14": "7/8", "15": "8/9", "16": "3/5", + "17": "4/5", "18": "9/10", "19": "1/2", "20": "2/3", "21": "3/4", "22": "5/6", "23": "7/8", "24": "8/9", + "25": "3/5", "26": "4/5", "27": "9/10", "28": "Auto"} SYSTEM = {"0": "DVB-S", "1": "DVB-S2"} diff --git a/app/eparser/neutrino/bouquets.py b/app/eparser/neutrino/bouquets.py index 7bd31152..1d56574e 100644 --- a/app/eparser/neutrino/bouquets.py +++ b/app/eparser/neutrino/bouquets.py @@ -1,6 +1,8 @@ from enum import Enum from xml.dom.minidom import parse, Document +import os + from ..ecommons import Bouquets, Bouquet, BouquetService, BqServiceType _FILE = "bouquets.xml" @@ -13,13 +15,17 @@ class BqType(Enum): def get_bouquets(path): - return (parse_bouquets(path + _FILE, "User bouquets", BqType.BOUQUET.value), - parse_bouquets(path + _U_FILE, "User TV", BqType.TV.value)) + return (parse_bouquets(path + _FILE, "Providers", BqType.BOUQUET.value), + parse_bouquets(path + _U_FILE, "FAV", BqType.TV.value)) def parse_bouquets(file, name, bq_type): - dom = parse(file) + bouquets = Bouquets(name=name, type=bq_type, bouquets=[]) + if not os.path.exists(file): + return bouquets + + dom = parse(file) for elem in dom.getElementsByTagName("Bouquet"): if elem.hasAttributes(): @@ -31,12 +37,7 @@ def parse_bouquets(file, name, bq_type): for srv_elem in elem.getElementsByTagName("S"): if srv_elem.hasAttributes(): ssid = srv_elem.attributes["i"].value - srv_name = srv_elem.attributes["n"].value - srv_type = srv_elem.attributes["t"].value on = srv_elem.attributes["on"].value - sys = srv_elem.attributes["s"].value - frq = srv_elem.attributes["frq"].value, - l = srv_elem.attributes["l"].value fav_id = "{}:{}".format(on, ssid) services.append(BouquetService(None, BqServiceType.DEFAULT, fav_id, 0)) bouquets[2].append(Bouquet(name=bq_name, type=bq_type, services=services)) diff --git a/app/eparser/neutrino/services.py b/app/eparser/neutrino/services.py index 9498cde5..bda6c667 100644 --- a/app/eparser/neutrino/services.py +++ b/app/eparser/neutrino/services.py @@ -71,59 +71,81 @@ def parse_services(path): dom = parse(path + _FILE) services = [] - for elem in dom.getElementsByTagName("sat"): - sat, sat_pos, sat = None, None, None + for root in dom.getElementsByTagName("zapit"): + api = root.attributes["api"].value - if elem.hasAttributes(): - sat_name = elem.attributes["name"].value - sat_pos = elem.attributes["position"].value - sat = "{}:{}:{}:{}".format(sat_name, sat_pos, - elem.attributes["diseqc"].value, - elem.attributes["uncommited"].value) + for elem in root.getElementsByTagName("sat"): + if elem.hasAttributes(): + sat_name = elem.attributes["name"].value + sat_pos = elem.attributes["position"].value + sat_pos = "{}.{}".format(sat_pos[:-1], sat_pos[-1:]) + sat = "{}:{}:{}:{}".format(sat_name, sat_pos, + elem.attributes["diseqc"].value, + elem.attributes["uncommited"].value) - for tr_elem in elem.getElementsByTagName("TS"): - if tr_elem.hasAttributes(): - tr_id = tr_elem.attributes["id"].value - on = tr_elem.attributes["on"].value - freq = tr_elem.attributes["frq"].value - rate = tr_elem.attributes["sr"].value - fec = tr_elem.attributes["fec"].value - pol = tr_elem.attributes["pol"].value - sys = tr_elem.attributes["sys"].value - transponder = "{}:{}:{}:{}:{}:{}:{}:{}:{}".format(tr_id, on, freq, tr_elem.attributes["inv"].value, - rate, fec, pol, tr_elem.attributes["mod"].value, sys) - for srv_elem in tr_elem.getElementsByTagName("S"): - if srv_elem.hasAttributes(): - ssid = srv_elem.attributes["i"].value - name = srv_elem.attributes["n"].value - srv_type = srv_elem.attributes["t"].value - data_id = "{}:{}:{}:{}".format(srv_type, - srv_elem.attributes["s"].value, - srv_elem.attributes["num"].value, - srv_elem.attributes["f"].value) - fav_id = "{}:{}".format(on.lstrip("0"), ssid.lstrip("0")) + for tr_elem in elem.getElementsByTagName("TS"): + if tr_elem.hasAttributes(): + parse_transponder(api, sat, sat_pos, services, tr_elem) - srv = Service(flags_cas=sat, - transponder_type=None, - coded=None, - service=name, - locked=None, - hide=None, - package=PROVIDER.get(int(on, 16)), - service_type=SERVICE_TYPE.get(str(int(srv_type, 16))), - ssid=ssid, - freq=freq, - rate=rate, - pol=POLARIZATION.get(pol), - fec=FEC.get(fec), - system=SYSTEM.get(sys), - pos="{}.{}".format(sat_pos[:-1], sat_pos[-1:]), - data_id=data_id, - fav_id=fav_id, - transponder=transponder) - services.append(srv) + return services - return services + +def parse_transponder(api, sat, sat_pos, services, tr_elem): + tr_id = tr_elem.attributes["id"].value + on = tr_elem.attributes["on"].value + freq = tr_elem.attributes["frq"].value + rate = tr_elem.attributes["sr"].value + inv = tr_elem.attributes["inv"].value + fec = tr_elem.attributes["fec"].value + pol = tr_elem.attributes["pol"].value + mod = tr_elem.attributes.get("mod") + mod = mod.value if mod else mod + sys = tr_elem.attributes.get("sys") + sys = sys.value if sys else sys + + tr = "{}:{}:{}:{}:{}:{}:{}:{}:{}".format(tr_id, on, freq, inv, rate, fec, pol, mod, sys) + + for srv_elem in tr_elem.getElementsByTagName("S"): + if srv_elem.hasAttributes(): + ssid = srv_elem.attributes["i"].value + name = srv_elem.attributes["n"].value + srv_type = srv_elem.attributes["t"].value + sys = srv_elem.attributes["s"].value + num = srv_elem.attributes["num"].value + f = srv_elem.attributes["f"].value + v, a, p, pmt, tx, vt = [None] * 6 + + # For v3 is possible so: '' (equals v4 api) + if api == "3" and len(srv_elem.attributes) > 6: + v = srv_elem.attributes["v"].value + a = srv_elem.attributes["a"].value + p = srv_elem.attributes["p"].value + pmt = srv_elem.attributes["pmt"].value + tx = srv_elem.attributes["tx"].value + vt = srv_elem.attributes["vt"].value + + data_id = "{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}".format(api, srv_type, sys, num, f, v, a, p, pmt, tx, vt) + fav_id = "{}:{}".format(on.lstrip("0"), ssid.lstrip("0")) + + srv = Service(flags_cas=sat, + transponder_type=None, + coded=None, + service=name, + locked=None, + hide=None, + package=PROVIDER.get(int(on, 16)), + service_type=SERVICE_TYPE.get(str(int(srv_type, 16))), + ssid=ssid, + freq=freq, + rate=rate, + pol=POLARIZATION.get(pol), + fec=FEC.get(fec), + system=SYSTEM.get(sys), + pos=sat_pos, + data_id=data_id, + fav_id=fav_id, + transponder=tr) + services.append(srv) if __name__ == "__main__": diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index a8871513..3aa99fe7 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -438,10 +438,7 @@ class MainAppWindow: @run_idle def open_data(self, data_path=None): """ Opening data and fill views. """ - self.__bouquets_model.clear() - self.__fav_model.clear() - self.__services_model.clear() - self.__blacklist.clear() + self.clear_current_data() data_path = self.__options.get(self.__profile).get("data_dir_path") if data_path is None else data_path try: @@ -488,6 +485,13 @@ class MainAppWindow: else: show_dialog(DialogType.ERROR, self.__main_window, "Error opening data!") + def clear_current_data(self): + """ Clearing current data from lists """ + self.__bouquets_model.clear() + self.__fav_model.clear() + self.__services_model.clear() + self.__blacklist.clear() + def on_data_save(self, *args): if show_dialog(DialogType.QUESTION, self.__main_window) == Gtk.ResponseType.CANCEL: return @@ -588,9 +592,11 @@ class MainAppWindow: response = show_settings_dialog(self.__main_window, self.__options) if response != Gtk.ResponseType.CANCEL: profile = self.__options.get("profile") - self.__status_bar.push(0, "Current IP: " + self.__options.get(profile).get("host")) - self.__profile_label.set_text("Enigma 2 v.4" if Profile(profile) is Profile.ENIGMA_2 else "Neutrino-MP") - self.__profile = profile + if profile != self.__profile: + self.__status_bar.push(0, "Current IP: " + self.__options.get(profile).get("host")) + self.__profile_label.set_text("Enigma 2 v.4" if Profile(profile) is Profile.ENIGMA_2 else "Neutrino-MP") + self.__profile = profile + self.clear_current_data() def on_tree_view_key_release(self, view, event): """ Handling keystrokes """ diff --git a/app/ui/satellites_dialog.py b/app/ui/satellites_dialog.py index 0c74abba..f2cd0a3b 100644 --- a/app/ui/satellites_dialog.py +++ b/app/ui/satellites_dialog.py @@ -1,7 +1,7 @@ import re from math import fabs -from app.commons import run_idle +from app.commons import run_idle, run_task from app.eparser import get_satellites, write_satellites, Satellite, Transponder from . import Gtk, Gdk, UI_RESOURCES_PATH from .dialogs import show_dialog, DialogType @@ -128,7 +128,7 @@ class SatellitesDialog: elif ctrl and key in (Gdk.KEY_Down, Gdk.KEY_Page_Down, Gdk.KEY_KP_Page_Down): move_items(key, self._sat_view) - @run_idle + @run_task def on_satellites_list_load(self, model): """ Load satellites data into model """ try: