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 init_xml_source(self, refs): path = self._epg_dat_path_entry.get_text( ) if self._use_web_source else self._xml_chooser_button.get_filename() if not path: self.show_info_message("The path to the xml file is not set!", Gtk.MessageType.ERROR) return if self._use_web_source: # Downloading gzipped xml file that contains services names with references from the web. self._download_xml_is_active = True self.update_active_header_elements(False) url = self._url_to_xml_entry.get_text() try: with urllib.request.urlopen(url, timeout=2) as fp: headers = fp.info() content_type = headers.get("Content-Type", "") if content_type != "application/gzip": self._download_xml_is_active = False raise ValueError("{} {} {}".format( get_message("Download XML file error."), get_message("Unsupported file type:"), content_type)) file_name = os.path.basename(url) data_path = self._epg_dat_path_entry.get_text() with open(data_path + file_name, "wb") as tfp: bs = 1024 * 8 size = -1 read = 0 b_num = 0 if "content-length" in headers: size = int(headers["Content-Length"]) while self._download_xml_is_active: block = fp.read(bs) if not block: break read += len(block) tfp.write(block) b_num += 1 self.update_download_progress(b_num * bs / size) yield True path = tfp.name.rstrip(".gz") except (HTTPError, URLError) as e: raise ValueError("{} {}".format( get_message("Download XML file error."), e)) else: try: with open(path, "wb") as f_out: with gzip.open(tfp.name, "rb") as f: shutil.copyfileobj(f, f_out) os.remove(tfp.name) except Exception as e: raise ValueError("{} {}".format( get_message("Unpacking data error."), e)) finally: self._download_xml_is_active = False self.update_active_header_elements(True) try: s_refs, info = ChannelsParser.get_refs_from_xml(path) yield True except Exception as e: raise ValueError("{} {}".format(get_message("XML parsing error:"), e)) else: if refs: s_refs = filter(lambda x: x.num in refs, s_refs) list( map(lambda s: self._services_model.append((s.name, s.data)), s_refs)) self.update_source_info(info) self.update_source_count_info() yield True