def get_bouquet(path, name, bq_type): """ Parsing services ids from bouquet file """ with open(path + "userbouquet.{}.{}".format(name, bq_type), encoding="utf-8", errors="replace") as file: chs_list = file.read() services = [] srvs = list(filter(None, chs_list.split("\n#SERVICE"))) # filtering [''] for ch in srvs[1:]: ch_data = ch.strip().split(":") if ch_data[1] == "64": services.append( BouquetService(ch_data[-1].split("\n")[0], BqServiceType.MARKER, ch, ch_data[2])) elif "http" in ch: services.append( BouquetService(ch_data[-1].split("\n")[0], BqServiceType.IPTV, ch, 0)) else: fav_id = "{}:{}:{}:{}".format(ch_data[3], ch_data[4], ch_data[5], ch_data[6]) name = None if len(ch_data) == 12: name, desc = str(ch_data[-1]).split("\n#DESCRIPTION") services.append( BouquetService(name, BqServiceType.DEFAULT, fav_id, 0)) return srvs[0].lstrip("#NAME").strip(), services
def get_bouquet(path, bq_name, bq_type, prefix="userbouquet"): """ Parsing services ids from bouquet file. """ with open(path + "{}.{}.{}".format(prefix, bq_name, bq_type), encoding="utf-8", errors="replace") as file: chs_list = file.read() services = [] srvs = list(filter(None, chs_list.split("\n#SERVICE"))) # filtering [''] # May come across empty[wrong] files! if not srvs: log("Bouquet file 'userbouquet.{}.{}' is empty or wrong!". format(bq_name, bq_type)) return "{} [empty]".format(bq_name), services bq_name = srvs.pop(0) for num, srv in enumerate(srvs, start=1): srv_data = srv.strip().split(":") s_type = srv_data[1] if s_type == "64": m_data, sep, desc = srv.partition("#DESCRIPTION") services.append( BouquetService(desc.strip() if desc else "", BqServiceType.MARKER, srv, num)) elif s_type == "832": m_data, sep, desc = srv.partition("#DESCRIPTION") services.append( BouquetService(desc.strip() if desc else "", BqServiceType.SPACE, srv, num)) elif s_type == "134": alt = re.match(BouquetsReader._ALT_PAT, srv) if alt: alt_name, alt_type = alt.group(1), alt.group(2) alt_bq_name, alt_srvs = BouquetsReader.get_bouquet( path, alt_name, alt_type, "alternatives") services.append( BouquetService(alt_bq_name, BqServiceType.ALT, alt_name, tuple(alt_srvs))) elif srv_data[0].strip( ) in BouquetsReader._STREAM_TYPES or srv_data[10].startswith( ("http", "rtsp")): stream_data, sep, desc = srv.partition("#DESCRIPTION") desc = desc.lstrip( ":").strip() if desc else srv_data[-1].strip() services.append( BouquetService(desc, BqServiceType.IPTV, srv, num)) else: fav_id = "{}:{}:{}:{}".format(srv_data[3], srv_data[4], srv_data[5], srv_data[6]) name = None if len(srv_data) == 12: name, sep, desc = str( srv_data[-1]).partition("\n#DESCRIPTION") services.append( BouquetService(name, BqServiceType.DEFAULT, fav_id.upper(), num)) return bq_name.lstrip("#NAME").strip(), services
def append_bouquets(bq_type, bq_view, callback, fav_id_index, index, model, names, s_type, wait_dialog=None): bq_index = 0 if s_type is SettingsType.ENIGMA_2 else 1 bq_view.expand_row(Gtk.TreePath(bq_index), 0) bqs_model = bq_view.get_model() bouquets_names = get_bouquets_names(bqs_model) for pos, name in enumerate(sorted(names)): if name not in bouquets_names: services = [ BouquetService(None, BqServiceType.DEFAULT, row[fav_id_index], 0) for row in model if row[index] == name ] callback( Bouquet(name=name, type=bq_type, services=services, locked=None, hidden=None), bqs_model.get_iter(bq_index)) if wait_dialog is not None: wait_dialog.destroy()
def get_refs_from_xml(path): """ Returns tuple from references and description. """ refs = [] dom = parse(path) description = "".join(n.data + "\n" for n in dom.childNodes if n.nodeType == Node.COMMENT_NODE) for elem in dom.getElementsByTagName("channels"): c_count = 0 comment_count = 0 current_data = "" if elem.hasChildNodes(): for n in elem.childNodes: if n.nodeType == Node.COMMENT_NODE: c_count += 1 comment_count += 1 txt = n.data.strip() if comment_count: comment_count -= 1 else: ref_data = current_data.split(":") refs.append(BouquetService(name=txt, type=BqServiceType.DEFAULT, data="{}:{}:{}:{}".format(*ref_data[3:7]).upper(), num="{}:{}:{}".format(*ref_data[3:6]).upper())) if n.hasChildNodes(): for s_node in n.childNodes: if s_node.nodeType == Node.TEXT_NODE: comment_count -= 1 current_data = s_node.data return refs, description
def get_bouquet(path, bq_name, bq_type): """ Parsing services ids from bouquet file. """ with open(path + "userbouquet.{}.{}".format(bq_name, bq_type), encoding="utf-8", errors="replace") as file: chs_list = file.read() services = [] srvs = list(filter(None, chs_list.split("\n#SERVICE"))) # filtering [''] # May come across empty[wrong] files! if not srvs: log("Bouquet file 'userbouquet.{}.{}' is empty or wrong!".format( bq_name, bq_type)) return "{} [empty]".format(bq_name), services bq_name = srvs.pop(0) for num, srv in enumerate(srvs, start=1): srv_data = srv.strip().split(":") if srv_data[1] == "64": m_data, sep, desc = srv.partition("#DESCRIPTION") services.append( BouquetService(desc.strip() if desc else "", BqServiceType.MARKER, srv, num)) elif srv_data[1] == "832": m_data, sep, desc = srv.partition("#DESCRIPTION") services.append( BouquetService(desc.strip() if desc else "", BqServiceType.SPACE, srv, num)) elif "http" in srv or srv_data[0] == "8193": stream_data, sep, desc = srv.partition("#DESCRIPTION") desc = desc.lstrip( ":").strip() if desc else srv_data[-1].strip() services.append( BouquetService(desc, BqServiceType.IPTV, srv, num)) else: fav_id = "{}:{}:{}:{}".format(srv_data[3], srv_data[4], srv_data[5], srv_data[6]) name = None if len(srv_data) == 12: name, sep, desc = str( srv_data[-1]).partition("\n#DESCRIPTION") services.append( BouquetService(name, BqServiceType.DEFAULT, fav_id.upper(), num)) return bq_name.lstrip("#NAME").strip(), services
def gen_bouquets(view, bq_view, transient, gen_type, s_type, callback): """ Auto-generate and append list of bouquets. """ model, paths = view.get_selection().get_selected_rows() single_types = (BqGenType.SAT, BqGenType.PACKAGE, BqGenType.TYPE) if gen_type in single_types: if not is_only_one_item_selected(paths, transient): return fav_id_index = Column.SRV_FAV_ID index = Column.SRV_TYPE if gen_type in (BqGenType.PACKAGE, BqGenType.EACH_PACKAGE): index = Column.SRV_PACKAGE elif gen_type in (BqGenType.SAT, BqGenType.EACH_SAT): index = Column.SRV_POS # Splitting services [caching] by column value. s_data = defaultdict(list) for row in model: s_data[row[index]].append( BouquetService(None, BqServiceType.DEFAULT, row[fav_id_index], 0)) bq_type = BqType.BOUQUET.value if s_type is SettingsType.NEUTRINO_MP else BqType.TV.value bq_index = 0 if s_type is SettingsType.ENIGMA_2 else 1 bq_root_iter = bq_view.get_model().get_iter(bq_index) srv = Service(*model[paths][:Column.SRV_TOOLTIP]) cond = srv.package if gen_type is BqGenType.PACKAGE else srv.pos if gen_type is BqGenType.SAT else srv.service_type bq_view.expand_row(Gtk.TreePath(bq_index), 0) bq_names = get_bouquets_names(bq_view.get_model()) if gen_type in single_types: if cond in bq_names: show_dialog(DialogType.ERROR, transient, "A bouquet with that name exists!") else: callback(Bouquet(cond, bq_type, s_data.get(cond)), bq_root_iter) else: # We add a bouquet only if the given name is missing [keys - names]! for name in sorted(s_data.keys() - bq_names): callback(Bouquet(name, BqType.TV.value, s_data.get(name)), bq_root_iter)
def on_save_to_xml(self, item): response = show_dialog(DialogType.CHOOSER, self._dialog, settings=self._settings) if response in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT): return services = [] iptv_types = (BqServiceType.IPTV.value, BqServiceType.MARKER.value) for r in self._bouquet_model: srv_type = r[Column.FAV_TYPE] if srv_type in iptv_types: srv = BouquetService(name=r[Column.FAV_SERVICE], type=BqServiceType(srv_type), data=r[Column.FAV_ID], num=r[Column.FAV_NUM]) services.append(srv) ChannelsParser.write_refs_to_xml( "{}{}.xml".format(response, self._bouquet_name), services) self.show_info_message(get_message("Done!"), Gtk.MessageType.INFO)
def get_bouquet(path, bq_name, bq_type, prefix="userbouquet"): """ Parsing services ids from bouquet file. """ with open(f"{path}{prefix}.{bq_name}.{bq_type}", encoding="utf-8", errors="replace") as file: chs_list = file.read() services = [] srvs = list(filter(None, chs_list.split("\n#SERVICE"))) # filtering [''] # May come across empty[wrong] files! if not srvs: log(f"Bouquet file 'userbouquet.{bq_name}.{bq_type}' is empty or wrong!" ) return f"{bq_name} [empty]", services bq_name = srvs.pop(0) for num, srv in enumerate(srvs, start=1): srv_data = srv.strip().split(":") data_len = len(srv_data) if data_len < 10: log(f"The bouquet [{bq_name}] service [{num}] has the wrong data format: [{srv}]" ) continue s_type = ServiceType(srv_data[1]) if s_type is ServiceType.MARKER: m_data, sep, desc = srv.partition("#DESCRIPTION") services.append( BouquetService(desc.strip() if desc else "", BqServiceType.MARKER, srv, num)) elif s_type is ServiceType.SPACE: m_data, sep, desc = srv.partition("#DESCRIPTION") services.append( BouquetService(desc.strip() if desc else "", BqServiceType.SPACE, srv, num)) elif s_type is ServiceType.ALT: alt = re.match(BouquetsReader._ALT_PAT, srv) if alt: alt_name, alt_type = alt.group(1), alt.group(2) alt_bq_name, alt_srvs = BouquetsReader.get_bouquet( path, alt_name, alt_type, "alternatives") services.append( BouquetService(alt_bq_name, BqServiceType.ALT, alt_name, tuple(alt_srvs))) elif s_type is ServiceType.BOUQUET: sub = re.match(BouquetsReader._SUB_BQ_PAT, srv) if sub: sub_name, sub_type = sub.group(1), sub.group(2) sub_bq_name, sub_srvs = BouquetsReader.get_bouquet( path, sub_name, sub_type, "subbouquet") bq = Bouquet(sub_bq_name, sub_type, tuple(sub_srvs), None, None, sub_name) services.append( BouquetService(sub_bq_name, BqServiceType.BOUQUET, bq, num)) elif srv_data[0].strip( ) in BouquetsReader._STREAM_TYPES or srv_data[10].startswith( ("http", "rtsp")): stream_data, sep, desc = srv.partition("#DESCRIPTION") desc = desc.lstrip( ":").strip() if desc else srv_data[-1].strip() services.append( BouquetService(desc, BqServiceType.IPTV, srv, num)) else: fav_id = f"{srv_data[3]}:{srv_data[4]}:{srv_data[5]}:{srv_data[6]}" name = None if data_len == 12: name, sep, desc = str( srv_data[-1]).partition("\n#DESCRIPTION") services.append( BouquetService(name, BqServiceType.DEFAULT, fav_id.upper(), num)) return bq_name.lstrip("#NAME").strip(), services