Esempio n. 1
0
    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
Esempio n. 2
0
    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())
Esempio n. 4
0
 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)
Esempio n. 5
0
    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
Esempio n. 6
0
    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
Esempio n. 7
0
    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