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

import re, time, datetime

__version__ = '0.1.0'

class TVProgramInfo:
    def __init__(self):
        self._org_codec = 'sjis'
        self.station, self.title, self.subtitle = '', '', ''
        self.description, self.performer, self.memo = '', '', ''
        self.start_t, self.end_t = (), ()

    def _get_codec(self, _h):
        _pat = re.compile('; charset=(.*?)\r\n')
        _searched = _pat.search(_h)
        if _searched:
            self._org_codec = _searched.group(1)

    def _get_time_t(self, _y, _m, _d, _H, _M):
        _d = datetime.date(_y, _m, _d) + datetime.timedelta(hours = _H)

        if _M < 0:
            _t = (_d.year, _d.month, _d.day, _H % 24, 0, 0, 0, 0, 0)
        elif _m < 60:
            _t = (_d.year, _d.month, _d.day, _H % 24, _M, 0, 0, 0, 0)
        else:
            _t = (_d.year, _d.month, _d.day, _H % 24, 59, 0, 0, 0, 0)

        return time.localtime(time.mktime(_t))

    def _parse_header(self, _h):
        self._get_codec(_h)

        _lines = _h.splitlines()
        for _line in _lines:
            _t = _line.split(': ', 2)
            if len(_t) == 2:
                _key, _value = _t[0], _t[1]
            else:
                _key, _value = _t[0], ''

            if _key == 'station':
                self.station = unicode(_value, self._org_codec)
            elif _key == 'program-title':
                self.title = unicode(_value, self._org_codec)
            elif _key == 'program-subtitle':
                self.subtitle = unicode(_value, self._org_codec)
            elif _key == 'description':
                self.description = unicode(_value, self._org_codec)
            elif _key == 'performer':
                self.performer = unicode(_value, self._org_codec)
            elif _key == 'year':
                _y = int(_value)
            elif _key == 'month':
                _m = int(_value)
            elif _key == 'date':
                _d = int(_value)
            elif _key == 'start':
                _HM = _value.split(':')
                _s_H = int(_HM[0])
                _s_M = int(_HM[1])
            elif _key == 'end':
                _HM = _value.split(':')
                _e_H = int(_HM[0])
                _e_M = int(_HM[1])

        self.start_t = self._get_time_t(_y, _m, _d, _s_H, _s_M)
        self.end_t = self._get_time_t(_y, _m, _d, _e_H, _e_M)

    def _parse_body(self, _b):
        self.memo = unicode(_b, self._org_codec, 'ignore')

    def parse(self, src):
        _t = src.split('\r\n\r\n', 2)
        if len(_t) == 2:
            self._parse_header(_t[0])
            self._parse_body(_t[1])
        else:
            self._parse_header(_t[0])
            self.memo = u''

if __name__ == '__main__':
    import sys

    f = file(sys.argv[1])
    p = f.read()
    f.close()

    tvpi = TVProgramInfo()
    tvpi.parse(p)
    print 'Station:', tvpi.station.encode('euc-jp')
    print 'Title:', tvpi.title.encode('euc-jp')
    if tvpi.subtitle:
        print 'Sub Title:', tvpi.subtitle.encode('euc-jp')
    print 'Start:', tvpi.start_t
    print 'End:', tvpi.end_t
    if tvpi.performer:
        print 'Performer:', tvpi.performer.encode('euc-jp')
    if tvpi.description:
        print 'Description:', tvpi.description.encode('euc-jp')
    if tvpi.memo:
        print 'Memo:', tvpi.memo.encode('euc-jp')