get services skeleton for neutrino (v3)

This commit is contained in:
Dmitriy Yefremov
2018-01-04 01:23:22 +03:00
parent 0fb708ca9b
commit 9a0aa1e28f
5 changed files with 99 additions and 70 deletions

View File

@@ -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"}

View File

@@ -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))

View File

@@ -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: '<S i="0001" n="name" t="1" s="0" num="770" f="4"/>' (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__":

View File

@@ -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 """

View File

@@ -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: