OSDN Git Service

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