Source code for controllers.service

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import logging

from enigma import eServiceCenter, eServiceReference
from Screens.ChannelSelection import service_types_tv, service_types_radio

from utilities import parse_servicereference, mangle_snp, SERVICE_KIND_COMMENT
from utilities import parse_simple_index, mangle_service_type_arg

ROOT_FMT = '{:s} FROM BOUQUET "{:s}" ORDER BY bouquet'
LIST_FMT = "SN"
BLACKLISTED_SERVICE_KIND = (SERVICE_KIND_COMMENT,)

SNP_INDEX = "/etc/enigma2/snp.index"


[docs]class ServiceController(object): """ Available services listing and conversions. """ def __init__(self, *args, **kwargs): self.log = logging.getLogger(__name__) self.esc_instance = eServiceCenter.getInstance() self.raise_exceptions = kwargs.get("may_raise", False) self.snp_index = None if os.path.isfile(SNP_INDEX): self.snp_index = parse_simple_index(SNP_INDEX) def _mangle_snp(self, service_name): snp_name = mangle_snp(service_name) if not snp_name: return '--------' if self.snp_index is not None: try: return self.snp_index[snp_name] except KeyError: pass return snp_name
[docs] def get_services_set(self, service_types=None, **kwargs): """ Retrieve a set of service names and references available on device. Args: service_types: Service types to list all(None), tv or radio """ services_set = set() bouquet_index = [ (service_types_tv, 'bouquets.tv'), (service_types_radio, 'bouquets.radio'), ] service_type_whitelist = set() if service_types is None: pass elif isinstance(service_types, (list, set, tuple)): for item in service_types: service_type_whitelist |= mangle_service_type_arg(item) else: service_type_whitelist |= mangle_service_type_arg(service_types) for service_type_selector, bouquet in bouquet_index: root = eServiceReference( ROOT_FMT.format(service_type_selector, bouquet)) slist = self.esc_instance.list(root) # list for (b_service_reference, b_service_name) in slist.getContent( LIST_FMT, True): self.log.debug("BOUQUET : {!r}".format(b_service_name)) # bouquet root b_root = eServiceReference(b_service_reference) self.log.debug(b_root) # bouquet items list iterator b_list = self.esc_instance.list(b_root) # bouquet items list b_items = b_list.getContent(LIST_FMT, True) for (service_reference, service_name) in b_items: x = service_reference, service_name.decode("utf-8") psref = parse_servicereference(service_reference, extended=True) if psref['kind'] in BLACKLISTED_SERVICE_KIND: continue if service_type_whitelist: if psref['service_type'] not in service_type_whitelist: continue services_set.add(x) self.log.debug(x) for sr, sn in services_set: yield sr, sn, self._mangle_snp(sn)