def updateAndReadServicesFastscan(self, namespace, transponders, servicehacks, transport_stream_id_list, logical_channel_number_dict): print>>log, "[DvbScanner] Reading services..." fd = dvbreader.open(self.demuxer_device, self.fastscan_pid, self.fastscan_table_id, 0xff, self.frontend) if fd < 0: print>>log, "[DvbScanner] Cannot open the demuxer" return None fastscan_section_version = -1 fastscan_section_id = -1 fastscan_sections_read = [] fastscan_sections_count = 0 fastscan_content = [] timeout = datetime.datetime.now() timeout += datetime.timedelta(0, self.TIMEOUT_SEC) while True: if datetime.datetime.now() > timeout: print>>log, "[DvbScanner] Timed out" break section = dvbreader.read_fastscan(fd, self.fastscan_table_id) if section is None: time.sleep(0.1) # no data.. so we wait a bit continue if section["header"]["table_id"] == self.fastscan_table_id: if (section["header"]["version_number"] != fastscan_section_version or section["header"]["fastscan_id"] != fastscan_section_id): fastscan_section_version = section["header"]["version_number"] fastscan_section_id = section["header"]["fastscan_id"] fastscan_sections_read = [] fastscan_content = [] fastscan_sections_count = section["header"]["last_section_number"] + 1 if section["header"]["section_number"] not in fastscan_sections_read: fastscan_sections_read.append(section["header"]["section_number"]) fastscan_content += section["content"] if len(fastscan_sections_read) == fastscan_sections_count: break dvbreader.close(fd) service_count = 0 tmp_services_dict = {} for section in fastscan_content: service = section key = "%x:%x:%x" % (service["transport_stream_id"], service["original_network_id"], service["service_id"]) if key not in logical_channel_number_dict: continue if logical_channel_number_dict[key]["visible_service_flag"] == 0: continue service["free_ca"] = 1 service["namespace"] = namespace service["flags"] = 0 service["number"] = logical_channel_number_dict[key]["logical_channel_number"] if key in tmp_services_dict: tmp_services_dict[key]["numbers"].append(service["number"]) else: service["numbers"] = [service["number"]] tmp_services_dict[key] = service service_count += 1 print>>log, "[DvbScanner] Read %d services" % service_count video_services = {} radio_services = {} service_extra_count = 0 for key in tmp_services_dict: service = tmp_services_dict[key] if len(servicehacks) > 0: skip = False exec(servicehacks) if skip: continue tpkey = "%x:%x:%x" % (service["namespace"], service["transport_stream_id"], service["original_network_id"]) if tpkey not in transponders: continue transponders[tpkey]["services"][service["service_id"]] = service service_extra_count += 1 if service["service_type"] in DvbScanner.VIDEO_ALLOWED_TYPES or service["service_type"] in DvbScanner.INTERACTIVE_ALLOWED_TYPES: for number in service["numbers"]: if number not in video_services: video_services[number] = service else: for number in service["numbers"]: if number not in radio_services: radio_services[number] = service print>>log, "[DvbScanner] %d valid services" % service_extra_count return { "video": video_services, "radio": radio_services }
def updateAndReadServicesFastscan( self, namespace, transponders, servicehacks, transport_stream_id_list, logical_channel_number_dict ): print >> log, "[DvbScanner] Reading services..." fd = dvbreader.open(self.demuxer_device, self.fastscan_pid, self.fastscan_table_id, 0xFF, self.frontend) if fd < 0: print >> log, "[DvbScanner] Cannot open the demuxer" return None fastscan_section_version = -1 fastscan_section_id = -1 fastscan_sections_read = [] fastscan_sections_count = 0 fastscan_content = [] timeout = datetime.datetime.now() timeout += datetime.timedelta(0, self.TIMEOUT_SEC) while True: if datetime.datetime.now() > timeout: print >> log, "[DvbScanner] Timed out" break section = dvbreader.read_fastscan(fd, self.fastscan_table_id) if section is None: time.sleep(0.1) # no data.. so we wait a bit continue if section["header"]["table_id"] == self.fastscan_table_id: if ( section["header"]["version_number"] != fastscan_section_version or section["header"]["fastscan_id"] != fastscan_section_id ): fastscan_section_version = section["header"]["version_number"] fastscan_section_id = section["header"]["fastscan_id"] fastscan_sections_read = [] fastscan_content = [] fastscan_sections_count = section["header"]["last_section_number"] + 1 if section["header"]["section_number"] not in fastscan_sections_read: fastscan_sections_read.append(section["header"]["section_number"]) fastscan_content += section["content"] if len(fastscan_sections_read) == fastscan_sections_count: break dvbreader.close(fd) service_count = 0 tmp_services_dict = {} for section in fastscan_content: service = section key = "%x:%x:%x" % (service["transport_stream_id"], service["original_network_id"], service["service_id"]) if key not in logical_channel_number_dict: continue if logical_channel_number_dict[key]["visible_service_flag"] == 0: continue service["free_ca"] = 1 service["namespace"] = namespace service["flags"] = 0 service["number"] = logical_channel_number_dict[key]["logical_channel_number"] if key in tmp_services_dict: tmp_services_dict[key]["numbers"].append(service["number"]) else: service["numbers"] = [service["number"]] tmp_services_dict[key] = service service_count += 1 print >> log, "[DvbScanner] Read %d services" % service_count video_services = {} radio_services = {} service_extra_count = 0 for key in tmp_services_dict: service = tmp_services_dict[key] if len(servicehacks) > 0: skip = False exec (servicehacks) if skip: continue tpkey = "%x:%x:%x" % (service["namespace"], service["transport_stream_id"], service["original_network_id"]) if tpkey not in transponders: continue transponders[tpkey]["services"][service["service_id"]] = service service_extra_count += 1 if ( service["service_type"] in DvbScanner.VIDEO_ALLOWED_TYPES or service["service_type"] in DvbScanner.INTERACTIVE_ALLOWED_TYPES ): for number in service["numbers"]: if number not in video_services: video_services[number] = service else: for number in service["numbers"]: if number not in radio_services: radio_services[number] = service print >> log, "[DvbScanner] %d valid services" % service_extra_count return {"video": video_services, "radio": radio_services}
def updateAndReadServicesFastscan(self, namespace, transponders, servicehacks, transport_stream_id_list, logical_channel_number_dict): print>>log, "[DvbScanner] Reading services..." fd = dvbreader.open(self.demuxer_device, self.fastscan_pid, self.fastscan_table_id, 0xff, self.frontend) if fd < 0: print>>log, "[DvbScanner] Cannot open the demuxer" return None fastscan_section_version = -1 fastscan_section_id = -1 fastscan_sections_read = [] fastscan_sections_count = 0 fastscan_content = [] timeout = datetime.datetime.now() timeout += datetime.timedelta(0, self.TIMEOUT_SEC) while True: if datetime.datetime.now() > timeout: print>>log, "[DvbScanner] Timed out" break section = dvbreader.read_fastscan(fd, self.fastscan_table_id) if section is None: time.sleep(0.1) # no data.. so we wait a bit continue if section["header"]["table_id"] == self.fastscan_table_id: if (section["header"]["version_number"] != fastscan_section_version or section["header"]["fastscan_id"] != fastscan_section_id): fastscan_section_version = section["header"]["version_number"] fastscan_section_id = section["header"]["fastscan_id"] fastscan_sections_read = [] fastscan_content = [] fastscan_sections_count = section["header"]["last_section_number"] + 1 if section["header"]["section_number"] not in fastscan_sections_read: fastscan_sections_read.append(section["header"]["section_number"]) fastscan_content += section["content"] if len(fastscan_sections_read) == fastscan_sections_count: break dvbreader.close(fd) # to ignore services on not configured satellites if config.autobouquetsmaker.skipservices.value: from Components.NimManager import nimmanager nims = nimmanager.getNimListOfType("DVB-S") orbitals_configured = [] for nim in nims: sats = nimmanager.getSatListForNim(nim) for sat in sats: if sat[0] not in orbitals_configured: orbitals_configured.append(sat[0]) service_count = 0 tmp_services_dict = {} for section in fastscan_content: service = section key = "%x:%x:%x" % (service["transport_stream_id"], service["original_network_id"], service["service_id"]) if key not in logical_channel_number_dict: continue if logical_channel_number_dict[key]["visible_service_flag"] == 0: continue if not hasattr(service, "free_ca"): service["free_ca"] = 1 if not hasattr(service, "namespace"): try: service["namespace"] = service["namespace"] = logical_channel_number_dict[key]["transponder"]["namespace"] except: service["namespace"] = namespace if not hasattr(service, "flags"): service["flags"] = 0 service["number"] = logical_channel_number_dict[key]["logical_channel_number"] service["orbital_position"] = service["namespace"] / (16**4) if key in tmp_services_dict: tmp_services_dict[key]["numbers"].append(service["number"]) else: service["numbers"] = [service["number"]] tmp_services_dict[key] = service service_count += 1 print>>log, "[DvbScanner] Read %d services" % service_count video_services = {} radio_services = {} service_extra_count = 0 services_without_transponders = 0 for key in self.LCN_order(tmp_services_dict): service = tmp_services_dict[key] if config.autobouquetsmaker.skipservices.value and service["orbital_position"] not in orbitals_configured: continue if len(servicehacks) > 0: skip = False exec(servicehacks) if skip: continue tpkey = "%x:%x:%x" % (service["namespace"], service["transport_stream_id"], service["original_network_id"]) if tpkey not in transponders: services_without_transponders += 1 continue transponders[tpkey]["services"][service["service_id"]] = service service_extra_count += 1 if service["service_type"] in DvbScanner.VIDEO_ALLOWED_TYPES or service["service_type"] in DvbScanner.INTERACTIVE_ALLOWED_TYPES: for number in service["numbers"]: if number not in video_services: video_services[number] = service else: for number in service["numbers"]: if number not in radio_services: radio_services[number] = service print>>log, "[DvbScanner] %d valid services" % service_extra_count if services_without_transponders: print>>log, "[DvbScanner] %d services omitted as there is no corresponding transponder" % services_without_transponders return { "video": video_services, "radio": radio_services }