def get_transponder_data(self, pos, fec, sys, mod): """ Returns converted transponder data. """ sys = get_key_by_value(SYSTEM, sys) mod = get_key_by_value(MODULATION, mod) fec = get_key_by_value(FEC, fec) # For negative (West) positions: 3600 - numeric position value!!! namespace = f"{3600 - pos if pos < 0 else pos:04x}0000" tr_flag = 1 roll_off = 0 # 35% DVB-S2/DVB-S (default) pilot = 2 # Auto s2_flags = "" if sys == "DVB-S" else self._S2_TR.format( tr_flag, mod or 0, roll_off, pilot) inv = 2 # Default return sys, mod, fec, namespace, s2_flags, roll_off, pilot, inv
def get_service_data(s_type, pkg, sid, tid, nid, namespace, v_pid, a_pid, cas, use_pids=False): sid = int(sid) data_id = f"{sid:04x}:{namespace}:{tid:04x}:{nid:04x}:{s_type}:0:0" fav_id = f"{sid}:{tid}:{nid}:{namespace}" picon_id = f"1_0_{int(s_type):X}_{sid}_{tid}_{nid}_{namespace}_0_0_0.png" # Flags. flags = f"p:{pkg}" cas = ",".join( get_key_by_value(CAS, c) or "C:0000" for c in cas.split()) if cas else None if use_pids: v_pid = f"c:00{int(v_pid):04x}" if v_pid else None a_pid = ",".join([f"c:01{int(p):04x}" for p in a_pid]) if a_pid else None flags = ",".join(filter(None, (flags, v_pid, a_pid, cas))) else: flags = ",".join(filter(None, (flags, cas))) return flags, sid, fav_id, picon_id, data_id
def to_transponder(self): return Transponder(frequency=self._freq_entry.get_text(), symbol_rate=self._rate_entry.get_text(), polarization=self._pol_box.get_active_id(), fec_inner=self._fec_box.get_active_id(), system=self._sys_box.get_active_id(), modulation=self._mod_box.get_active_id(), pls_mode=get_key_by_value(PLS_MODE, self._pls_mode_box.get_active_id()), pls_code=self._pls_code_entry.get_text(), is_id=self._is_id_entry.get_text())
def get_value_from_combobox_id(self, box: Gtk.ComboBox, dc: dict): cb_id = box.get_active_id() return get_key_by_value(dc, cb_id)
def get_transponder_services(self, tr_url, sat_position=None, use_pids=False): """ Returns services for given transponder. @param tr_url: transponder URL. @param sat_position: custom satellite position. Sometimes required to adjust the namespace. @param use_pids: if possible use additional pids [video, audio]. """ services = [] try: self.init_data(tr_url) except ValueError as e: log(e) else: pos, freq, sr, fec, pol, namespace, tid, nid = sat_position or 0, 0, 0, 0, 0, 0, 0, 0 sys = "DVB-S" pos_found = False tr = None # Transponder for r in filter(lambda x: x and 6 < len(x) < 9, self._rows): if not pos_found: pos_tr = re.match(self._POS_PAT, r[0].text) if not pos_tr: continue if not sat_position: pos = int( SatellitesParser.get_position("".join( c for c in pos_tr.group(1) if c.isdigit() or c.isalpha()))) pos_found = True if pos_found: text = " ".join(c.text for c in r[1:]) td = re.match(self._TR_PAT, text) if td: freq, pol = int(td.group(1)), get_key_by_value( POLARIZATION, td.group(2)) if td.group(5): log("Detected T2-MI transponder!") continue sys, mod, sr, _fec, = td.group(3), td.group( 4), td.group(6), td.group(7) nid, tid = td.group(8), td.group(9) neg_pos = False # POS = W # For negative (West) positions: 3600 - numeric position value!!! namespace = "{:04x}0000".format( 3600 - pos if neg_pos else pos) inv = 2 # Default fec = get_key_by_value(FEC, _fec) sys = get_key_by_value(SYSTEM, sys) tr_flag = 1 mod = get_key_by_value(MODULATION, mod) roll_off = 0 # 35% DVB-S2/DVB-S (default) pilot = 2 # Auto s2_flags = "" if sys == "DVB-S" else self._S2_TR.format( tr_flag, mod or 0, roll_off, pilot) nid, tid = int(nid), int(tid) tr = self._TR.format(freq, sr, pol, fec, pos, inv, sys, s2_flags) if not tr: msg = "ServicesParser error [get transponder services]: {}" er = "Transponder [{}] not found or its type [T2-MI, etc] not supported yet.".format( freq) log(msg.format(er)) return [] # Services for r in filter( lambda x: x and len(x) == 12 and (x[0].text.isdigit()), self._rows): sid, name, s_type, v_pid, a_pid, cas, pkg = r[0].text, r[ 2].text, r[4].text, r[5].text.strip(), r[6].text.split( ), r[9].text, r[10].text.strip() try: s_type = self._S_TYPES.get(s_type, "3") # 3 = Data _s_type = SERVICE_TYPE.get( s_type, SERVICE_TYPE.get("3")) # str repr sid = int(sid) data_id = "{:04x}:{}:{:04x}:{:04x}:{}:0:0".format( sid, namespace, tid, nid, s_type) fav_id = "{}:{}:{}:{}".format(sid, tid, nid, namespace) picon_id = "1_0_{:X}_{}_{}_{}_{}_0_0_0.png".format( int(s_type), sid, tid, nid, namespace) # Flags. flags = "p:{}".format(pkg) cas = ",".join( get_key_by_value(CAS, c) or "C:0000" for c in cas.split()) if cas else None if use_pids: v_pid = "c:00{:04x}".format( int(v_pid)) if v_pid else None a_pid = ",".join( ["c:01{:04x}".format(int(p)) for p in a_pid]) if a_pid else None flags = ",".join( filter(None, (flags, v_pid, a_pid, cas))) else: flags = ",".join(filter(None, (flags, cas))) services.append( Service(flags, "s", None, name, None, None, pkg, _s_type, r[1].img, picon_id, sid, freq, sr, pol, fec, sys, pos, data_id, fav_id, tr)) except ValueError as e: log("ServicesParser error [get transponder services]: {}". format(e)) return services
def get_kingofsat_services(self, sat_position=None, use_pids=False): services = [] # Transponder tr = list( filter( lambda r: len(r) == 13 and r[4].url and r[4].url.startswith( "tp.php?tp="), self._rows)) if not tr: log(f"ServicesParser error [get transponder services]: Transponder [{self._t_url}] not found!" ) return services tr, multi_tr, tid, nid, nsp = None, None, None, None, None freq, sr, pol, fec, sys, pos = None, None, None, None, None, None for r in filter(lambda x: len(x) > 12, self._rows): r_size = len(r) if r_size == 13 and r[4].url and r[4].url.startswith("tp.php?tp="): res = re.match(self._KING_TR_PAT, f"{r[6].text} {r[7].text}") if not res: continue sys, mod = res.group(1), res.group(5) s_pos, freq, pol, sr_fec = r[0].text, r[2].text, r[3].text, r[ 8].text nid, tid = r[10].text, r[11].text pos = sat_position if not sat_position: pos_tr = re.match(self._POS_PAT, s_pos) if pos_tr: pos = self.get_position(pos_tr.group(1)) sr, fec = sr_fec.split() pol = get_key_by_value(POLARIZATION, pol) sys, mod, fec, nsp, s2_flags, roll_off, pilot, inv = self.get_transponder_data( pos, fec, sys, mod) freq, nid, tid = int(float(freq)), int(nid), int(tid) tr = self._TR.format(freq, sr, pol, fec, pos, inv, sys, s2_flags) pls_mode, is_code, is_id = self._pls_modes.get( res.group(3), None), res.group(4), res.group(6) multi_tr = f"{tr}:{is_id}:{is_code}:{pls_mode}" if all( (pls_mode, is_code, is_id)) else None tid = int(is_id) if multi_tr else tid if res.group(2): log(f"Detected T2-MI transponder! [{freq} {sr}]") if multi_tr: log(f"Detected multi-stream transponder! [{freq} {sr}]") if tr and r_size == 14 and not r[1].text and r[7].text and r[ 7].text.isdigit(): if r[1].img == "/radio.gif": s_type = "" elif r[8].img == "/hd.gif": s_type = "HEVC HD" elif r[1].img == "/data.gif": s_type = "Data" else: s_type = "SD" s_type = self._S_TYPES.get(s_type, "3") _s_type = SERVICE_TYPE.get(s_type, SERVICE_TYPE.get("3")) name, pkg, cas, sid, v_pid, a_pid = r[2].text, r[5].text, r[ 6].text, r[7].text, None, None flags, sid, fav_id, picon_id, data_id = self.get_service_data( s_type, pkg, sid, tid, nid, nsp, v_pid, a_pid, cas, use_pids) services.append( Service(flags, "s", None, name, None, None, pkg, _s_type, None, picon_id, sid, str(freq), sr, pol, fec, sys, pos, data_id, fav_id, multi_tr or tr)) return services
def get_lyngsat_services(self, sat_position=None, use_pids=False): services = [] pos, freq, sr, fec, pol, nsp, tid, nid = sat_position or 0, 0, 0, 0, 0, 0, 0, 0 sys = "DVB-S" pos_found = False tr = None # Multi-stream. multi_tr = None multi = False # Transponder. for r in filter(lambda x: x and 6 < len(x) < 9, self._rows): if not pos_found: pos_tr = re.match(self._POS_PAT, r[0].text) if not pos_tr: continue if not sat_position: pos = self.get_position(pos_tr.group(1)) pos_found = True if pos_found: text = " ".join(c.text for c in r[1:]) td = re.match(self._TR_PAT, text) if td: freq, pol = int(td.group(1)), get_key_by_value( POLARIZATION, td.group(2)) sys, mod, sr, _fec, = td.group(3), td.group(4), td.group( 7), td.group(8) nid, tid = td.group(9), td.group(10) sys, mod, fec, nsp, s2_flags, roll_off, pilot, inv = self.get_transponder_data( pos, _fec, sys, mod) nid, tid = int(nid), int(tid) if td.group(5): log(f"Detected T2-MI transponder! [{freq} {sr} {pol}]") if td.group(6): log(f"Detected multi-stream transponder! [{freq} {sr} {pol}]" ) multi = True tr = self._TR.format(freq, sr, pol, fec, pos, inv, sys, s2_flags) if not tr: er = f"Transponder [{self._t_url}] not found or its type [T2-MI, etc] not supported yet." log(f"ServicesParser error [get transponder services]: {er}") return services # Services. for r in filter(None, self._rows): if multi and r[0].url: res = re.match(self._MULTI_PAT, r[0].url) if res: pls_mode, is_code, is_id = self._pls_modes.get( res.group(1), None), res.group(2), res.group(3) multi_tr = f"{tr}:{is_id}:{is_code}:{pls_mode}" if all( (pls_mode, is_code, is_id)) else None tid = int(is_id) if multi_tr else tid if len(r) == 12 and r[0].text.isdigit(): sid, name, s_type, v_pid, a_pid, cas, pkg = r[0].text, r[ 2].text, r[4].text, r[5].text.strip(), r[6].text.split( ), r[9].text, r[10].text.strip() try: s_type = self._S_TYPES.get(s_type, "3") # 3 = Data _s_type = SERVICE_TYPE.get( s_type, SERVICE_TYPE.get("3")) # str repr flags, sid, fav_id, picon_id, data_id = self.get_service_data( s_type, pkg, sid, tid, nid, nsp, v_pid, a_pid, cas, use_pids) services.append( Service(flags, "s", None, name, None, None, pkg, _s_type, r[1].img, picon_id, sid, freq, sr, pol, fec, sys, pos, data_id, fav_id, multi_tr or tr)) except ValueError as e: log(f"ServicesParser error [get transponder services]: {e}" ) return services