Source code for controllers.models.events

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Events
------

.. seealso::

    :ref:`event_format-label`
"""
from model_utilities import mangle_epg_text


#: constant for *event's service reference* key
KEY_SERVICE_REFERENCE = "service_reference"

#: constant for *event's service name* key
KEY_SERVICE_NAME = "service_name"

#: constant for *event start time* key
KEY_START_TIME = "start_time"

#: constant for *event ID* key
KEY_ID = "id"

#: constant for *event duration* key
KEY_DURATION = "duration"

#: constant for *event title* key
KEY_TITLE = "title"

#: constant for *event shortinfo* key
KEY_SHORTINFO = "shortinfo"

#: constant for *event longinfo* key
KEY_LONGINFO = "longinfo"

#: Begin
FLAG_BEGIN = "B"
#: Current Time
FLAG_CURRENT_TIME = "C"
#: Long Event Information
FLAG_LONGINFO = "E"
#: Duration
FLAG_DURATION = "D"
#: ID
FLAG_ITEM_ID = "I"
#: Service Name
FLAG_SERVICE_NAME = "N"
#: Short Service Name
FLAG_SHORT_SERVICE_NAME = "n"
#: Service Reference
FLAG_SERVICE_REFERENCE = "R"
#: Short Event Information
FLAG_SHORTINFO = "S"
#: Event Title
FLAG_TITLE = "T"

#: Event Flags including Current Time Field
FLAGS_FULL = ''.join(sorted(
    [FLAG_BEGIN, FLAG_CURRENT_TIME, FLAG_LONGINFO, FLAG_DURATION, FLAG_ITEM_ID,
     FLAG_SERVICE_NAME, FLAG_SERVICE_REFERENCE, FLAG_SHORTINFO, FLAG_TITLE]))

#: Event Flags without Current Time Field
FLAGS_ALL = ''.join(sorted(
    [FLAG_BEGIN, FLAG_LONGINFO, FLAG_DURATION, FLAG_ITEM_ID,
     FLAG_SERVICE_NAME, FLAG_SERVICE_REFERENCE, FLAG_SHORTINFO, FLAG_TITLE]))

#: Event Flags as used in :py:class:`controllers.web`
FLAGS_WEB = 'IBDCTSERN'

#: Services Key Map
SERVICES_KEY_MAP = {
    'id': FLAGS_WEB.index(FLAG_ITEM_ID),
    'begin_timestamp': FLAGS_WEB.index(FLAG_BEGIN),
    'duration_sec': FLAGS_WEB.index(FLAG_DURATION),
    'title': FLAGS_WEB.index(FLAG_TITLE),
    'shortdesc': FLAGS_WEB.index(FLAG_SHORTINFO),
    'longdesc': FLAGS_WEB.index(FLAG_LONGINFO),
    'sref': FLAGS_WEB.index(FLAG_SERVICE_REFERENCE),
    'sname': FLAGS_WEB.index(FLAG_SERVICE_NAME),
    'now_timestamp': FLAGS_WEB.index(FLAG_CURRENT_TIME),
}

#: Event Field Map
EVENT_FIELD_MAP = {
    "B": "start_time",
    "C": "current_time",
    "I": "id",
    "D": "duration",
    "T": "title",
    "S": "shortinfo",
    "E": "longinfo",
    "R": KEY_SERVICE_REFERENCE,
    "N": KEY_SERVICE_NAME,
    "n": "shortservice_name",
}


def mangle_event(event_obj, encoding="utf-8", with_component_data=True):
    data = dict(
        start_time=event_obj.getBeginTime(),
        duration=event_obj.getDuration(),
        title=event_obj.getEventName().decode(encoding),
        shortinfo=event_obj.getShortDescription().decode(encoding),
        longinfo=event_obj.getExtendedDescription().decode(encoding),
        id=event_obj.getEventId(),
    )

    if with_component_data:
        data['component_data'] = event_obj.getComponentData()

    return data


[docs]class EventDict(dict): """ Event data container object >>> dd_in = (123, 1506020400, 120*60, 1506020440, "DASDING Sprechstunde", None, None, "1:0:2:6F37:431:A401:FFFF0000:0:0:0:", "DASDING") # NOQA >>> sed = EventDict(dd_in) >>> sed['id'] 123 >>> sed['start_time'] 1506020400 >>> sed['duration'] 7200 """ def __init__(self, raw_data, flag_string=None): dict.__init__(self) if flag_string is None: flag_string = FLAGS_WEB flags = list(flag_string.replace("X", '')) for flag_key, value in zip(flags, raw_data): key = EVENT_FIELD_MAP[flag_key] self[key] = value self._mangle() def _mangle(self): text_keys = ("shortinfo", "longinfo", "title", KEY_SERVICE_NAME, "shortservice_name") for tkey in text_keys: if tkey in self: self[tkey] = mangle_epg_text(self[tkey])
[docs]class NoneEventDict(dict): """ Dummy event data container object. """ def __init__(self, title=""): dict.__init__(self) self[KEY_SERVICE_REFERENCE] = "-1:0:0:0:0:0:0:0:0:0:" self[KEY_SERVICE_NAME] = "NONAME" self[KEY_START_TIME] = 0 self[KEY_ID] = 0 self[KEY_DURATION] = 0 self[KEY_TITLE] = title self[KEY_SHORTINFO] = "" self[KEY_LONGINFO] = ""
[docs]class ServicesEventDict(dict): """ Event data container object as used by EPG lookups in services.py .. deprecated:: 0.31 replaced by :obj:`EventDict` >>> dd_in = (123, 1506020400, 120*60, 1506020440, "DASDING Sprechstunde", None, None, "1:0:2:6F37:431:A401:FFFF0000:0:0:0:", "DASDING") # NOQA >>> sed = ServicesEventDict(dd_in) >>> sed['id'] 123 >>> sed['begin_timestamp'] 1506020400 >>> sed['duration_sec'] 7200 """ def __init__(self, raw_data, now_next_mode=False, mangle_html=True): dict.__init__(self) for key in SERVICES_KEY_MAP: idx = SERVICES_KEY_MAP[key] self[key] = raw_data[idx] if mangle_html: self['sname'] = mangle_epg_text(self['sname']) if now_next_mode: if self['begin_timestamp'] == 0: self['duration_sec'] = 0 self['title'] = 'N/A' self['shortdesc'] = '' self['longdesc'] = '' self['now_timestamp'] = 0 self['remaining'] = 0 else: current_timestamp = self['now_timestamp'] if current_timestamp > self['begin_timestamp']: self['remaining'] = self['begin_timestamp'] + self[ 'duration_sec'] - current_timestamp else: self['remaining'] = self['duration_sec']
if __name__ == '__main__': import doctest (FAILED, SUCCEEDED) = doctest.testmod() print("[doctest] SUCCEEDED/FAILED: {:d}/{:d}".format(SUCCEEDED, FAILED))