OSDN Git Service

implement personal epg updating(3).
[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 import rec10d
18 recpath=configreader.getpath('recpath')
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_minutes("10")
29     #inum=recdb.countRecNow("1")
30     print "now-rectask"
31     print "inum:"+str(inum)+"bscsrec:"+str(status.getBSCSRecording())+"terec:"+str(status.getTERecording())+" epg:"+str(status.getEPGUpdating())
32
33     #if inum+status.getBSCSRecording()+status.getTERecording() < 2:
34     update=chdb.update()
35     print "番組表更新処理"
36     if len(update)>0:
37         pid=os.fork()
38         if pid!=0:
39             time.sleep(1)
40         else:
41             i=0
42             for bctype in update:
43                 recnum=0
44                 if bctype.find('te')!=-1:
45                     recnum=status.getTERecording()+recdb.countRecNow_minutes_TE("10")
46                     print bctype+"//ing:"+str(status.getTERecording())+":task:"+str(recdb.countRecNow_minutes_TE("10"))
47                 else:
48                     recnum=status.getBSCSRecording()+recdb.countRecNow_minutes_BSCS("10")
49                     print bctype+"//ing:"+str(status.getBSCSRecording())+":task:"+str(recdb.countRecNow_minutes_BSCS("10"))
50                 if recnum < 2:
51                     print update
52                     rec10d.rec10db.update_status_by_bctype_chdata(bctype,"0")
53                     epgdb.updatebc(bctype)
54                     update=chdb.update()
55                     #rec10d.rec10db.update_by_bctype_chdata(bctype)
56                 i=i+1
57                 if i>1:
58                     break
59             sys.exit()
60         """if len(update)>0 and status.getEPGUpdating()==0:
61             #status.setEPGUpdating(1)
62             print "番組表を更新"
63             #print update
64             status.setEPGUpdating(1)
65             pid=os.fork()
66             if pid!=0:#親プロセスの場合
67                 ""
68             else:#子プロセスの場合 アップデートを行って終了
69                 i=0
70                 for bctype in update:
71                     time.sleep(1)
72                     print bctype
73                     epgdb.updatebc(bctype)
74                     update=chdb.update()
75                     i=i+1
76                     print update
77                     if i>10:
78                         break
79                 status.setEPGUpdating(0)
80                 sys.exit()"""
81     for task in tasks:
82         #print task
83         try:
84             chtxt=task['chtxt']
85         except:
86             chtxt=""
87         try:
88             title=task['title']
89         except:
90             title=""
91         try:
92             btime=task['btime']
93             bt=datetime.datetime.strptime(btime,"%Y-%m-%d %H:%M:%S")
94         except:
95             btime=""
96             bt=datetime.datetime.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S")
97         try:
98             etime=task['etime']
99             et=datetime.datetime.strptime(etime,"%Y-%m-%d %H:%M:%S")
100         except:
101             etime=""
102             et=datetime.datetime.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S")
103         try:
104             opt=task['opt']
105         except:
106             opt=""
107         tnow=datetime.datetime.now()
108         dtt=bt-tnow
109         dt=dtt.days*24*60*60+dtt.seconds
110         
111         if task["type"]==recdb.REC_RESERVE:#"res,"+chtxt+","+title+","+btime+","+etime+","+opt
112             print dt
113             if (dt<58*60 and dt>20*60):
114                 pid=os.fork()
115                 if pid!=0:#親プロセスの場合
116                     ""
117                 else:#子プロセスの場合 アップデートを行って終了
118                     bctypet=chdb.chtxtsearch(chtxt)['bctype']
119                     chdatat=rec10d.rec10db.select_by_bctype_chdata(bctypet)
120                     dt1=datetime.datetime.now()-datetime.datetime.strptime(chdatat[5],"%Y-%m-%d %H:%M:%S")
121                     dt1=dt1.days*24*60*60+dt1.seconds
122                     if dt1<60*60:
123                         recdata=epgdb.searchtime2(title.decode('utf-8'),btime,"5",chtxt)
124                         chtxtn=recdata[0]
125                         titlen=recdata[1]
126                         btimen=recdata[2]
127                         etimen=recdata[3]
128                         bt=datetime.datetime.strptime(btimen,"%Y-%m-%d %H:%M:%S")
129                         et=datetime.datetime.strptime(etimen,"%Y-%m-%d %H:%M:%S")
130                         btimen=bt.strftime("%Y-%m-%d %H:%M:%S")
131                         etimen=et.strftime("%Y-%m-%d %H:%M:%S")
132                         if chtxt!="":
133                             try:
134                                 recdb.del_reckey(recdb.REC_RESERVE, title, chtxt, btime)
135                                 recdb.rec_reckey(recdb.REC_FINAL_RESERVE, titlen, chtxtn, btimen, etimen, opt)
136                             except Exception,inst:
137                                 print type(inst)
138                                 print inst
139                         else:
140                             print "nothing match"
141                     else:
142                         rec10d.rec10db.update_status_by_bctype_chdata(bctypet,"3")
143                     """cht=chdb.chtxtsearch(chtxt)['bctype']
144                     if cht.find('te')!=-1:
145                         cht='te'
146                     else:
147                         cht='bscs'
148                     bctypetemp=chdb.chtxtsearch(chtxt)['bctype']
149                     if cht=='bscs':
150                         gettaskbscs=recdb.countRecNow_minutes_BSCS("10")
151                         getnowbscs=status.getBSCSRecording()
152                         bscs=getnowbscs+gettaskbscs
153                         if bscs <2 and status.getEPGUpdating()!=1:
154                             print "now(bscs):"+str(getnowbscs)+" task(bscs):"+str(gettaskbscs)
155                             status.setEPGUpdating(1)
156                             rec10d.rec10db.update_status_by_bctype_chdata(bctype,"0")
157                             epgdb.updatebc(bctypetemp)
158                             time.sleep(10)
159                             isUpdate=1
160                             status.setEPGUpdating(0)
161                         else:
162                             isUpdate=0
163                     if cht=="te":
164                         gettaskte=recdb.countRecNow_minutes_TE("10")
165                         getnowte=status.getTERecording()
166                         te=getnowte+gettaskte
167                         if te <2 and status.getEPGUpdating()!=1:
168                             print "now(te):"+str(getnowte)+" task(te):"+str(gettaskte)
169                             status.setEPGUpdating(1)
170                             epgdb.updatebc(bctypetemp)
171                             time.sleep(10)
172                             status.setEPGUpdating(0)
173                             isUpdate=1
174                         else:
175                             isUpdate=0
176                     if isUpdate:
177                         recdata=epgdb.searchtime2(title.decode('utf-8'),btime,"5",chtxt)
178                         chtxtn=recdata[0]
179                         titlen=recdata[1]
180                         btimen=recdata[2]
181                         etimen=recdata[3]
182                         bt=datetime.datetime.strptime(btimen,"%Y-%m-%d %H:%M:%S")
183                         et=datetime.datetime.strptime(etimen,"%Y-%m-%d %H:%M:%S")
184                         btimen=bt.strftime("%Y-%m-%d %H:%M:%S")
185                         etimen=et.strftime("%Y-%m-%d %H:%M:%S")
186                         if chtxt!="":
187                             try:
188                                 recdb.del_reckey(recdb.REC_RESERVE, title, chtxt, btime)
189                                 recdb.rec_reckey(recdb.REC_FINAL_RESERVE, titlen, chtxtn, btimen, etimen, opt)
190                             except Exception,inst:
191                                 print type(inst)
192                                 print inst
193                         else:
194                             print "nothing match"
195                     else:
196                         ""
197                     sys.exit()"""
198                     
199             elif dt<=10*60:
200                 try:
201                     recdb.del_reckey(recdb.REC_RESERVE, title, chtxt, btime)
202                     recdb.rec_reckey(recdb.REC_FINAL_RESERVE, title, chtxt, btime, etime, opt)
203                 except Exception,inst:
204                     print type(inst)
205                     print inst
206         elif task["type"]==recdb.REC_KEYWORD:#"key,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt
207             deltatime=task['deltatime']
208             if dt<90*60:
209                 recdata=epgdb.searchtime2(title.decode('utf-8'),btime,deltatime,chtxt)
210                 if recdata[1]!="":
211                     chtxtt=recdata[0]
212                     titlet=recdata[1]
213                     btimet=recdata[2]
214                     etimet=recdata[3]
215                     bt=datetime.datetime.strptime(btimet,"%Y-%m-%d %H:%M:%S")
216                     et=datetime.datetime.strptime(etimet,"%Y-%m-%d %H:%M:%S")
217                     btimet=bt.strftime("%Y-%m-%d %H:%M:%S")
218                     etimet=et.strftime("%Y-%m-%d %H:%M:%S")
219                     try:
220                         recdb.del_reckey(recdb.REC_KEYWORD, title, chtxt, btime)
221                         recdb.rec_reckey(recdb.REC_RESERVE, titlet, chtxtt, btimet, etimet, opt)
222                     except Exception,inst:
223                         print type(inst)
224                         print inst
225                 else:
226                     print "nothing match"
227         elif task["type"]==recdb.REC_KEYWORD_EVERY_SOME_DAYS:#"keyevery,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt+","+deltaday
228             deltatime=task['deltatime']
229             deltaday=task['deltaday']
230             dd=datetime.timedelta(days=int(deltaday))
231             if dtt.days<0:
232                 recdb.del_reckey(recdb.REC_KEYWORD_EVERY_SOME_DAYS, title, chtxt, btime)
233                 bt=bt+dd
234                 et=et+dd
235                 btxt=bt.strftime("%Y-%m-%d %H:%M:%S")
236                 etxt=et.strftime("%Y-%m-%d %H:%M:%S")
237                 recdb.everyreserv(title,chtxt,btxt,etxt,deltatime,opt,deltaday)
238             elif dt<120*60:
239                 recdb.keyreserv(title,chtxt,btime,etime,deltatime,opt)
240                 recdb.del_reckey(recdb.REC_KEYWORD_EVERY_SOME_DAYS, title, chtxt, btime)
241                 bt=bt+dd
242                 et=et+dd
243                 btxt=bt.strftime("%Y-%m-%d %H:%M:%S")
244                 etxt=et.strftime("%Y-%m-%d %H:%M:%S")
245                 recdb.everyreserv(title,chtxt,btxt,etxt,deltatime,opt,deltaday)
246             
247         elif task["type"]==recdb.REC_FINAL_RESERVE:#"rec,"+chtxt+","+title+","+btime+","+etime+","+opt
248             print dt
249             if dt<6*60 and dt>0:
250                 recdb.del_reckey(recdb.REC_FINAL_RESERVE, title, chtxt, btime)
251                 recdb.rec_reckey(recdb.REC_TS_RECORDING, title, chtxt, btime, etime, opt)
252                 print "録画開始"
253                 pid=os.fork()
254                 if pid!=0:#親プロセスの場合
255                     ""
256                 else:
257                     #print title
258                     tv2avi.timetv2b25(recpath+"/"+title+".avi", chtxt, btime, etime, opt)
259                     recdb.del_reckey(recdb.REC_TS_RECORDING, title, chtxt, btime)
260                     tnow=datetime.datetime.now()
261                     bt=datetime.datetime.strptime(btime,"%Y-%m-%d %H:%M:%S")
262                     et=datetime.datetime.strptime(etime,"%Y-%m-%d %H:%M:%S")
263                     dt=tnow-bt
264                     bt=tnow+datetime.timedelta(seconds=600)
265                     et=et+dt+datetime.timedelta(seconds=600)
266                     btime=bt.strftime("%Y-%m-%d %H:%M:%S")
267                     etime=et.strftime("%Y-%m-%d %H:%M:%S")
268                     recdb.rec_reckey(recdb.REC_TS_DECODE_QUE,title,chtxt,btime,etime,opt)
269                     sys.exit()
270         elif task["type"]==recdb.REC_TS_DECODE_QUE:
271             if dt<10*60:
272                 if status.getB25Decoding()<2:
273                     pid=os.fork()
274                     if pid!=0:#親プロセスの場合
275                             ""
276                     else:
277                         pin=recpath+"/"+title
278                         recdb.del_reckey(recdb.REC_TS_DECODE_QUE,title,chtxt,btime)
279                         recdb.rec_reckey(recdb.REC_TS_DECODING, title, chtxt, btime, etime, opt)
280                         tv2avi.b252ts(pin, chtxt, btime, etime, opt)
281                         recdb.del_reckey(recdb.REC_TS_DECODING,title,chtxt,btime)
282                         if not os.access(recpath+"/"+title+".ts", os.F_OK):
283                             recdb.del_reckey(recdb.REC_TS_DECODING, title, chtxt, btime)
284                             recdb.rec_reckey(recdb.REC_MISS_DECODE, title, chtxt, btime, etime, opt)
285                         tnow=datetime.datetime.now()
286                         bt=datetime.datetime.strptime(btime,"%Y-%m-%d %H:%M:%S")
287                         et=datetime.datetime.strptime(etime,"%Y-%m-%d %H:%M:%S")
288                         dt=tnow-bt
289                         bt=tnow+datetime.timedelta(seconds=600)
290                         et=et+dt+datetime.timedelta(seconds=600)
291                         btime=bt.strftime("%Y-%m-%d %H:%M:%S")
292                         etime=et.strftime("%Y-%m-%d %H:%M:%S")
293                         recdb.rec_reckey(recdb.REC_ENCODE_QUE, title, chtxt, btime, etime, opt)
294                         print "b25check "+recpath+"/"+title+".ts.b25 "+recpath+"/"+title+".ts"
295                         print checker.checkB25Decode(recpath+"/"+title+".ts.b25",recpath+"/"+title+".ts")
296                         if checker.checkB25Decode(recpath+"/"+title+".ts.b25",recpath+"/"+title+".ts")==1:
297                             os.remove(recpath+"/"+title+".ts.b25")
298                         sys.exit()
299                 else:
300                     recdb.del_reckey(recdb.REC_TS_DECODE_QUE,title,chtxt,btime)
301                     bt=bt+datetime.timedelta(seconds=600)
302                     et=et+datetime.timedelta(seconds=600)
303                     btime=bt.strftime("%Y-%m-%d %H:%M:%S")
304                     etime=et.strftime("%Y-%m-%d %H:%M:%S")
305                     recdb.rec_reckey(recdb.REC_TS_DECODE_QUE,title,chtxt,btime,etime,opt)
306         elif task["type"]==recdb.REC_ENCODE_QUE:
307             if dt<10*60:
308                 if status.getEncoding()<int(configreader.getenv("enc_max")):
309                     pid=os.fork()
310                     if pid>0:#親プロセスの場合
311                             ""
312                     else:
313                         pin=recpath+"/"+title+".ts"
314                         if re.search("d",opt):
315                             pin=recpath+"/"+title+"sa.avi"
316                         if re.search("5",opt):
317                             pin=recpath+"/"+title+"sa.avi"
318                         pout=recpath+"/"+title+".avi"
319                         print [pin,pout,opt]
320                         #print pin+":"+pout+":"+opt
321                         recdb.del_reckey(recdb.REC_ENCODE_QUE,title,chtxt,btime)
322                         recdb.rec_reckey(recdb.REC_ENCODE_LOCAL, title, chtxt, btime, etime, opt)
323                         tv2avi.ts2avi(pin, pout, opt)
324                         recdb.del_reckey(recdb.REC_ENCODE_LOCAL,title,chtxt,btime)
325                         recdb.rec_reckey(recdb.REC_FIN_LOCAL, title, chtxt, btime, etime, opt)
326                         sys.exit()
327                 else:
328                     recdb.del_reckey(recdb.REC_ENCODE_QUE,title,chtxt,btime)
329                     bt=bt+datetime.timedelta(seconds=600)
330                     et=et+datetime.timedelta(seconds=600)
331                     btime=bt.strftime("%Y-%m-%d %H:%M:%S")
332                     etime=et.strftime("%Y-%m-%d %H:%M:%S")
333                     recdb.rec_reckey(recdb.REC_ENCODE_QUE,title,chtxt,btime,etime,opt)