コード例 #1
0
	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
		}
コード例 #2
0
    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}
コード例 #3
0
ファイル: dvbscanner.py プロジェクト: tuxdell/GOS-plugins
	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
		}