OSDN Git Service

some bug fix.
[rec10/rec10-git.git] / rec10 / trunk / src / timerec.py
1 #!/usr/bin/python
2 # coding: UTF-8
3 # Rec10 TS Recording Tools
4 # Copyright (C) 2009 Yukikaze
5 import sys
6 import time
7 import os
8 import datetime
9 import epgdb
10 import configreader
11 import checker
12 import tv2avi
13 import recdb
14 import chdb
15 import status
16 import re
17 recpath=configreader.getpath('recpath')
18 tmppath=configreader.getpath('temppath')
19 path=str(os.path.dirname(os.path.abspath(__file__)))+"/"
20 def task():
21     """
22     数分毎に実行されるタスク処理
23     予定によって子プロセスを生成し処理する。
24     """
25     recdb.delete_old("6")
26     tasks=recdb.getnow("2")
27     #print tasks
28     inum=recdb.countRecNow("1")
29     print "now-rectask"
30     print "inum:"+str(inum)+"bscsrec:"+str(status.getBSCSRecording())+"terec:"+str(status.getTERecording())+" epg:"+str(status.getEPGUpdating())
31     if inum+status.getBSCSRecording()+status.getTERecording() < 2:
32         update=chdb.update()
33         #print "番組表更新処理"
34         
35         if len(update)>0 and status.getEPGUpdating()==0:
36             status.setEPGUpdating(1)
37             print "番組表を更新"
38             print update
39             status.setEPGUpdating(1)
40             pid=os.fork()
41             if pid!=0:#親プロセスの場合
42                 ""
43             else:#子プロセスの場合 アップデートを行って終了
44                 i=0
45                 for bctype in update:
46                     time.sleep(1)
47                     print bctype
48                     epgdb.updatebc(bctype)
49                     update=chdb.update()
50                     i=i+1
51                     print update
52                     if i>10:
53                         break
54                 status.setEPGUpdating(0)
55                 sys.exit()
56     for task in tasks:
57         #print task
58         try:
59             chtxt=task['chtxt']
60         except:
61             chtxt=""
62         try:
63             title=task['title']
64         except:
65             title=""
66         try:
67             btime=task['btime']
68             bt=datetime.datetime.strptime(btime,"%Y-%m-%d %H:%M:%S")
69         except:
70             btime=""
71             bt=datetime.datetime.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S")
72         try:
73             etime=task['etime']
74             et=datetime.datetime.strptime(etime,"%Y-%m-%d %H:%M:%S")
75         except:
76             etime=""
77             et=datetime.datetime.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S")
78         try:
79             opt=task['opt']
80         except:
81             opt=""
82         tnow=datetime.datetime.now()
83         dtt=bt-tnow
84         dt=dtt.days*24*60*60+dtt.seconds
85         if task["type"]==recdb.REC_RESERVE:#"res,"+chtxt+","+title+","+btime+","+etime+","+opt
86             isUpdate=0
87             print dt
88             if (dt<58*60 and dt>20*60):
89                 pid=os.fork()
90                 if pid!=0:#親プロセスの場合
91                     ""
92                 else:#子プロセスの場合 アップデートを行って終了
93                     cht=chdb.chtxtsearch(chtxt)['bctype']
94                     if cht.find('te')!=-1:
95                         cht='te'
96                     else:
97                         cht='bscs'
98                     if cht=='bscs':
99                         gettaskbscs=recdb.countRecNow_minutes_BSCS("10")
100                         getnowbscs=status.getBSCSRecording()
101                         bscs=getnowbscs+gettaskbscs
102                         if bscs <2:
103                             print "now(bscs):"+str(getnowbscs)+" task(bscs):"+str(gettaskbscs)
104                             epgdb.updatebc(chdb.chtxtsearch(chtxt)['bctype'])
105                             time.sleep(10)
106                             isUpdate=1
107                         else:
108                             isUpdate=0
109                     if cht=="te":
110                         gettaskte=recdb.countRecNow_minutes_TE("10")
111                         getnowte=status.getTERecording()
112                         bscs=getnowte+gettaskte
113                         if recdb.countRecNow_minutes_TE("10")+status.getTERecording() <2:
114                             print "now(te):"+str(getnowte)+" task(te):"+str(gettaskte)
115                             epgdb.updatebc(chdb.chtxtsearch(chtxt)['bctype'])
116                             time.sleep(10)
117                             isUpdate=1
118                         else:
119                             isUpdate=0
120                     if isUpdate:
121                         recdata=epgdb.searchtime2(title.decode('utf-8'),btime,"5",chtxt)
122                         chtxtn=recdata[0]
123                         titlen=recdata[1]
124                         btimen=recdata[2]
125                         etimen=recdata[3]
126                         bt=datetime.datetime.strptime(btimen,"%Y-%m-%d %H:%M:%S")
127                         et=datetime.datetime.strptime(etimen,"%Y-%m-%d %H:%M:%S")
128                         btimen=bt.strftime("%Y-%m-%d %H:%M:%S")
129                         etimen=et.strftime("%Y-%m-%d %H:%M:%S")
130                         if chtxt!="":
131                             try:
132                                 recdb.del_reckey(recdb.REC_RESERVE, title, chtxt, btime)
133                                 recdb.rec_reckey(recdb.REC_FINAL_RESERVE, titlen, chtxtn, btimen, etimen, opt)
134                             except Exception,inst:
135                                 print type(inst)
136                                 print inst
137                         else:
138                             print "nothing match"
139                     else:
140                         ""
141                     sys.exit()
142             elif dt<=10*60:
143                 try:
144                     recdb.del_reckey(recdb.REC_RESERVE, title, chtxt, btime)
145                     recdb.rec_reckey(recdb.REC_FINAL_RESERVE, title, chtxt, btime, etime, opt)
146                 except Exception,inst:
147                     print type(inst)
148                     print inst
149         elif task["type"]==recdb.REC_KEYWORD:#"key,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt
150             deltatime=task['deltatime']
151             if dt<90*60:
152                 recdata=epgdb.searchtime2(title.decode('utf-8'),btime,deltatime,chtxt)
153                 if recdata[1]!="":
154                     chtxtt=recdata[0]
155                     titlet=recdata[1]
156                     btimet=recdata[2]
157                     etimet=recdata[3]
158                     bt=datetime.datetime.strptime(btimet,"%Y-%m-%d %H:%M:%S")
159                     et=datetime.datetime.strptime(etimet,"%Y-%m-%d %H:%M:%S")
160                     btimet=bt.strftime("%Y-%m-%d %H:%M:%S")
161                     etimet=et.strftime("%Y-%m-%d %H:%M:%S")
162                     try:
163                         recdb.del_reckey(recdb.REC_KEYWORD, title, chtxt, btime)
164                         recdb.rec_reckey(recdb.REC_RESERVE, titlet, chtxtt, btimet, etimet, opt)
165                     except Exception,inst:
166                         print type(inst)
167                         print inst
168                 else:
169                     print "nothing match"
170         elif task["type"]==recdb.REC_KEYWORD_EVERY_SOME_DAYS:#"keyevery,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt+","+deltaday
171             deltatime=task['deltatime']
172             deltaday=task['deltaday']
173             dd=datetime.timedelta(days=int(deltaday))
174             if dtt.days<0:
175                 recdb.del_reckey(recdb.REC_KEYWORD_EVERY_SOME_DAYS, title, chtxt, btime)
176                 bt=bt+dd
177                 et=et+dd
178                 btxt=bt.strftime("%Y-%m-%d %H:%M:%S")
179                 etxt=et.strftime("%Y-%m-%d %H:%M:%S")
180                 recdb.everyreserv(title,chtxt,btxt,etxt,deltatime,opt,deltaday)
181             elif dt<120*60:
182                 recdb.keyreserv(title,chtxt,btime,etime,deltatime,opt)
183                 recdb.del_reckey(recdb.REC_KEYWORD_EVERY_SOME_DAYS, title, chtxt, btime)
184                 bt=bt+dd
185                 et=et+dd
186                 btxt=bt.strftime("%Y-%m-%d %H:%M:%S")
187                 etxt=et.strftime("%Y-%m-%d %H:%M:%S")
188                 recdb.everyreserv(title,chtxt,btxt,etxt,deltatime,opt,deltaday)
189             
190         elif task["type"]==recdb.REC_FINAL_RESERVE:#"rec,"+chtxt+","+title+","+btime+","+etime+","+opt
191             print dt
192             if dt<6*60 and dt>0:
193                 recdb.del_reckey(recdb.REC_FINAL_RESERVE, title, chtxt, btime)
194                 recdb.rec_reckey(recdb.REC_TS_RECORDING, title, chtxt, btime, etime, opt)
195                 print "録画開始"
196                 pid=os.fork()
197                 if pid!=0:#親プロセスの場合
198                     ""
199                 else:
200                     #print title
201                     tv2avi.timetv2b25(recpath+"/"+title+".avi", chtxt, btime, etime, opt)
202                     recdb.del_reckey(recdb.REC_TS_RECORDING, title, chtxt, btime)
203                     tnow=datetime.datetime.now()
204                     bt=datetime.datetime.strptime(btime,"%Y-%m-%d %H:%M:%S")
205                     et=datetime.datetime.strptime(etime,"%Y-%m-%d %H:%M:%S")
206                     dt=tnow-bt
207                     bt=tnow+datetime.timedelta(seconds=600)
208                     et=et+dt+datetime.timedelta(seconds=600)
209                     btime=bt.strftime("%Y-%m-%d %H:%M:%S")
210                     etime=et.strftime("%Y-%m-%d %H:%M:%S")
211                     recdb.rec_reckey(recdb.REC_TS_DECODE_QUE,title,chtxt,btime,etime,opt)
212                     sys.exit()
213         elif task["type"]==recdb.REC_TS_DECODE_QUE:
214             if dt<10*60:
215                 if status.getB25Decoding()<2:
216                     pid=os.fork()
217                     if pid!=0:#親プロセスの場合
218                             ""
219                     else:
220                         pin=recpath+"/"+title
221                         recdb.del_reckey(recdb.REC_TS_DECODE_QUE,title,chtxt,btime)
222                         recdb.rec_reckey(recdb.REC_TS_DECODING, title, chtxt, btime, etime, opt)
223                         tv2avi.b252ts(pin, chtxt, btime, etime, opt)
224                         recdb.del_reckey(recdb.REC_TS_DECODING,title,chtxt,btime)
225                         if not os.access(recpath+"/"+title+".ts", os.F_OK):
226                             recdb.del_reckey(recdb.REC_TS_DECODING, title, chtxt, btime)
227                             recdb.rec_reckey(recdb.REC_MISS_DECODE, title, chtxt, btime, etime, opt)
228                         tnow=datetime.datetime.now()
229                         bt=datetime.datetime.strptime(btime,"%Y-%m-%d %H:%M:%S")
230                         et=datetime.datetime.strptime(etime,"%Y-%m-%d %H:%M:%S")
231                         dt=tnow-bt
232                         bt=tnow+datetime.timedelta(seconds=600)
233                         et=et+dt+datetime.timedelta(seconds=600)
234                         btime=bt.strftime("%Y-%m-%d %H:%M:%S")
235                         etime=et.strftime("%Y-%m-%d %H:%M:%S")
236                         recdb.rec_reckey(recdb.REC_ENCODE_QUE, title, chtxt, btime, etime, opt)
237                         print "b25check "+recpath+"/"+title+".ts.b25 "+recpath+"/"+title+".ts"
238                         print checker.checkB25Decode(recpath+"/"+title+".ts.b25",recpath+"/"+title+".ts")
239                         if checker.checkB25Decode(recpath+"/"+title+".ts.b25",recpath+"/"+title+".ts")==1:
240                             os.remove(recpath+"/"+title+".ts.b25")
241                         sys.exit()
242                 else:
243                     recdb.del_reckey(recdb.REC_TS_DECODE_QUE,title,chtxt,btime)
244                     bt=bt+datetime.timedelta(seconds=600)
245                     et=et+datetime.timedelta(seconds=600)
246                     btime=bt.strftime("%Y-%m-%d %H:%M:%S")
247                     etime=et.strftime("%Y-%m-%d %H:%M:%S")
248                     recdb.rec_reckey(recdb.REC_TS_DECODE_QUE,title,chtxt,btime,etime,opt)
249         elif task["type"]==recdb.REC_ENCODE_QUE:
250             if dt<10*60:
251                 if status.getEncoding()<int(configreader.getenv("enc_max")):
252                     pid=os.fork()
253                     if pid>0:#親プロセスの場合
254                             ""
255                     else:
256                         pin=recpath+"/"+title+".ts"
257                         if re.search("d",opt):
258                             pin=recpath+"/"+title+"sa.avi"
259                         if re.search("5",opt):
260                             pin=recpath+"/"+title+"sa.avi"
261                         pout=recpath+"/"+title+".avi"
262                         print pin+":"+pout+":"+opt
263                         recdb.del_reckey(recdb.REC_ENCODE_QUE,title,chtxt,btime)
264                         recdb.rec_reckey(recdb.REC_ENCODE_LOCAL, title, chtxt, btime, etime, opt)
265                         tv2avi.ts2avi(pin, pout, opt)
266                         recdb.del_reckey(recdb.REC_ENCODE_LOCAL,title,chtxt,btime)
267                         recdb.rec_reckey(recdb.REC_FIN_LOCAL, title, chtxt, btime, etime, opt)
268                         sys.exit()
269                 else:
270                     recdb.del_reckey(recdb.REC_ENCODE_QUE,title,chtxt,btime)
271                     bt=bt+datetime.timedelta(seconds=600)
272                     et=et+datetime.timedelta(seconds=600)
273                     btime=bt.strftime("%Y-%m-%d %H:%M:%S")
274                     etime=et.strftime("%Y-%m-%d %H:%M:%S")
275                     recdb.rec_reckey(recdb.REC_ENCODE_QUE,title,chtxt,btime,etime,opt)