OSDN Git Service

a9efc7e755bcb18b9822beab0329a531b50c51af
[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 datetime
6 import os
7 import re
8 import sys
9 import time
10
11 import chdb
12 import checker
13 import configreader
14 import epgdb
15 import rec10d
16 import recdb
17 import status
18 import tv2avi
19 import tv2mkv
20 recpath = configreader.getpath('recpath')
21 path = str(os.path.dirname(os.path.abspath(__file__))) + "/"
22 def task():
23     """
24     数分毎に実行されるタスク処理
25     予定によって子プロセスを生成し処理する。
26     """
27     recdb.delete_old("24")
28     tasks = recdb.getnow("2")
29     #print tasks
30     inum = recdb.countRecNow_minutes("10")
31     #inum=recdb.countRecNow("1")
32     print "番組表更新処理"+ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
33     print "inum:" + str(inum) + "bscsrec:" + str(status.getBSCSRecording()) + "terec:" + str(status.getTERecording()) 
34
35     #if inum+status.getBSCSRecording()+status.getTERecording() < 2:
36     encodenum=0
37     b25num=0
38     update = chdb.update()
39     print update
40     if len(update) > 0:
41         pid = os.fork()
42         if pid != 0:
43             time.sleep(1)
44         else:
45             i = 0
46             for bctype in update:
47                 recnum = 0
48                 if bctype.find('te') > -1:
49                     recnum = status.getTERecording() + recdb.countRecNow_minutes_TE("10")
50                     print bctype + "//ing:" + str(status.getTERecording()) + ":task:" + str(recdb.countRecNow_minutes_TE("10"))
51                 else:
52                     recnum = status.getBSCSRecording() + recdb.countRecNow_minutes_BSCS("10")
53                     print bctype + "//ing:" + str(status.getBSCSRecording()) + ":task:" + str(recdb.countRecNow_minutes_BSCS("10"))
54                 if recnum < 2:
55                     print update
56                     rec10d.rec10db.update_status_by_bctype_chdata(bctype, "0")
57                     epgdb.updatebc(bctype)
58                     update = chdb.update()
59                     i = i + 1
60                     #rec10d.rec10db.update_by_bctype_chdata(bctype)
61                 if i > 0:
62                     break
63             sys.exit()
64     for task in tasks:
65         #print task
66         try:
67             chtxt = task['chtxt']
68         except:
69             chtxt = ""
70         try:
71             title = task['title']
72         except:
73             title = ""
74         try:
75             btime = task['btime']
76             bt = datetime.datetime.strptime(btime, "%Y-%m-%d %H:%M:%S")
77         except:
78             btime = ""
79             bt = datetime.datetime.strptime("2009-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")
80         try:
81             etime = task['etime']
82             et = datetime.datetime.strptime(etime, "%Y-%m-%d %H:%M:%S")
83         except:
84             etime = ""
85             et = datetime.datetime.strptime("2009-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")
86         try:
87             opt = task['opt']
88         except:
89             opt = ""
90         #print title
91         #print task
92         tnow = datetime.datetime.now()
93         dtt = bt-tnow
94         dt = dtt.days * 24 * 60 * 60 + dtt.seconds
95         #print title+str(dt)
96         if task["type"] == recdb.REC_RESERVE:#"res,"+chtxt+","+title+","+btime+","+etime+","+opt
97             if (dt < 58 * 60 and dt > 20 * 60):
98                 pid = os.fork()
99                 if pid != 0:#親プロセスの場合
100                     ""
101                 else:#子プロセスの場合 アップデートを行って終了
102                     bctypet = chdb.chtxtsearch(chtxt)['bctype']
103                     chdatat = rec10d.rec10db.select_by_bctype_chdata(bctypet)
104                     dt1 = datetime.datetime.strptime(chdatat[0][5], "%Y-%m-%d %H:%M:%S")-datetime.datetime.now()
105                     dt1 = dt1.days * 24 * 60 * 60 + dt1.seconds
106                     #print "oikake search:"+str(dt1)
107                     if dt1 < 60 * 60:
108                         recdata = epgdb.searchtime2(title.decode('utf-8'), btime, "5", chtxt)
109                         chtxtn = recdata[0]
110                         titlen = recdata[1]
111                         btimen = recdata[2]
112                         etimen = recdata[3]
113                         exp = recdata[4]
114                         longexp = recdata[5]
115                         category=recdata[6]
116                         bt = datetime.datetime.strptime(btimen, "%Y-%m-%d %H:%M:%S")
117                         et = datetime.datetime.strptime(etimen, "%Y-%m-%d %H:%M:%S")
118                         btimen = bt.strftime("%Y-%m-%d %H:%M:%S")
119                         etimen = et.strftime("%Y-%m-%d %H:%M:%S")
120                         if chtxt != "":
121                             try:
122                                 recdb.del_reckey(recdb.REC_RESERVE, title, chtxt, btime)
123                                 recdb.rec_reckey(recdb.REC_FINAL_RESERVE, titlen, chtxtn, btimen, etimen, opt)
124                                 recdb.rec_reclog(titlen, chtxtn, btimen, etimen, opt, exp, longexp, category)
125                                 print "Oikake "+title+" : "+titlen+" "+btimen+" "+etimen
126                             except Exception, inst:
127                                 print type(inst)
128                                 print inst
129                         else:
130                             print "nothing match"
131                     else:
132                         #print rec10d.rec10db.select_by_bctype_chdata(bctypet)
133                         if rec10d.rec10db.select_by_bctype_chdata(bctypet)[0][6] != "0":
134                             rec10d.rec10db.update_status_by_bctype_chdata(bctypet, "3")
135                     sys.exit()
136             elif dt <= 20 * 60:
137                 try:
138                     recdb.del_reckey(recdb.REC_RESERVE, title, chtxt, btime)
139                     recdb.rec_reckey(recdb.REC_FINAL_RESERVE, title, chtxt, btime, etime, opt)
140                 except Exception, inst:
141                     print type(inst)
142                     print inst
143         elif task["type"] == recdb.REC_KEYWORD:#"key,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt
144             deltatime = task['deltatime']
145             if dt < 90 * 60:
146                 recdata = epgdb.searchtime2(title.decode('utf-8'), btime, deltatime, chtxt)
147                 if recdata[1] != "":
148                     chtxtt = recdata[0]
149                     titlet = recdata[1]
150                     btimet = recdata[2]
151                     etimet = recdata[3]
152                     exp = recdata[4]
153                     longexp = recdata[5]
154                     category=recdata[6]
155                     bt = datetime.datetime.strptime(btimet, "%Y-%m-%d %H:%M:%S")
156                     et = datetime.datetime.strptime(etimet, "%Y-%m-%d %H:%M:%S")
157                     btimet = bt.strftime("%Y-%m-%d %H:%M:%S")
158                     etimet = et.strftime("%Y-%m-%d %H:%M:%S")
159                     try:
160                         recdb.del_reckey(recdb.REC_KEYWORD, title, chtxt, btime)
161                         recdb.rec_reckey(recdb.REC_RESERVE, titlet, chtxtt, btimet, etimet, opt)
162                         
163                         print "key "+title+" : "+titlet+" "+btimet+" "+etimet
164                     except Exception, inst:
165                         print type(inst)
166                         print inst
167                     recdb.rec_reclog(titlet, chtxtt, btimet, etimet, opt, exp,longexp,category)
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 "録画開始 "+title+" "+btime+" "+etime
196                 pid = os.fork()
197                 if pid != 0:#親プロセスの場合
198                     ""
199                 else:
200                     ttitle=title
201                     #print title
202                     testpath=[os.path.join(recpath,title+".ts.b25")]
203                     testpath.append(os.path.join(recpath,title+".ts"))
204                     testpath.append(os.path.join(recpath,title+".avi"))
205                     testpath.append(os.path.join(recpath,title+".mkv"))
206                     testpath.append(os.path.join(recpath,title+".log"))
207                     tcheck=0
208                     for ti in testpath:
209                         if os.path.exists(ti):
210                             tcheck=tcheck+1
211                     if tcheck>0:
212                         ttitle=title+"_"+datetime.datetime.now().strftime("%Y%m%d%H%M")
213                     tv2avi.timetv2b25(recpath + "/" + ttitle + ".avi", chtxt, btime, etime, opt)
214                     recdb.del_reckey(recdb.REC_TS_RECORDING, title, chtxt, btime)
215                     tnow = datetime.datetime.now()
216                     bt = datetime.datetime.strptime(btime, "%Y-%m-%d %H:%M:%S")
217                     et = datetime.datetime.strptime(etime, "%Y-%m-%d %H:%M:%S")
218                     dt = tnow-bt
219                     bt = tnow + datetime.timedelta(seconds=600)
220                     et = et + dt + datetime.timedelta(seconds=600)
221                     btime = bt.strftime("%Y-%m-%d %H:%M:%S")
222                     etime = et.strftime("%Y-%m-%d %H:%M:%S")
223                     recdb.rec_reckey(recdb.REC_TS_DECODE_QUE, ttitle, chtxt, btime, etime, opt)
224                     sys.exit()
225         elif task["type"] == recdb.REC_TS_DECODE_QUE:
226             if dt < 10 * 60:
227                 b25num=b25num+1
228                 pid = os.fork()
229                 if pid != 0:#親プロセスの場合
230                     ""
231                 else:
232                     if b25num>1:
233                         time.sleep(5*b25num)
234                     if status.getB25Decoding() < 2:
235                         pin = recpath + "/" + title
236                         recdb.del_reckey(recdb.REC_TS_DECODE_QUE, title, chtxt, btime)
237                         recdb.rec_reckey(recdb.REC_TS_DECODING, title, chtxt, btime, etime, opt)
238                         tv2avi.b252ts(pin, chtxt, btime, etime, opt)
239                         recdb.del_reckey(recdb.REC_TS_DECODING, title, chtxt, btime)
240                         if not os.access(recpath + "/" + title + ".ts", os.F_OK):
241                             recdb.del_reckey(recdb.REC_TS_DECODING, title, chtxt, btime)
242                             recdb.rec_reckey(recdb.REC_MISS_DECODE, title, chtxt, btime, etime, opt)
243                         bt = datetime.datetime.strptime(btime, "%Y-%m-%d %H:%M:%S")
244                         et = datetime.datetime.strptime(etime, "%Y-%m-%d %H:%M:%S")
245                         dt = et-bt
246                         tnow = datetime.datetime.now()
247                         bt = tnow + datetime.timedelta(seconds=900)
248                         et = bt + dt
249                         btime = bt.strftime("%Y-%m-%d %H:%M:%S")
250                         etime = et.strftime("%Y-%m-%d %H:%M:%S")
251                         recdb.rec_reckey(recdb.REC_ENCODE_QUE, title, chtxt, btime, etime, opt)
252                         #print checker.checkB25Decode(recpath + "/" + title + ".ts.b25", recpath + "/" + title + ".ts")
253                         if checker.checkB25Decode(recpath + "/" + title + ".ts.b25", recpath + "/" + title + ".ts") == 1:
254                             os.remove(recpath + "/" + title + ".ts.b25")
255                         sys.exit()
256                     else:
257                         recdb.del_reckey(recdb.REC_TS_DECODE_QUE, title, chtxt, btime)
258                         bt = bt + datetime.timedelta(seconds=600)
259                         et = et + datetime.timedelta(seconds=600)
260                         btime = bt.strftime("%Y-%m-%d %H:%M:%S")
261                         etime = et.strftime("%Y-%m-%d %H:%M:%S")
262                         recdb.rec_reckey(recdb.REC_TS_DECODE_QUE, title, chtxt, btime, etime, opt)
263                         sys.exit()
264         elif task["type"] == recdb.REC_ENCODE_QUE:
265             if dt < 10 * 60:
266                 encodenum=encodenum+1
267                 pid = os.fork()
268                 if pid > 0:#親プロセスの場合
269                     ""
270                 else:
271                     if encodenum>1:
272                         time.sleep(5*encodenum)
273                     if status.getEncoding() < int(configreader.getenv("enc_max")):
274                         print opt
275                         pin = recpath + "/" + title + ".ts"
276                         if re.search("d", opt):
277                             pin = recpath + "/" + title + ".sa.avi"
278                         if re.search("5", opt):
279                             pin = recpath + "/" + title + ".sa.avi"
280                         #pout = recpath + "/" + title + ".avi"
281                         pout = recpath + "/" + title + ".mkv"
282                         print [pin, pout, opt]
283                         print pin
284                         #print pin+":"+pout+":"+opt
285                         recdb.del_reckey(recdb.REC_ENCODE_QUE, title, chtxt, btime)
286                         recdb.rec_reckey(recdb.REC_ENCODE_LOCAL, title, chtxt, btime, etime, opt)
287                         tv2mkv.ts2mkv(pin, pout, opt)
288                         #tv2avi.ts2avi(pin, pout, opt)
289                         recdb.del_reckey(recdb.REC_ENCODE_LOCAL, title, chtxt, btime)
290                         recdb.rec_reckey(recdb.REC_FIN_LOCAL, title, chtxt, btime, etime, opt)
291                         sys.exit()
292                     else:
293                         recdb.del_reckey(recdb.REC_ENCODE_QUE, title, chtxt, btime)
294                         bt = bt + datetime.timedelta(seconds=600)
295                         et = et + datetime.timedelta(seconds=600)
296                         btime = bt.strftime("%Y-%m-%d %H:%M:%S")
297                         etime = et.strftime("%Y-%m-%d %H:%M:%S")
298                         recdb.rec_reckey(recdb.REC_ENCODE_QUE, title, chtxt, btime, etime, opt)
299                         sys.exit()
300         elif task["type"] == recdb.REC_AVI_TO_MKV:
301             if dt < 10 * 60:
302                 pid = os.fork()
303                 if pid > 0:#親プロセスの場合
304                     ""
305                 else:
306                     recdb.del_reckey(recdb.REC_AVI_TO_MKV, title, chtxt, btime)
307                     recdb.rec_reckey(recdb.REC_CHANGING_CANTAINER, title, chtxt, btime, etime, opt)
308                     tv2mkv.avi2mkv(os.path.join(recpath,title+".avi"),os.path.join(recpath,title+".mkv"))
309                     recdb.del_reckey(recdb.REC_CHANGING_CANTAINER, title, chtxt, btime)
310                     sys.exit()
311         elif task["type"] == recdb.REC_AUTO_KEYWORD:#"key,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt
312             deltatime = "24"
313             if dt < 90 * 60:
314                 recdatum = epgdb.searchtime_auto(title.decode('utf-8'), btime, deltatime, chtxt)
315                 for recdata in recdatum:
316                     if recdata[1] != "":
317                         chtxtt = recdata[0]
318                         titlet = recdata[1]
319                         btimet = recdata[2]
320                         etimet = recdata[3]
321                         exp = recdata[4]
322                         longexp = recdata[5]
323                         category=recdata[6]
324                         btt = datetime.datetime.strptime(btimet, "%Y-%m-%d %H:%M:%S")
325                         ett = datetime.datetime.strptime(etimet, "%Y-%m-%d %H:%M:%S")
326                         btimet = btt.strftime("%Y-%m-%d %H:%M:%S")
327                         etimet = ett.strftime("%Y-%m-%d %H:%M:%S")
328                         try:
329                             recdb.rec_reckey(recdb.REC_AUTO_SUGGEST, titlet, chtxtt, btimet, etimet, opt)
330                         except Exception, inst:
331                             print type(inst)
332                             print inst
333                 dd = datetime.timedelta(days=1)
334                 bt = bt + dd
335                 et = et + dd
336                 btxt = bt.strftime("%Y-%m-%d %H:%M:%S")
337                 etxt = et.strftime("%Y-%m-%d %H:%M:%S")
338                 try:
339                     recdb.del_reckey(recdb.REC_AUTO_KEYWORD, title, chtxt, btime)
340                     recdb.auto_keyreserv(title, chtxt, btxt, etxt, "24", opt)
341                 except Exception, inst:
342                     print type(inst)
343                     print inst
344     sys.exit()