
]c        	   @   s8  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l j	 Z
 d  d l Z d  d l Z d  d l Z e j d d d d d e j d	 d
  d d4 d     YZ d d5 d     YZ d d6 d     YZ d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z  d   Z! d   Z" d    Z# d!   Z$ d"   Z% d#   Z& d$   Z' d%   Z( d&   Z) d'   Z* d(   Z+ d)   Z, d*   Z- d+   Z. d,   Z/ d-   Z0 d.   Z1 d/   Z2 d0   Z3 d1   Z4 d2   Z5 d3   Z6 d S(7   iN(   t   datetime(   t	   timedeltat   formats'   %(asctime)s %(levelname)-8s %(message)st   filenames   /var/www/epg/log.txtt   levelt   datefmts   %Y-%m-%d %H:%M:%St   Providerc           B   s   e  Z d    Z RS(   c         C   s   d |  _  d |  _ d  S(   Nt    (   t   idt   name(   t   self(    (    s   /var/www/epg/epg_db.pyt   __init__   s    	(   t   __name__t
   __module__R   (    (    (    s   /var/www/epg/epg_db.pyR      s   t   Channelc           B   s   e  Z d    Z RS(   c         C   s:   d |  _  d |  _ d |  _ d |  _ d |  _ d |  _ d  S(   NR   (   R   t   callSignt   affiliateCallSignR	   t   numbert   imageUrl(   R
   (    (    s   /var/www/epg/epg_db.pyR      s    					(   R   R   R   (    (    (    s   /var/www/epg/epg_db.pyR      s   t   Programc           B   s   e  Z d    Z RS(   c         C   sC   d |  _  d  |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d  S(   NR   i    t   NA(   t   titlet   Nonet	   startTimet   durationMinst   descriptionR   t   genrest   cast(   R
   (    (    s   /var/www/epg/epg_db.pyR   $   s    						(   R   R   R   (    (    (    s   /var/www/epg/epg_db.pyR   #   s   c          C   sY   t  j d d d t j  }  |  j d t  } | j d  t   |  j   | j	   d  S(   Nt   usert   roott   passwordt   buffereds	   use zvepg(
   t   mariadbt   connectt   system_definest   mariaDbPasswordt   cursort   Truet   executet   createDbTablest   committ   close(   t   mariadb_connectionR$   (    (    s   /var/www/epg/epg_db.pyt   updateDb.   s    	
c          C   s   t  j d  }  t j d j t j |    t j d d d t j  } | j	 d t
  } y | j d  Wn t j k
 r n X| j d  | j d	  t   d  S(
   Ns   %Y%m%d-%H%M%Ss0   mysqldump -u root -p{} zvepg > zvepg_save_{}.sqlR   R   R   R   s   drop database zvepgs+   CREATE DATABASE zvepg CHARACTER SET ='utf8's	   use zvepg(   t   timet   strftimet   ost   systemR   R"   R#   R    R!   R$   R%   R&   t   ErrorR'   (   t   timestrR*   R$   (    (    s   /var/www/epg/epg_db.pyt   resetDb@   s    c          C   sj  t  j d d d t j  }  |  j d t  } | j d  d } y | j |  Wn> t  j k
 r } | j d k r t	 j
 d j |   q n Xd	 } y | j |  Wn> t  j k
 r } | j d k r t	 j
 d j |   q n Xd
 } y | j |  Wn> t  j k
 rA} | j d k rBt	 j
 d j |   qBn Xd } y | j |  Wn> t  j k
 r} | j d k rt	 j
 d j |   qn Xd } y | j |  Wn> t  j k
 r} | j d k rt	 j
 d j |   qn Xd } y | j |  Wn> t  j k
 rI} | j d k rJt	 j
 d j |   qJn Xd } y | j |  Wn> t  j k
 r} | j d k rt	 j
 d j |   qn Xd } y | j |  Wn> t  j k
 r} | j d k rt	 j
 d j |   qn Xd } y | j |  Wn> t  j k
 rQ} | j d k rRt	 j
 d j |   qRn X|  j   | j   d  S(   NR   R   R   R   s	   use zvepgs   CREATE TABLE `providers` (`providerName` varchar(64), `country` varchar(64), `postalCode` char(32), `providerId` varchar(64), constraint mapId primary key (country, postalCode, providerId))i  s   sql error: {}s   CREATE TABLE `providerChannelMap` (`providerId` varchar(64), `channelId` varchar(64), `channelNumber` varchar(10), constraint mapId primary key (providerId, channelId))s   CREATE TABLE `channels` (`channelId` varchar(64) primary key not null, `callSign` varchar(64), `affiliateCallSign` varchar(64), `name` varchar(64), `imageUrl` varchar(64) default '')s\   CREATE TABLE `integrators` (`name` varchar(64) primary key not null, `password` varchar(32))sq  CREATE TABLE `epgs` (`integrator` varchar(64),`name` varchar(64), `type` char(32) default 'IP',  `country` varchar(64), `postalCode` char(32), `epgId` char(32), `backgroundColor` char(16) default '#101010', `evenRowColor` char(16) default '#303030', `oddRowColor` char(16) default '#505050', `fontColor` char(16) default '#b0b0b0', constraint mapId primary key (epgId))s|   CREATE TABLE `epgProviderMap` (`epgId` char(32), `providerId` varchar(64), constraint mapId primary key (epgId, providerId))s   CREATE TABLE `selectedChannels` (`epgId` char(32), `channelId` varchar(64), `providerId` varchar(64), `localChannelNumber` varchar(10) default '', `contentUrl` varchar(132) default '', constraint mapId primary key (epgId, providerId, channelId))sg   CREATE TABLE `selectedChannelsLastChangeId` (`epgId` char(32) primary key not null, `lastChangeId` int)s   CREATE TABLE `channelPrograms` (`id` int primary key auto_increment, `channelId` varchar(64), `name` varchar(64), `startTime` datetime, `durationMins` int, `description` varchar(512), `imageUrl` varchar(64), `genres` varchar(64), `cast` varchar(64))(   R    R!   R"   R#   R$   R%   R&   R0   t   errnot   syst   exitR   R(   R)   (   R*   R$   t   sqlt   e(    (    s   /var/www/epg/epg_db.pyR'   Q   sv    
c         C   s   i d d 6} t  |  d k r7 d | d <d | d <| St j d d d	 t j  } | j d
 t  } | j d  d j |   } | j |  | j	 r d | d <d | d <| Sd j |  |  } | j |  | j
   | j   | S(   Nt   Successt   errori    t   ErrMsgs   Password too longt   errorMsgR   R   R   R   s	   use zvepgu)   SELECT * FROM integrators where name='{}'s   Inegrator already existsu:   insert into integrators(name, password) values('{}', '{}')(   t   lenR    R!   R"   R#   R$   R%   R&   R   t   rowcountR(   R)   (   R	   R   t   responseR*   R$   R6   (    (    s   /var/www/epg/epg_db.pyt   addIntegrator   s(    

	



c         C   s   i d d 6d d 6} t  j d d d t j  } | j d t  } | j d	  d
 j |   } | j |  | j d k r d | d <d | d <| S| j	   } | d k r d | d <n( | | d k r d | d <d | d <| S| j
   | j   | S(   NR8   R9   t   Usert   authTypeR   R   R   R   s	   use zvepgu0   SELECT password FROM integrators where name='{}'i    R:   s   Integrator does not existR;   t   ZvPasst   Admins   Invalid password(   R    R!   R"   R#   R$   R%   R&   R   R=   t   fetchoneR(   R)   (   R	   R   R>   R*   R$   R6   t   row(    (    s   /var/www/epg/epg_db.pyt   checkIntegratorPassword   s(    





c         C   s   i d d 6} t  |  d k r7 d | d <d | d <| St j d d d	 t j  } | j d
 t  } | j d  d j |   } | j |  | j	 d k r d | d <d | d <| Sd j | |   } | j |  | j
   | j   | S(   NR8   R9   i   R:   s   Password too longR;   R   R   R   R   s	   use zvepgu)   SELECT * FROM integrators WHERE name='{}'i    s   Inegrator does not existu6   UPDATE integrators SET password = '{}' WHERE name='{}'(   R<   R    R!   R"   R#   R$   R%   R&   R   R=   R(   R)   (   R	   R   R>   R*   R$   R6   (    (    s   /var/www/epg/epg_db.pyt   changeIntegratorPassword   s&    





c         C   s	  i d d 6} t  j d d d t j  } | j d t  } | j d  d j |   } | j |  | j d	 k r d
 | d <d | d <| Sd j |   } | j |  d } | j |  d j |   } | j |  d j |   } | j |  | j	   | j
   | S(   NR8   R9   R   R   R   R   s	   use zvepgu)   SELECT * FROM integrators where name='{}'i    R:   s   Inegrator does not existR;   uO   CREATE TEMPORARY TABLE delEpgs (SELECT epgId FROM epgs  WHERE integrator='{}' )ul   DELETE FROM selectedChannels WHERE EXISTS (SELECT 1 FROM delEpgs WHERE selectedChannels.epgId=delEpgs.epgId)u&   DELETE FROM epgs where integrator='{}'u'   DELETE FROM integrators where name='{}'(   R    R!   R"   R#   R$   R%   R&   R   R=   R(   R)   (   t
   integratorR>   R*   R$   R6   (    (    s   /var/www/epg/epg_db.pyt   delIntegrator  s,    

	

c          C   s   i d d 6g  d 6}  t  j d d d t j  } | j d t  } | j d  d	 } | j |  x | D] } |  d j |  qh W| j   | j	   |  S(
   NR8   R9   t   integratorsR   R   R   R   s	   use zvepgu   SELECT name FROM integrators(
   R    R!   R"   R#   R$   R%   R&   t   appendR(   R)   (   R>   R*   R$   R6   R	   (    (    s   /var/www/epg/epg_db.pyt   getIntegrators#  s    

c          C   s!   i d d 6d d d g d 6}  |  S(   NR8   R9   t   USAt   CANt   GBRt	   countries(    (   R>   (    (    s   /var/www/epg/epg_db.pyt   getCountries4  s    c         C   sY  i d d 6|  d 6| d 6g  d 6} |  d k r[ t  j d |  s d | d <d	 | d
 <| Sn |  d k r t  j d | t  j  s d | d
 <d | d
 <| SnW |  d k r t r d | d <d | d
 <| Sn* t |  d k r d | d <d | d
 <| St j d d d t j  } | j	 d t
  } | j d  d } | j | |  | f  | j d k rx | D]7 \ } } i  } | | d <| | d <| d j |  q]Wn t j |  |  }	 t |	  d k rd | d <d | d
 <| Sxg |	 D]_ }
 d } | j | |
 j |  | |
 j f  i  } |
 j | d <|
 j | d <| d j |  qW| j   | j   | S(   NR8   R9   t   countryt
   postalCodet	   providersRM   s   ^\d{5}(?:[-\s]\d{4})?$R:   s   Invalid USA postal codeR;   RN   sH   ^[ABCEGHJ-NPRSTVXY][0-9][ABCEGHJ-NPRSTV-Z] [0-9][ABCEGHJ-NPRSTV-Z][0-9]$s   Invalid Canadiean postal codeRO   s!   Invalid Great Britain postal codei    s   Postal Code too longR   R   R   R   s	   use zvepguQ   SELECT providerId, providerName FROM providers where country=%s AND postalCode=%si    t
   providerIdt   providerNames   Invalid postal codeu]   INSERT INTO providers (providerName, country, postalCode, providerId) VALUES (%s, %s, %s, %s)(   t   ret   searcht
   IGNORECASEt   FalseR<   R    R!   R"   R#   R$   R%   R&   R=   RK   t   servicet   getProvidersR	   R   R(   R)   (   RR   RS   R>   R*   R$   R6   RU   RV   t   providert   providersSrvt   providerSrv(    (    s   /var/www/epg/epg_db.pyR\   9  s\    "











"

c      
   C   s"   t  |  | | | | | | | t 	 S(   N(   t   addChangeEpgR%   (   t   epgIdRH   R	   t   typeRR   RS   t   providerIdsStrt   newProviderOk(    (    s   /var/www/epg/epg_db.pyt	   changeEpgu  s    c      
   C   s"   t  |  | | | | | | | t 	 S(   N(   R`   RZ   (   Ra   RH   R	   Rb   RR   RS   Rc   Rd   (    (    s   /var/www/epg/epg_db.pyt   addEpgy  s    c	      	   C   sI  i d d 6| d 6| d 6| d 6| d 6|  d 6}	 t  j d  t |  d	 k rg d
 |	 d <d |	 d <|	 S| d k r | d k r d
 |	 d <d |	 d <|	 St   }
 | |
 d k r d
 |	 d <d | d |	 d <|	 S| j d  } t |  d k r	d
 |	 d <d |	 d <|	 St j d d d t j  } | j	 d t
  } | j d  | sd } | j | | f  | j d k rd
 |	 d <d |	 d <|	 Sn  g  } t | |  d } g  } x | D] } | d k rqn  t } x5 | D]- } | | d k rt
 } | j |  PqqW| rUd  } | j | | f  | j d k rv| d! k rv| j |  qvqd
 |	 d <d" j |  |	 d <|	 SqWt |  d k rd# |	 d <d$ |	 d <| |	 d% <|	 Sd& j |  } | j |  | j d k rd
 |	 d <d' |	 d <|	 S|  d( k rx t
 rd) j t j d d*  t j d d*  t j d d*   }  y3 d+ j |   } | j |  | j d k rqPn  Wq t j k
 rPq Xq Wn^ yG d+ j |   } | j |  | j d k rd
 |	 d <d, |	 d <|	 SWn t j k
 rn X| rId- } | j | | | | | | |  f  d. j |   } | j |  t  j d/  n@ d0 } | j | | | | | | |  f  t j d1 d2 |  d3  xw| D]o} t  j d4 j |    d5 } y | j | |  | d f  Wn t j k
 rn Xd6 } | j | | d f  | j d k rt j | d  } t |  d k rZ| j   d
 |	 d <d7 |	 d <|	 Sx | D] } d8 } y0 | j | | j | j | j | j d	  f  Wn t j k
 rn Xd9 } y' | j | | d | j | j f  Wqat j k
 rqaXqaWqqWt | |   | j   | j   | |	 d <t    |	 d: <|  |	 d <|	 S(;   NR8   R9   R	   Rb   RR   RS   Ra   s    EPG_DB.PY: entering addChangeEpgi?   R:   s   Name > 63 charactersR;   t   IPt   RFs   EPG type not RF or IPRP   s   Country s    not supportedt   ;i    s   No providerIds providedR   R   R   R   s	   use zvepgu    select * from epgs WHERE name=%ss   Name existsRT   t   noneRU   u0   select * from epgProviderMap WHERE providerId=%st   falses   Invalid providerId, {}t   ErrNewProviders$   New Provider and newProviderOk falset   newProvidersu)   SELECT * FROM integrators where name='{}'s   Inegrator does not existsR   s   {:0>3}-{:0>3}-{:0>3}i  u!   SELECT * FROM epgs where epgId={}s   Duplicate EPG IDue   UPDATE epgs SET integrator = %s, name = %s, type = %s, country = %s, postalCode = %s WHERE epgId = %su+   DELETE FROM epgProviderMap where epgId='{}'s4   EPG_DB.PY: addChangeEpg -- change deleting existing ud   insert into epgs(integrator, name, type, country, postalCode, epgId) VALUES (%s, %s, %s, %s, %s, %s)s   art/ZeeVee-Logo.pngs   art/epgIcons/epg_t   _icons/   EPG_DB.PY: addChangeEpg -- adding provider '{}'u*   INSERT INTO epgProviderMap VALUES (%s, %s)u<   SELECT 1 FROM providerChannelMap WHERE providerId=%s LIMIT 1s   Failed to contact serviceuZ   INSERT INTO channels(channelId, callSign, affiliateCallSign, name) VALUES (%s, %s, %s, %s)uX   INSERT INTO providerChannelMap(providerId, channelId, channelNumber) VALUES (%s, %s, %s)t   numChannelsToUpdate(!   t   loggingt   debugR<   RQ   t   splitR    R!   R"   R#   R$   R%   R&   R=   R\   RZ   RK   R   t   randomt   randintR0   t   shutilt   copyfileR[   t   getProviderChannelsR)   R   R   R   R	   R   t   incrementLastChangeIdR(   t   startUpdateAllChannelsInfo(   Ra   RH   R	   Rb   RR   RS   Rc   Rd   t   changeR>   RP   t   providerIdsR*   R$   R6   Rm   t   allProviderst   epgProvidersRU   t   providerMatchR]   t   channelst   channel(    (    s   /var/www/epg/epg_db.pyR`   }  s    0



	










	9

""


0'



c         C   s   i d d 6d d 6} t  |   d k r> d | d <d | d <| St j d	 d
 d t j  } | j d t  } | j d  d j |   } | j |  | j	 d k r d | d <d | d <| S| j
   | j   | S(   NR8   R9   R@   RA   i   t   EpgNotExists   EPG does not existR;   R   R   R   R   s	   use zvepgu'   SELECT epgId FROM epgs where epgId='{}'i    (   R<   R    R!   R"   R#   R$   R%   R&   R   R=   R(   R)   (   Ra   R>   R*   R$   R6   (    (    s   /var/www/epg/epg_db.pyt   validateEpg"  s"    





c         C   s  i d d 6} t  j d d d t j  } | j d t  } | j d  d j |   } | j |  | j d	 k r d
 | d <d | d <| Sd j |   } | j |  d |  } d j |  } | j |  d j |   } | j |  d j |   } | j |  | j	   | j
   | S(   NR8   R9   R   R   R   R   s	   use zvepgu'   SELECT epgId FROM epgs where epgId='{}'i    R   s   EPG does not existR;   u!   DELETE FROM epgs where epgId='{}'t   Local_uj   DELETE FROM channels WHERE channelId IN (SELECT channelId FROM providerChannelMap WHERE providerId = '{}')u+   DELETE FROM epgProviderMap where epgId='{}'u-   DELETE FROM selectedChannels where epgId='{}'(   R    R!   R"   R#   R$   R%   R&   R   R=   R(   R)   (   Ra   R>   R*   R$   R6   RU   (    (    s   /var/www/epg/epg_db.pyt   delEpg:  s,    




c         C   s  i d d 6g  d 6} t  j d d d t j  } | j d t  } | j d  | j d t  } | j d  d	 j |   } y | j |  Wn) t  j k
 r d
 | d <d | d <| SXx | D] \ } } } }	 }
 d } | j | |
 f  i  } | | d <| | d <| | d <|	 | d <g  | D]  \ } } i | d 6| d 6^ q#} | | d <|
 | d <| d j	 |  q W| j
   | j   | S(   NR8   R9   t   epgsR   R   R   R   s	   use zvepguv   SELECT name, type, country, postalCode, epgId FROM epgs WHERE integrator='{}' ORDER BY name, type, country, postalCodeR:   s   Integrator does not existR;   u   SELECT epgProviderMap.providerId, providerName FROM epgProviderMap JOIN providers ON epgProviderMap.providerId = providers.providerId WHERE epgId=%sR	   Rb   RR   RS   RU   RV   RT   Ra   (   R    R!   R"   R#   R$   R%   R&   R   R0   RK   R(   R)   (   RH   R>   R*   R$   t   cursor2R6   R	   Rb   RR   RS   Ra   t   epgRU   RV   RT   (    (    s   /var/www/epg/epg_db.pyt   getEpgs_  s8    





-



c   
      C   s  i d d 6} t  j d d d t j  } | j d t  } | j d  d j |   } | j |  | j d	 k r d
 | d <d | d <| St	 |  d k r d | d <d | d <| St	 |  d k r d | d <d | d <| Sd j |  | t
 j d	 d   } | j d d  } | | d <d } | j | | f  | j d k r[d | d <d | d <| Sd | d } t j d j |   | | d <d } | j | | | d | | f  d |  }	 d  } | j | |	 | f  t | |   | j   | j   | S(!   NR8   R9   R   R   R   R   s	   use zvepgu'   SELECT epgId FROM epgs where epgId='{}'i    R   s   EPG does not existR;   i?   R:   s   CallSign > 63 characterss   Name > 63 characterss   Local_{}_{}_{}i t    t   _t	   channelIdu1   SELECT channelId FROM channels where channelId=%si   s   Local channel already existss   art/localChannelIcons/Rn   s   EPG_DB.PY: ImageURL {}R   ug   insert into channels(channelId, callSign, affiliateCallSign, name, imageUrl) values(%s, %s, %s, %s, %s)R   R   u\   insert into providerChannelMap(providerId, channelId, channelNumber) values(%s, %s, 'Local')(   R    R!   R"   R#   R$   R%   R&   R   R=   R<   Rs   Rt   t   replaceRp   Rq   Rx   R(   R)   (
   Ra   R   R	   R>   R*   R$   R6   R   R   RU   (    (    s   /var/www/epg/epg_db.pyt   addLocalChannel  sN    





!






c   	      C   s  i d d 6} t  j d d d t j  } | j d t  } | j d  d j |   } | j |  | j d	 k r d
 | d <d | d <| St	 |  d k r d | d <d | d <| St	 |  d k r d | d <d | d <| S| | d <d } | j | | f  | j d	 k r(d | d <d | d <| Sd | d } t
 j d j |   | | d <d } | j | | | | f  t | |  t | |   | j   | j   | S(   NR8   R9   R   R   R   R   s	   use zvepgu'   SELECT epgId FROM epgs where epgId='{}'i    R   s   EPG does not existR;   i?   R:   s   CallSign > 63 characterss   Name > 63 charactersR   u1   SELECT channelId FROM channels where channelId=%st   ChanNotExists   Local channel does not exists   art/localChannelIcons/Rn   s   EPG_DB.PY: ImageURL {}R   uA   UPDATE channels SET callSign = %s, name = %s WHERE channelId = %s(   R    R!   R"   R#   R$   R%   R&   R   R=   R<   Rp   Rq   t   updateChannelProgramsRx   R(   R)   (	   Ra   R   R   R	   R>   R*   R$   R6   R   (    (    s   /var/www/epg/epg_db.pyt   changeLocalChannel  sF    











c         C   s:  i d d 6} t  j d d d t j  } | j d t  } | j d  d j |   } | j |  | j d	 k r d
 | d <d | d <| Sd } | j | | f  | j d	 k r d | d <d | d <| Sd } | j | | f  d } | j | | f  d } | j | | f  t	 | |   | j
   | j   | S(   NR8   R9   R   R   R   R   s	   use zvepgu'   SELECT epgId FROM epgs where epgId='{}'i    R   s   EPG does not existR;   u1   SELECT channelId FROM channels where channelId=%sR:   s   Local channel does not existu'   DELETE FROM channels WHERE channelId=%su/   DELETE FROM selectedChannels WHERE channelId=%su1   DELETE FROM providerChannelMap WHERE channelId=%s(   R    R!   R"   R#   R$   R%   R&   R   R=   Rx   R(   R)   (   Ra   R   R>   R*   R$   R6   (    (    s   /var/www/epg/epg_db.pyt   deleteLocalChannel  s4    





c   
      C   s  i d d 6g  d 6} t  j d d d t j  } | j d t  } | j d  | j d	  d
 j |   } | j |  | j d k r d | d <d | d <| S| j	   } |  | d <| d | d <d |  d | d <| d | d <| d | d <| d | d <| d | d <d |  d } y t
 j |  Wn t k
 r>n Xd } i  } | j | |  f  | j d k rxU | D]J \ }  } }	 y | | rn  Wqtt | |  |	 | |  t | | <qtXqtWn  d |  } t | |  d | |  | j   | j   | S(    NR8   R9   R   R   R   R   R   s	   use zvepgs   set innodb_lock_wait_timeout=10u]   SELECT type, backgroundColor, evenRowColor, oddRowColor, fontColor FROM epgs WHERE epgId='{}'i    R   s   EPG does not existR;   Ra   t   epgTypes   art/epgIcons/epg_Rn   t
   epgIconUrli   t   epgBackgroundColori   t   epgEvenRowColori   t   epgOddRowColori   t   epgFontColort
   _icon_tempu   select epgId, epgProviderMap.providerId, providerName FROM epgProviderMap JOIN providers ON epgProviderMap.providerId = providers.providerId WHERE epgId=%sR   t   Local(   R    R!   R"   R#   R$   R%   R&   R   R=   RD   R.   t   removet   OSErrorRw   R(   R)   (
   Ra   R>   R*   R$   R6   RE   t   tmpIconRT   RU   RV   (    (    s   /var/www/epg/epg_db.pyt   getEpgChannels  sP    






c      	   C   s  |  j  d t  } | j d  | j d  d } y | j | | f  Wn> t j k
 r } g  | d <d | d <d j |  | d	 <| SXd
 } | j | | | f  x | D] \ } }	 }
 } } } } } i  } | d  k r d | d <n | d k r q n  | | d <| d  k rd | d <n
 | | d <|	 | d <| | d <i | d 6| d 6| d <| | d <|
 | d <| | d <| | d <| d j |  q Wd } | j |  |  j   | j	   d  S(   NR   s	   use zvepgs   set innodb_lock_wait_timeout=10u   CREATE TEMPORARY TABLE epgChannels SELECT channels.channelId, callSign, affiliateCallSign, name, channelNumber, imageUrl FROM channels JOIN providerChannelMap ON providerChannelMap.channelId = channels.channelId WHERE providerId=%sR   R:   R9   s   SQL error {}R;   u?  SELECT epgChannels.channelId, callSign, affiliateCallSign, name, channelNumber, imageUrl, selectedChannels.localChannelNumber, selectedChannels.contentUrl FROM epgChannels LEFT JOIN selectedChannels ON epgChannels.channelId = selectedChannels.channelId AND selectedChannels.epgId=%s AND selectedChannels.providerId = %sR   t   localChannelNumbert
   contentUrlR   R   RU   RV   R]   R   R   R	   R   u   DROP TABLE epgChannels(
   R$   R%   R&   R    R0   R   R   RK   R(   R)   (   R*   Ra   RV   RU   R>   R$   R6   R7   R   R   R   R	   t   channelNumberR   R   R   R   (    (    s   /var/www/epg/epg_db.pyRw   B  sF    

%








c         C   s  i d d 6} g  } g  } y g  | D] } | j  d  ^ q# } g  | D]( } t |  d k rE t | d  ^ qE } g  | D]" } t |  d k rz | d ^ qz } Wn) t k
 r } t j d j |   n Xt t |   } t |  t |  k st |  t |  k r)d | d <d	 | d
 <| St	 j
 d d d t j  }	 |	 j d t  }
 |
 j d  d j |   } |
 j |  |
 j d k rd | d <d | d
 <| Sd j |   } |
 j |  x | D] \ } } } } t j d | d | d | d |  d } y# |
 j | |  | | | | f  Wn, t	 j k
 r[} t j d j |   qXt |	 |  qWt |	 |   |	 j   |
 j   | S(   NR8   R9   Ri   i   i   i   s5   EPG_DB.PY: Set epg channels syntax error on input: {}R:   ss   Incorrect format of <channelId>;<localChannelNumber>;[<contentUrl>] where localChannelNumber is non-zero and uniqueR;   R   R   R   R   s	   use zvepgu&   SELECT name FROM epgs WHERE epgId='{}'i    R   s   EPG does not existu-   DELETE FROM selectedChannels WHERE epgId='{}'s   EPG_DB.PY: providerId=s   chanId=s	    locChan=s    url=uw   INSERT INTO selectedChannels (epgId, providerId, channelId, localChannelNumber, contentUrl) VALUES (%s, %s, %s, %s, %s)s(   EPG_DB.PY: Set selectedChannels error {}(   Rr   R<   t   floatt
   ValueErrorRp   Rq   R   t   sortedt   setR    R!   R"   R#   R$   R%   R&   R=   R0   R   Rx   R(   R)   (   Ra   t   selectedChannelInfoR>   t	   localNumst   contentUrlst   xt   channelInfot   valR7   R*   R$   R6   RU   R   R   R   (    (    s   /var/www/epg/epg_db.pyt   setEpgChannelsz  sJ    "530



)#

c         C   s   |  j  d t  } | j d  d } | j | | f  | j d k rl d } d } | j | | | f  n< | j   } t | d  d } d } | j | | | f  | S(   NR   s	   use zvepguE   SELECT lastChangeId FROM selectedChannelsLastChangeId WHERE epgId=%s i    i   uN   INSERT INTO selectedChannelsLastChangeId (epgId, lastChangeId) values (%s, %s)uI   UPDATE selectedChannelsLastChangeId SET lastChangeId = %s WHERE epgId=%s (   R$   R%   R&   R=   RD   t   int(   R*   Ra   R$   R6   t   lastChangeIdRE   (    (    s   /var/www/epg/epg_db.pyRx     s    c          C   s   t  j d d d t j  }  |  j d t  } | j d  t j d  d } | j |  | j	 d k r t j d	  t
 j d
  n  | j	 S(   NR   R   R   R   s	   use zvepgsI   EPG_DB.PY: startingUpdateAllChannelsInfo -- checking if some need updatesu?   SELECT channelId FROM channels WHERE name = '' or imageUrl = ''i    s.   EPG_DB.PY: Starting update on needed channels s\   echo '/usr/bin/python /var/www/epg/epg.py --update_all_channels_info' | at now &> daemon.txt(   R    R!   R"   R#   R$   R%   R&   Rp   Rq   R=   R.   R/   (   R*   R$   R6   (    (    s   /var/www/epg/epg_db.pyRy     s    c          C   sx   i d d 6}  t  j d  t j d d d t j  } | j d t  } | j d  d	 } | j |  | j	 |  d
 <|  S(   NR8   R9   s-   EPG_DB.PY: updateAllChannelProgs starting... R   R   R   R   s	   use zvepgu?   SELECT channelId FROM channels WHERE name = '' or imageUrl = ''Ro   (
   Rp   Rq   R    R!   R"   R#   R$   R%   R&   R=   (   R>   R*   R$   R6   (    (    s   /var/www/epg/epg_db.pyt   getUpdateAllChannelsInfoStatus  s    c    
      C   sl  i d d 6}  t  j d d d t j  } | j d t  } | j d t  } | j d  | j d  t j d  d	 } | j |  d
 } x | D] \ } | j	 d  d
 k r q n  d j
 |  GHt j |  } | j } | j }	 t j d j
 | | |	   d } | j | | d  |	 d  | f  | d 7} | d d
 k r | j   q q W| j   | j   |  S(   NR8   R9   R   R   R   R   s	   use zvepgs    EPG_DB.PY: UPDATE all channels!!u?   SELECT channelId FROM channels WHERE name = '' or imageUrl = ''i    R   s   {}u3   EPG_DB.PY: UPDATE  channel={}, name={}, imageURL={}u=   UPDATE channels SET name = %s, imageUrl=%s WHERE channelId=%si?   i   i
   (   R    R!   R"   R#   R$   R%   R&   Rp   Rq   t   findR   R[   t   getChannelInfoR	   R   R(   R)   (
   R>   R*   R$   R   R6   t   commitSkipCountR   R   R	   R   (    (    s   /var/www/epg/epg_db.pyt   updateAllChannelsInfo  s4    		!


c         C   s  |  j  d t  } | j d  d } | j | | f  | j   } t d d  } t d d  } t j   j d d d	 d d
 d  | } g  } x t d d  D]r }	 t	   }
 | d |
 _
 | j d  |
 _ d |
 _ d |
 _ d |
 _ d |
 _ d |
 _ | j |
  | | 7} q W| S(   NR   s	   use zvepgu,   SELECT name FROM channels WHERE channelId=%st   hoursi   i   t   microsecondi    t   secondt   minutei0   i   s   %Y-%m-%dT%H:%MZi<   s   Local ProgrammingR   i3   (   R$   R%   R&   RD   R   R    t   utcnowR   t   rangeR   R   R-   R   R   R   R   R   R   RK   (   R*   R   R$   R6   R   t   oneHourt   beforeHourst	   startDatet   programst   it   program(    (    s   /var/www/epg/epg_db.pyt   createLocalPrograms  s*    (						c   	      C   sb  |  j  d t  } | j d  t j d  t   | j d  d k rZ t |  |  } n t j	 |  } d j
 |  } y | j |  Wn, t j k
 r } t j d j
 |   n Xx | D] } t j | j d  } t | j  d	 k r | j d
  d n | j } d } | j | | | j d  | | j | d
  | j d  | j d  | j d  f  q Wd  S(   NR   s	   use zvepgs)   EPG_DB.PY: entering updateChannelProgramsR   i    u0   DELETE FROM channelPrograms WHERE channelId='{}'s.   EPG_DB.PY: updateChannelProgs delete error: {}s   %Y-%m-%dT%H:%MZi   i  s   ...u   INSERT INTO channelPrograms (channelId, name, startTime, durationMins, description, imageUrl, genres, cast) values (%s, "%s", %s, %s, "%s", %s, "%s", "%s")i>   (   R$   R%   R&   Rp   Rq   R   R   R   R[   t   getProgramsR   R    R0   R    t   strptimeR   R<   R   R   R   R   R   R   (	   R*   R   R$   R   R6   R7   t   progR   R   (    (    s   /var/www/epg/epg_db.pyR   (  s"    /c          C   s$  i d d 6}  t  j d d d t j  } | j d t  } | j d t  } | j d  | j d  t j d  d	 } | j |  x, | D]$ \ } d
 j	 |  GHt
 | |  q Wd } | j |  x4 | D], \ } } d } | j | | d | f  q W| j   | j   t j d  |  S(   NR8   R9   R   R   R   R   s	   use zvepgs-   EPG_DB.PY: updateAllChannelProgs starting... u/   SELECT DISTINCT channelId FROM selectedChannelss   chan {}u<   SELECT lastChangeId, epgId FROM selectedChannelsLastChangeIduJ   UPDATE selectedChannelsLastChangeId SET lastChangeId = %s WHERE epgId = %si   s)   EPG_DB.PY: updateAllChannelProgs complete(   R    R!   R"   R#   R$   R%   R&   Rp   Rq   R   R   R(   R)   (   R>   R*   R$   R   R6   R   R   Ra   (    (    s   /var/www/epg/epg_db.pyt   updateAllChannelProgramsF  s*    

c         C   s(  i d d 6} t  j d d d t j  } | j d t  } | j d  d |  d	 } d |  d
 }	 y t j | |	  Wn t	 k
 r n Xd j
 |   }
 | j |
  | j d k r d | d <d | d <| Sd }
 | j |
 | d  | d  | d  | d  |  f  t | |   | j   | j   | S(   NR8   R9   R   R   R   R   s	   use zvepgs   art/epgIcons/epg_R   Rn   u'   SELECT epgId FROM epgs WHERE epgId='{}'i    R   s   EPG does not existR;   uh   UPDATE epgs SET backgroundColor = %s, evenRowColor = %s, oddRowColor = %s, fontColor = %s WHERE epgId=%si   (   R    R!   R"   R#   R$   R%   R&   R.   t   renameR   R   R=   Rx   R(   R)   (   Ra   t   backgroundColort	   fontColort   evenRowColort   oddRowColorR>   R*   R$   R   t   permIconR6   (    (    s   /var/www/epg/epg_db.pyt   saveEpgConfigd  s,    

/

c         C   s  i d d 6g  d 6} y t  |  } Wn& t k
 rL d | d <d | d <| SXt j d d d	 t j  } | j d
 t  } | j d  d j	 |   } | j |  | j
 d k r d | d <d | d <| S| j   } |  | d <| d | d <d |  d | d <| d | d <| d | d <| d | d <| d | d <d } d } | j | |  f  | j
 d k r| d k r{d } n | } d } | j | |  | f  nT | j   } t  | d  } | | k rd | d <d  | d <| j   | j   | S| | d! <t j d" j	 |    d# } | j | |  f  d$ } | j | |  f  g  }	 d }
 i  } x| D]\ } } } } } } } } } } } } } } | |
 k r|
 d k r|	 j |  n  | }
 i  } | | d% <| | d& <| | d' <| | d( <| | d) <| | d* <g  | d+ <n  i  } | | d% <| j d,  | d- <| | d. <| | d/ <| | d' <| | d0 <| | d1 <| d+ j |  q_W| j
 d k r|	 j |  n  |	 | d <| j   | j   | S(2   NR8   R9   R   R:   s$   lastChangeId not valid integer valueR;   R   R   R   R   s	   use zvepgu]   SELECT type, backgroundColor, evenRowColor, oddRowColor, fontColor FROM epgs WHERE epgId='{}'i    R   s   EPG does not existRa   R   s   art/epgIcons/epg_Rn   R   i   R   i   R   i   R   i   R   uE   SELECT lastChangeId FROM selectedChannelsLastChangeId WHERE epgId=%s uN   INSERT INTO selectedChannelsLastChangeId (epgId, lastChangeId) values (%s, %s)t   NoChangeR   R   s    EPG_DB.PY: getEpgPrograms for {}uk  CREATE TEMPORARY TABLE custChannels (SELECT selectedChannels.epgId, selectedChannels.channelId, selectedChannels.localChannelNumber, selectedChannels.contentUrl, channels.name, channels.callSign, channels.affiliateCallSign, channels.imageUrl FROM selectedChannels JOIN channels ON selectedChannels.channelId = channels.channelId WHERE selectedChannels.epgId = %s)u  SELECT custChannels.channelId, custChannels.name, custChannels.callSign, custChannels.affiliateCallSign, custChannels.imageUrl,localChannelNumber, contentUrl, channelPrograms.name, startTime, durationMins, description, channelPrograms.imageUrl, genres, cast FROM channelPrograms JOIN custChannels ON channelPrograms.channelId = custChannels.channelId WHERE epgId = %s ORDER BY localChannelNumber, startTimeR	   R   R   R   R   R   R   s   %Y-%m-%dT%H:%MZR   R   R   R   R   (   R   R   R    R!   R"   R#   R$   R%   R&   R   R=   RD   R(   R)   Rp   Rq   RK   R-   (   Ra   t   lastChangeIdReqStrR>   t   lastChangeIdReqR*   R$   R6   RE   R   R   t   prevChannelR   R   t   channelNameR   R   t   channelImageUrlR   R   t   progNameR   R   R   t   progImageUrlR   R   R   (    (    s   /var/www/epg/epg_db.pyt   getEpgPrograms  s    




	




4














c          C   s  t  j d d d t j  }  |  j d t  } | j d  d } | j |  | j d k rd d GHn Hd	 d
 } | j d d d d d d  } | GHd j d t	 |   GHx= | D]5 \ } } } } }	 }
 | j | | | | |	 |
  GHq W|  j
   | j   d  S(   NR   R   R   R   s	   use zvepguC   SELECT integrator, name, type, country, postalCode, epgId FROM epgsi    s   There are no epgss   {:>15}i   t
   Integratort   Namet   Typet   Countrys   Postal-codet   epgIDs   {}t   =(   R    R!   R"   R#   R$   R%   R&   R=   R   R<   R(   R)   (   R*   R$   R6   t
   row_formatt   headerRH   R	   Rb   RR   RS   Ra   (    (    s   /var/www/epg/epg_db.pyt   showEpgs  s     
!
c          C   s   t  j d d d t j  }  |  j d t  } | j d  d } | j |  x% | D] \ } } d j | |  GHqT W|  j   | j	   d  S(   NR   R   R   R   s	   use zvepgu(   SELECT callSign, channelId FROM channelss   callSign={}, id={}(
   R    R!   R"   R#   R$   R%   R&   R   R(   R)   (   R*   R$   R6   R   R   (    (    s   /var/www/epg/epg_db.pyt   showChannels  s    
c          C   s   t  j d d d t j  }  |  j d t  } | j d  d } | j |  x1 | D]) \ } } } } d j | | | |  GHqT W|  j   | j	   d  S(   NR   R   R   R   s	   use zvepguC   SELECT providerId, providerName, country, postalCode FROM providerss-   providerId={} name={} countr={} postalCode={}(
   R    R!   R"   R#   R$   R%   R&   R   R(   R)   (   R*   R$   R6   RU   RV   RR   RS   (    (    s   /var/www/epg/epg_db.pyt   showProviders  s    
c   
      C   s   t  j d d d t j  } | j d t  } | j d  d j |   } | GH| j |  x@ | D]8 \ }  } } } } } }	 d j | | | | | |	  GHqb W| j   | j	   d  S(   NR   R   R   R   s	   use zvepgu   SELECT providerId, channels.channelId, callSign, affiliateCallSign, name, channelNumber, imageUrl FROM providerChannelMap JOIN channels ON providerChannelMap.channelId = channels.channelId WHERE providerId='{}' sL   channelId={}, callSign={}, affiliate={}, name={}, channelNumber={}, image={}(
   R    R!   R"   R#   R$   R%   R&   R   R(   R)   (
   RU   R*   R$   R6   R   R   R   R	   R   R   (    (    s   /var/www/epg/epg_db.pyt   showProviderChannels!  s    	"
(    (    (    (7   R.   Ru   Rp   R,   RW   R4   R    R   t   mysql.connectort	   connectorR    t	   epg_graceR[   Rs   R"   t   basicConfigt   DEBUGR   R   R   R+   R2   R'   R?   RF   RG   RI   RL   RQ   R\   Re   Rf   R`   R   R   R   R   R   R   R   Rw   R   Rx   Ry   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s   /var/www/epg/epg_db.pyt   <module>   sh   
			_				!			<					%	$	5	2	&	2	8	5				%					i			