OSDN Git Service

fix a bug,
[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-2011 Yukikaze
5 import datetime
6 import os
7 import os.path
8 import re
9 import sys
10 import time
11 import shutil
12 import traceback
13
14 import auto_rec
15 import auto_process
16 import chdb
17 import configreader
18 import epgdb
19 import rec10d
20 import recdb
21 import status
22 import tv2audio
23 import tv2avi
24 import tv2mkv
25 import tv2mp4
26 import install
27 import recdblist
28 import recque
29 recpath = configreader.getConfPath('recpath')
30 movepath = configreader.getConfPath('move_destpath')
31 path = str(os.path.dirname(os.path.abspath(__file__))) + "/"
32 def task():
33     """
34     数分毎に実行されるタスク処理
35     予定によって子プロセスを生成し処理する。
36     """
37     try:
38         if rec10d.rec10db.select_installed_in_status()==0 or rec10d.rec10db.select_version_in_status()<recdblist.version:
39             install.install()
40         elif rec10d.rec10db.select_installed_in_status()==1:
41             import scan_ch
42             rec10d.rec10db.new_epg_ch()
43             scan_ch.searchCh()
44             rec10d.rec10db.change_chscaned_in_status()
45     except:
46         install.install()
47     recdb.deleteOldProgramBeforeTheseHours("24")
48     recdb.delete_old_auto_bayes("1")
49     recdb.delete_old_auto_keyword("1")
50     tasks = recdb.getProgramsInTheseHours("3")
51     inum = recdb.countRecNow_minutes("10")
52     recdblist.printutf8(u"rec10処理開始"+ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),verbose_level=800)
53     recdblist.printutf8(u"直近録画予約件数:" + str(inum) + u"BS/CS録画中件数:" + str(status.getBSCSRecording()) + u"TE録画中件数:" + str(status.getTERecording()) ,verbose_level=800)
54     encodenum=0
55     b25num=0
56     dnow=datetime.datetime.now()
57     if dnow.minute % 10 < 5:
58         pid = os.fork()
59         if pid != 0:
60             ""
61         else:
62             search_keyword(recdb.getAllJbkKeyword())
63             recque.searchRecQue(recpath)
64             sys.exit()
65     else:
66         pid = os.fork()
67         if pid!=0:
68             ""
69         else:
70             time.sleep(10)
71             auto_process.autoCheck(recpath)
72             time.sleep(10)
73             auto_process.killDeadEncode(recpath)
74             sys.exit()
75     update = chdb.update()
76     if len(update) > 0:
77         pid = os.fork()
78         if pid != 0:
79             ""
80         else:
81             i = 0
82             for bctype in update:
83                 recnum = 0
84                 if bctype.find('te') > -1:
85                     recnum = status.getTERecording() + recdb.countRecNow_minutes_TE("10")
86                     recdblist.printutf8(u"放送種別:"+bctype + u"||該当チューナー実行中件数:" + str(status.getTERecording()) + u":直近予約件数:" + str(recdb.countRecNow_minutes_TE("10")),verbose_level=800)
87                     recnum = int(configreader.getConfEnv("te_max")) -recnum
88                 else:
89                     recnum = status.getBSCSRecording() + recdb.countRecNow_minutes_BSCS("10")
90                     recdblist.printutf8(u"放送種別:"+bctype + u"||該当チューナー実行中件数:" + str(status.getBSCSRecording()) + u":直近予約件数:" + str(recdb.countRecNow_minutes_BSCS("10")),verbose_level=800)
91                     recnum = int(configreader.getConfEnv("bscs_max")) -recnum
92                 if recnum >0 :
93                     recdblist.printutf8(str(update),verbose_level=750)
94                     rec10d.rec10db.update_status_by_bctype_epg_ch(bctype, "0")
95                     epgdb.updatebc(bctype)
96                     update = chdb.update()
97                     i = i + 1
98                 if i > 0:
99                     break
100             time.sleep(5)
101             auto_process.update_all_timeline_epg()
102             sys.exit()
103     else:
104         pid = os.fork()
105         if pid != 0:
106             ""
107         else:
108             auto_process.update_all_timeline_epg()
109             sys.exit()
110     for task in tasks:
111         typetxt = task["type"]
112         try:
113             chtxt = task['chtxt']
114         except:
115             chtxt = ""
116         try:
117             title = task['title']
118         except:
119             title = ""
120         try:
121             btime = task['btime']
122             bt = datetime.datetime.strptime(btime, "%Y-%m-%d %H:%M:%S")
123         except:
124             btime = ""
125             bt = datetime.datetime.strptime("2009-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")
126         try:
127             etime = task['etime']
128             et = datetime.datetime.strptime(etime, "%Y-%m-%d %H:%M:%S")
129         except:
130             etime = ""
131             et = datetime.datetime.strptime("2009-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")
132         try:
133             opt = task['opt']
134         except:
135             opt = ""
136         tnow = datetime.datetime.now()
137         dtt = bt-tnow
138         dt = dtt.days * 24 * 60 * 60 + dtt.seconds
139         if task["type"] == recdblist.REC_RESERVE:#"res,"+chtxt+","+title+","+btime+","+etime+","+opt
140             pid = os.fork()
141             if pid != 0:#親プロセスの場合
142                 ""
143             else:#子プロセスの場合 アップデートを行って終了
144                 type_reserve(task["type"],chtxt,title,bt,et,opt)
145                 sys.exit()
146         elif task["type"] == recdblist.REC_KEYWORD:#"key,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt
147             deltatime = task['deltatime']
148             pid = os.fork()
149             if pid != 0:#親プロセスの場合
150                 ""
151             else:#子プロセスの場合 アップデートを行って終了
152                 type_keyword(task["type"],chtxt,title, bt, et, opt, deltatime)
153                 sys.exit()
154         elif task["type"] == recdblist.REC_KEYWORD_EVERY_SOME_DAYS:#"keyevery,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt+","+deltaday
155             deltatime = task['deltatime']
156             deltaday = task['deltaday']
157             try:
158                 keyeverycounter=task['counter']
159             except:
160                 keyeverycounter=-1
161             pid = os.fork()
162             if pid != 0:#親プロセスの場合
163                 ""
164             else:#子プロセスの場合 アップデートを行って終了
165                 type_keyword_every_day(task["type"],chtxt, title, bt, et, opt, deltatime, deltaday,keyeverycounter)
166                 sys.exit()
167         elif task["type"] == recdblist.REC_FINAL_RESERVE:#"rec,"+chtxt+","+title+","+btime+","+etime+","+opt
168             pid = os.fork()
169             if pid != 0:#親プロセスの場合
170                 ""
171             else:#子プロセスの場合 アップデートを行って終了
172                 type_final(task["type"],chtxt, title, bt, et, opt)
173                 sys.exit()
174         elif task["type"] == recdblist.REC_TS_DECODE_QUE:
175             b25num=b25num+1
176             pid = os.fork()
177             if pid != 0:#親プロセスの場合
178                 ""
179             else:#子プロセスの場合 アップデートを行って終了
180                 time.sleep(5*b25num)
181                 type_decode_que(task["type"],chtxt, title, bt, et, opt)
182                 sys.exit()
183         elif task["type"] == recdblist.REC_ENCODE_QUE:
184             encodenum=encodenum+1
185             pid = os.fork()
186             if pid != 0:#親プロセスの場合
187                 ""
188             else:#子プロセスの場合 アップデートを行って終了
189                 time.sleep(5*encodenum)
190                 type_encode_que(task["type"],chtxt, title, bt, et, opt)
191                 sys.exit()
192         elif task["type"] == recdblist.REC_AVI_TO_MKV:
193             if dt < 10 * 60:
194                 pid = os.fork()
195                 if pid > 0:#親プロセスの場合
196                     ""
197                 else:
198                     makeMP4=0
199                     try:
200                         if configreader.getConfEnv("make_mp4")==1:
201                             makeMP4=1
202                     except:
203                         ""
204                     if re.search("m", opt):
205                         makeMP4=0
206                     if re.search("4", opt):
207                         makeMP4=1
208                     recdb.deleteReckey(recdblist.REC_AVI_TO_MKV, title, chtxt, btime)
209                     recdb.reserveReckey(recdblist.REC_CHANGING_CANTAINER, title, chtxt, btime, etime, opt)
210                     if makeMP4==1:
211                         tv2mp4.raw2mp4(os.path.join(recpath,title+".264"),os.path.join(recpath,title+".mp4"),opt)
212                     else:
213                         tv2mkv.raw2mkv(os.path.join(recpath,title+".264"),os.path.join(recpath,title+".mkv"),opt)
214                     recdb.deleteReckey(recdblist.REC_CHANGING_CANTAINER, title, chtxt, btime)
215                     sys.exit()
216         elif task["type"] == recdblist.REC_AVI_TO_MP4:
217             if dt < 10 * 60:
218                 pid = os.fork()
219                 if pid > 0:#親プロセスの場合
220                     ""
221                 else:
222                     makeMP4=0
223                     try:
224                         if configreader.getConfEnv("make_mp4")==1:
225                             makeMP4=1
226                     except:
227                         ""
228                     if re.search("m", opt):
229                         makeMP4=0
230                     if re.search("4", opt):
231                         makeMP4=1
232                     recdb.deleteReckey(recdblist.REC_AVI_TO_MP4, title, chtxt, btime)
233                     recdb.reserveReckey(recdblist.REC_CHANGING_CANTAINER, title, chtxt, btime, etime, opt)
234                     if makeMP4==1:
235                         tv2mp4.ts2mp4(pin, pout, opt)
236                         tv2mp4.raw2mp4(os.path.join(recpath,title+".264"),os.path.join(recpath,title+".mp4"),opt)
237                     else:
238                         tv2mkv.raw2mkv(os.path.join(recpath,title+".264"),os.path.join(recpath,title+".mkv"),opt)
239                     recdb.deleteReckey(recdblist.REC_CHANGING_CANTAINER, title, chtxt, btime)
240                     sys.exit()
241         elif task["type"] == recdblist.REC_MKV_TO_MP4:
242             if dt < 10 * 60:
243                 pid = os.fork()
244                 if pid > 0:#親プロセスの場合
245                     ""
246                 else:
247                     recdb.deleteReckey(recdblist.REC_MKV_TO_MP4, title, chtxt, btime)
248                     recdb.reserveReckey(recdblist.REC_CHANGING_CANTAINER, title, chtxt, btime, etime, opt)
249                     tv2mp4.mkv2mp4(os.path.join(recpath,title+".mkv"),os.path.join(recpath,title+".mp4"))
250                     recdb.deleteReckey(recdblist.REC_CHANGING_CANTAINER, title, chtxt, btime)
251                     sys.exit()
252     sys.exit()
253 def search_keyword(key):
254     tnow = datetime.datetime.now()
255     nows =tnow.strftime("%Y-%m-%d %H:%M:%S")
256     for k,auto,opt in key:
257         recdatum = epgdb.searchTimeAuto(k,nows, "144")
258         for recdata in recdatum:
259             if recdata[1] != "":
260                 chtxtt = recdata[0]
261                 titlet = recdata[1]
262                 btimet = recdata[2]
263                 etimet = recdata[3]
264                 btt = datetime.datetime.strptime(btimet, "%Y-%m-%d %H:%M:%S")
265                 ett = datetime.datetime.strptime(etimet, "%Y-%m-%d %H:%M:%S")
266                 btimet = btt.strftime("%Y-%m-%d %H:%M:%S")
267                 etimet = ett.strftime("%Y-%m-%d %H:%M:%S")
268                 #if status.getSettings_auto_jbk()==1:
269                 if auto==1 or status.getSettings_auto_jbk()==1:
270                     topt=opt
271                     if len(topt)==0:
272                         topt=status.getSettings_auto_opt()
273                     try:
274                         maxnum=0
275                         ch=chdb.searchCHFromChtxt(chtxtt)
276                         if len(ch['ch'])>2:
277                             maxnum=epgdb.countSchedule(btimet, etimet)[1]
278                             maxnum=int(configreader.getConfEnv("bscs_max"))-maxnum
279                         else:
280                             maxnum=epgdb.countSchedule(btimet, etimet)[0]
281                             maxnum=int(configreader.getConfEnv("te_max"))-maxnum
282                         if maxnum>0:
283                             if recdb.checkDuplicated(titlet, chtxtt, btimet, etimet)==0:
284                                 recdb.reserveReckey(recdblist.REC_RESERVE,titlet,chtxtt, btimet, etimet,topt)
285                     except Exception, inst:
286                         recdblist.addCommonlogEX("Error", "search_keyword_auto_jbk(timerec.py)", str(type(inst)),str(inst)+traceback.format_exc(),log_level=200)
287                 try:
288                     recdb.reserveAutoKeyword(chtxtt, titlet, btimet, etimet)
289                 except Exception, inst:
290                     recdblist.addCommonlogEX("Error", "search_keyword(timerec.py)", str(type(inst)),str(inst)+traceback.format_exc(),log_level=200)
291 def type_reserve(typetxt,chtxt,title,bt,et,opt):
292     btime = bt.strftime("%Y-%m-%d %H:%M:%S")
293     etime = et.strftime("%Y-%m-%d %H:%M:%S")
294     typetxtnow=typetxt
295     typetxtfinal=""
296     if typetxt==recdblist.REC_RESERVE:
297         typetxtfinal=recdblist.REC_FINAL_RESERVE
298     tnow = datetime.datetime.now()
299     dtt = bt-tnow
300     dt = dtt.days * 24 * 60 * 60 + dtt.seconds
301     if (dt < 58 * 60 and dt > 30 * 60):
302         bctypet = chdb.searchCHFromChtxt(chtxt)['bctype']
303         chdatat = rec10d.rec10db.select_by_bctype_epg_ch(bctypet)
304         dt1 = bt - datetime.datetime.strptime(chdatat[0][4], "%Y-%m-%d %H:%M:%S")
305         dt1 = dt1.days * 24 * 60 * 60 + dt1.seconds
306         if dt1 < 60 * 60:
307             recdata = epgdb.searchTime(title, btime, "5", chtxt)
308             chtxtn = recdata[0]
309             titlen = recdata[1]
310             btimen = recdata[2]
311             etimen = recdata[3]
312             exp = recdata[4]
313             longexp = recdata[5]
314             category=recdata[6]
315             bt = datetime.datetime.strptime(btimen, "%Y-%m-%d %H:%M:%S")
316             et = datetime.datetime.strptime(etimen, "%Y-%m-%d %H:%M:%S")
317             btimen = bt.strftime("%Y-%m-%d %H:%M:%S")
318             etimen = et.strftime("%Y-%m-%d %H:%M:%S")
319             if chtxt != "":
320                 try:
321                     recdb.deleteReckey(typetxtnow, title, chtxt, btime)
322                     recdb.reserveReckey(typetxtfinal, titlen, chtxtn, btimen, etimen, opt)
323                     recdb.addRecLogProgram(titlen, chtxtn, btimen, etimen, opt, exp, longexp, category)
324                     auto_rec.addKey(chtxt, titlen,exp+" "+longexp)
325                     auto_rec.addKey("ALL", titlen,exp+" "+longexp)
326                     recdblist.printutf8(u"追いかけ機能実行中: "+title+" : "+titlen+" "+btimen+" "+etimen)
327                 except Exception, inst:
328                     recdblist.addCommonlogEX("Error", "Oikake DB(timerec.py)", str(type(inst)),str(inst)+traceback.format_exc(),log_level=200)
329             else:
330                 recdblist.printutf8(u"追いかけ機能エラー:番組データが見付かりません。")
331         else:
332             if rec10d.rec10db.select_by_bctype_epg_ch(bctypet)[0][5] != "0":
333                 rec10d.rec10db.update_status_by_bctype_epg_ch(bctypet, "3")
334         sys.exit()
335     elif (dt <= 30 * 60 and dt > 20 * 60):
336         recdata = epgdb.searchTime(title, btime, "5", chtxt)
337         chtxtn = recdata[0]
338         titlen = recdata[1]
339         btimen = recdata[2]
340         etimen = recdata[3]
341         exp = recdata[4]
342         longexp = recdata[5]
343         category=recdata[6]
344         bt = datetime.datetime.strptime(btimen, "%Y-%m-%d %H:%M:%S")
345         et = datetime.datetime.strptime(etimen, "%Y-%m-%d %H:%M:%S")
346         btimen = bt.strftime("%Y-%m-%d %H:%M:%S")
347         etimen = et.strftime("%Y-%m-%d %H:%M:%S")
348         if chtxt != "":
349             try:
350                 recdb.deleteReckey(typetxtnow, title, chtxt, btime)
351                 recdb.reserveReckey(typetxtfinal, titlen, chtxtn, btimen, etimen, opt)
352                 recdb.addRecLogProgram(titlen, chtxtn, btimen, etimen, opt, exp, longexp, category)
353                 auto_rec.addKey(chtxt, titlen,exp+" "+longexp)
354                 auto_rec.addKey("ALL", titlen,exp+" "+longexp)
355                 #recdblist.printutf8(u"追いかけ機能実行中: "+title+" : "+titlen+" "+btimen+" "+etimen)
356                 recdblist.addCommonlogEX(u"通常", "Oikake (timerec.py)",u"追いかけ機能実行中",u"追いかけ機能実行中: "+title+" : "+titlen+" "+btimen+" "+etimen,log_level=500)
357             except Exception, inst:
358                 recdblist.addCommonlogEX("Error", "Oikake DB(timerec.py)", str(type(inst)),str(inst)+traceback.format_exc(),log_level=200)
359     elif dt <= 20 * 60:
360         try:
361             recdb.deleteReckey(typetxtnow, title, chtxt, btime)
362             recdb.reserveReckey(typetxtfinal, title, chtxt, btime, etime, opt)
363         except Exception, inst:
364             recdblist.addCommonlogEX("Error", "Oikake DB(timerec.py)", str(type(inst)),str(inst)+traceback.format_exc(),log_level=200)
365 def type_final(typetxt,chtxt,title,bt,et,opt):
366     btime = bt.strftime("%Y-%m-%d %H:%M:%S")
367     etime = et.strftime("%Y-%m-%d %H:%M:%S")
368     typetxtnow=typetxt
369     typetxting=""
370     typetxtdecque=""
371     if typetxt==recdblist.REC_FINAL_RESERVE:
372         typetxting=recdblist.REC_TS_RECORDING
373         typetxtdecque=recdblist.REC_TS_DECODE_QUE
374     tnow = datetime.datetime.now()
375     dtt = bt-tnow
376     dt = dtt.days * 24 * 60 * 60 + dtt.seconds
377     if dt < 6 * 60 and dt > 0:
378         newtitle=title
379         recdb.deleteReckey(typetxtnow, title, chtxt, btime)
380         testpath=[os.path.join(recpath,title+".ts.b25")]
381         testpath.append(os.path.join(recpath,title+".ts"))
382         testpath.append(os.path.join(recpath,title+".avi"))
383         testpath.append(os.path.join(recpath,title+".mp4"))
384         testpath.append(os.path.join(recpath,title+".log"))
385         tcheck=0
386         for ti in testpath:
387             if os.path.exists(ti):
388                 tcheck=tcheck+1
389         if re.search("N", opt) or tcheck>0:
390             iff=""
391             try:
392                 iff=u"("+configreader.getConfEnv("iff")+u")_"
393             except:
394                 iff=""
395             newtime=bt
396             newtitle=newtitle+u"_"+iff+newtime.strftime("%Y-%m-%dT%H-%M-%S")
397         recdb.reserveReckey(typetxting, newtitle, chtxt, btime, etime, opt)
398         recdblist.addCommonlogEX(u"通常","timerec.py",u"録画開始 "+newtitle+" "+btime+" "+etime,"",log_level=500)
399         tv2avi.timetv2b25(recpath + "/" + newtitle + ".avi", chtxt, btime, etime, opt)
400         recdb.deleteReckey(typetxting, newtitle, chtxt, btime)
401         if not re.search("R", opt):
402             tnow = datetime.datetime.now()
403             bt = datetime.datetime.strptime(btime, "%Y-%m-%d %H:%M:%S")
404             et = datetime.datetime.strptime(etime, "%Y-%m-%d %H:%M:%S")
405             dt = tnow-bt
406             bt = tnow + datetime.timedelta(seconds=600)
407             et = et + dt + datetime.timedelta(seconds=600)
408             btime = bt.strftime("%Y-%m-%d %H:%M:%S")
409             etime = et.strftime("%Y-%m-%d %H:%M:%S")
410             recdb.reserveReckey(typetxtdecque, newtitle, chtxt, btime, etime, opt)
411         else:
412             try:
413                 try:
414                     shutil.copy(os.path.join(recpath,title+".ts.b25"), os.path.join(movepath,title+".ts.b25"))
415                 except:
416                     ""
417                 try:
418                     os.chmod(os.path.join(movepath,title+".ts.b25"),0777)
419                 except:
420                     ""
421                 recque.writeRecQue(movepath, chtxt, title, opt)
422                 try:
423                     os.chmod(os.path.join(movepath,title+".recq"),0777)
424                 except:
425                     ""
426             except Exception, inst:
427                 recdblist.addCommonlogEX("Error", "Move option(timerec.py)", str(type(inst)),str(inst)+traceback.format_exc(),log_level=200)
428             recdb.reserveReckey(recdblist.REC_MOVE_END, newtitle, chtxt, btime, etime, opt)
429         sys.exit()
430 def type_keyword(typetxt,chtxt,title,bt,et,opt,deltatime):
431     btime = bt.strftime("%Y-%m-%d %H:%M:%S")
432     etime = et.strftime("%Y-%m-%d %H:%M:%S")
433     typetxtnow=typetxt
434     typetxtres=""
435     if typetxt==recdblist.REC_KEYWORD:
436         typetxtres=recdblist.REC_RESERVE
437     tnow = datetime.datetime.now()
438     dtt = bt-tnow
439     dt = dtt.days * 24 * 60 * 60 + dtt.seconds
440     recdblist.printutf8(str(dt), verbose_level=800)
441     if dt <= 90 * 60 and dt > 70 * 60:
442         recdata = epgdb.searchTime(title, btime, deltatime, chtxt)
443         if recdata[1] != "":
444             chtxtt = recdata[0]
445             titlet = recdata[1]
446             btimet = recdata[2]
447             etimet = recdata[3]
448             exp = recdata[4]
449             longexp = recdata[5]
450             category=recdata[6]
451             bt = datetime.datetime.strptime(btimet, "%Y-%m-%d %H:%M:%S")
452             et = datetime.datetime.strptime(etimet, "%Y-%m-%d %H:%M:%S")
453             btimet = bt.strftime("%Y-%m-%d %H:%M:%S")
454             etimet = et.strftime("%Y-%m-%d %H:%M:%S")
455             #try:
456             recdb.deleteReckey(typetxtnow, title, chtxt, btime)
457             recdb.reserveReckey(typetxtres, titlet, chtxt, btimet, etimet, opt)
458             recdb.addRecLogProgram(titlet, chtxtt, btimet, etimet, opt, exp,longexp,category)
459             auto_rec.addKey(chtxt, titlet,exp+" "+longexp)
460             auto_rec.addKey("ALL", titlet,exp+" "+longexp)
461             recdblist.addCommonlogEX(u"通常","timerec.py",u"key "+title+u" : "+titlet+u" "+btimet+u" "+etimet,"",log_level=500)
462             #except Exception, inst:
463             #    recdblist.printutf8("Error happened in REC_KEYWORD DB")
464             #    recdblist.printutf8(type(inst))
465             #    recdblist.printutf8(inst)
466         else:
467             recdblist.printutf8("nothing match")
468     elif dt <= 70 * 60:
469         recdb.deleteReckey(typetxtnow, title, chtxt, btime)
470         recdb.reserveReckey(typetxtres, title, chtxt, btime, etime, opt)
471         recdblist.addCommonlogEX(u"エラー","timerec.py",u"nothing match","",log_level=200)
472         recdblist.addCommonlogEX(u"エラー","timerec.py",u"key "+title+u" : "+titlet+u" "+btimet+u" "+etimet,"",log_level=200)
473 def type_keyword_every_day(type,chtxt,title,bt,et,opt,deltatime,deltaday,counter):
474     btime = bt.strftime("%Y-%m-%d %H:%M:%S")
475     etime = et.strftime("%Y-%m-%d %H:%M:%S")
476     tnow = datetime.datetime.now()
477     dtt = bt-tnow
478     dt = dtt.days * 24 * 60 * 60 + dtt.seconds
479     dd = datetime.timedelta(days=int(deltaday))
480     if dtt.days < 0:
481         recdb.deleteReckey(recdblist.REC_KEYWORD_EVERY_SOME_DAYS, title, chtxt, btime)
482         bt = bt + dd
483         et = et + dd
484         btxt = bt.strftime("%Y-%m-%d %H:%M:%S")
485         etxt = et.strftime("%Y-%m-%d %H:%M:%S")
486         if counter>0:
487             recdb.reserveEverydayKeyword(title, chtxt, btxt, etxt, deltatime, opt, deltaday,counter-1)
488         elif counter==-1:
489             recdb.reserveEverydayKeyword(title, chtxt, btxt, etxt, deltatime, opt, deltaday,-1)
490     elif dt < 120 * 60:
491         recdb.deleteReckey(recdblist.REC_KEYWORD_EVERY_SOME_DAYS, title, chtxt, btime)
492         bt = bt + dd
493         et = et + dd
494         btxt = bt.strftime("%Y-%m-%d %H:%M:%S")
495         etxt = et.strftime("%Y-%m-%d %H:%M:%S")
496         if counter>0:
497             recdb.reserveEverydayKeyword(title, chtxt, btxt, etxt, deltatime, opt, deltaday,counter-1)
498         elif counter==-1:
499             recdb.reserveEverydayKeyword(title, chtxt, btxt, etxt, deltatime, opt, deltaday,-1)
500         recdata = epgdb.searchTime(title, btime, deltatime, chtxt)
501         if recdata[1] != "":
502             chtxtt = recdata[0]
503             titlet = recdata[1]
504             btimet = recdata[2]
505             etimet = recdata[3]
506             exp = recdata[4]
507             longexp = recdata[5]
508             category=recdata[6]
509             bt = datetime.datetime.strptime(btimet, "%Y-%m-%d %H:%M:%S")
510             et = datetime.datetime.strptime(etimet, "%Y-%m-%d %H:%M:%S")
511             btimet = bt.strftime("%Y-%m-%d %H:%M:%S")
512             etimet = et.strftime("%Y-%m-%d %H:%M:%S")
513             #try:
514             recdb.reserveKeyword(titlet, chtxt, btimet, etimet, deltatime, opt)
515         else:
516             recdb.reserveKeyword(title, chtxt, btime, etime, deltatime, opt)
517 def type_decode_que(typetxt,chtxt,title,bt,et,opt):
518     btime = bt.strftime("%Y-%m-%d %H:%M:%S")
519     etime = et.strftime("%Y-%m-%d %H:%M:%S")
520     tnow = datetime.datetime.now()
521     dtt = bt-tnow
522     dt = dtt.days * 24 * 60 * 60 + dtt.seconds
523     typetxtnow=typetxt
524     typetxting=""
525     typetxtmiss=""
526     typetxtencque=""
527     if typetxt== recdblist.REC_TS_DECODE_QUE:
528         typetxting=recdblist.REC_TS_DECODING
529         typetxtmiss=recdblist.REC_MISS_DECODE
530         typetxtencque=recdblist.REC_ENCODE_QUE
531     tnow = datetime.datetime.now()
532     dtt = bt-tnow
533     dt = dtt.days * 24 * 60 * 60 + dtt.seconds
534     if dt < 10 * 60:
535         if status.getB25Decoding() < 2:
536             pin = recpath + "/" + title
537             recdb.deleteReckey(typetxtnow, title, chtxt, btime)
538             recdb.reserveReckey(typetxting, title, chtxt, btime, etime, opt)
539             tv2avi.b252ts(pin, chtxt, btime, etime, opt)
540             recdb.deleteReckey(typetxting, title, chtxt, btime)
541             if not os.access(recpath + "/" + title + ".ts", os.F_OK):
542                 recdb.deleteReckey(typetxting, title, chtxt, btime)
543                 recdb.reserveReckey(typetxtmiss, title, chtxt, btime, etime, opt)
544             else:
545                 auto_process.deleteTmpFile(recpath, title, ".ts")
546             bt = datetime.datetime.strptime(btime, "%Y-%m-%d %H:%M:%S")
547             et = datetime.datetime.strptime(etime, "%Y-%m-%d %H:%M:%S")
548             dt = et-bt
549             if not re.search("D", opt):
550                 tnow = datetime.datetime.now()
551                 bt = tnow + datetime.timedelta(seconds=600)
552                 et = bt + dt
553                 btime = bt.strftime("%Y-%m-%d %H:%M:%S")
554                 etime = et.strftime("%Y-%m-%d %H:%M:%S")
555                 recdb.reserveReckey(typetxtencque, title, chtxt, btime, etime, opt)
556             else:
557                 try:
558                     try:
559                         shutil.copy(os.path.join(recpath,title+".ts"), os.path.join(movepath,title+".ts"))
560                     except:
561                         ""
562                     try:
563                         os.chmod(os.path.join(movepath,title+".ts"),0777)
564                     except:
565                         ""
566                     recque.writeRecQue(movepath, chtxt, title, opt)
567                     try:
568                         os.chmod(os.path.join(movepath,title+".recq"),0777)
569                     except:
570                         ""
571                     time.sleep(5)
572                     if os.path.getsize(os.path.join(recpath,title+".ts"))==os.path.getsize(os.path.join(movepath,title+".ts")):
573                         os.remove(os.path.join(recpath,title+".ts"))
574                 except Exception, inst:
575                     errtxt1="move ts error.\n"
576                     errtxt2=str(type(inst))+"\n"
577                     errtxt2=errtxt2+str(inst)
578                     recdblist.addCommonlogEX("Error", "type_decode_que(timerec.py)", errtxt1,errtxt2+traceback.format_exc(),log_level=200)
579                 recdb.reserveReckey(recdblist.REC_MOVE_END, title, chtxt, btime, etime, opt)
580         else:
581             recdb.deleteReckey(typetxtnow, title, chtxt, btime)
582             bt = bt + datetime.timedelta(seconds=600)
583             et = et + datetime.timedelta(seconds=600)
584             btime = bt.strftime("%Y-%m-%d %H:%M:%S")
585             etime = et.strftime("%Y-%m-%d %H:%M:%S")
586             recdb.reserveReckey(typetxtnow, title, chtxt, btime, etime, opt)
587     sys.exit()
588
589 def type_encode_que(typetxt,chtxt,title,bt,et,opt):
590     btime = bt.strftime("%Y-%m-%d %H:%M:%S")
591     etime = et.strftime("%Y-%m-%d %H:%M:%S")
592     tnow = datetime.datetime.now()
593     dtt = bt-tnow
594     dt = dtt.days * 24 * 60 * 60 + dtt.seconds
595     typetxtnow=typetxt
596     typetxting=""
597     typetxtfin=""
598     if typetxt==recdblist.REC_ENCODE_QUE:
599         typetxting=recdblist.REC_ENCODE_LOCAL
600         typetxtfin=recdblist.REC_FIN_LOCAL
601     if dt < 10 * 60:
602         if status.getEncoding() < int(configreader.getConfEnv("enc_max")):
603             recdb.deleteReckey(typetxtnow, title, chtxt, btime)
604             recdb.reserveReckey(typetxting, title, chtxt, btime, etime, opt)
605             recdblist.printutf8(opt)
606             pin = recpath + "/" + title + ".ts"
607             if re.search("d", opt):
608                 pin = recpath + "/" + title + ".m2v"
609                 if not os.path.exists(pin) or os.path.getsize(pin)<100*1000:
610                     paac2 = recpath + "/" + title + "_2.aac"
611                     pmp32 = recpath + "/" + title + "_2.mp3"
612                     if not os.path.exists(paac2) and not os.path.exists(pmp32):
613                         tv2audio.ts2dualaudio_BonTsDemux(os.path.join(recpath, title+".ts"),recdblist.BONTSDEMUX_DELAY,opt)
614                 time.sleep(3)
615             elif re.search("5", opt):
616                 pin = recpath + "/" + title + ".m2v"
617                 if not os.path.exists(pin) or os.path.getsize(pin)<100*1000:
618                     paac2 = recpath + "/" + title + "_2.aac"
619                     pmp32 = recpath + "/" + title + "_2.mp3"
620                     if not os.path.exists(paac2) and not os.path.exists(pmp32):
621                         tv2audio.ts2pentaaudio_BonTsDemux(os.path.join(recpath, title+".ts"), recdblist.BONTSDEMUX_DELAY, opt)
622                 time.sleep(3)
623             makeMP4=0
624             try:
625                 if configreader.getConfEnv("make_mp4")=="1":
626                     makeMP4=1
627             except:
628                 ""
629             if re.search("m", opt):
630                 makeMP4=0
631             if re.search("4", opt):
632                 makeMP4=1
633             recdblist.printutf8(pin)
634             if not re.search("0", opt):
635                 if makeMP4==1:
636                     pout = recpath + "/" + title + ".mp4"
637                     tv2mp4.ts2mp4(pin, pout, opt)
638                 else:
639                     pout = recpath + "/" + title + ".mkv"
640                     tv2mkv.ts2mkv(pin, pout, opt)
641                 if re.search("1", opt) or re.search("2", opt):
642                     optt=opt.replace("1","MW1")
643                     optt=optt.replace("2","MW2")
644                     poutt = recpath + "/" + "m_"+title + ".mp4"
645                     if re.search("d", opt) or re.search("5", opt):
646                         if os.path.exists(os.path.join(recpath, "m_"+title+".m2v")):
647                             shutil.move(os.path.join(recpath, title+".m2v"),os.path.join(recpath, "m_"+title+".m2v"))
648                         if os.path.exists(os.path.join(recpath, "m_"+title+"_1.aac")):
649                             shutil.move(os.path.join(recpath, title+"_1.aac"),os.path.join(recpath, "m_"+title+"_1.aac"))
650                         if os.path.exists(os.path.join(recpath, "m_"+title+"_1.mp3")):
651                             shutil.move(os.path.join(recpath, title+"_1.mp3"),os.path.join(recpath, "m_"+title+"_1.mp3"))
652                         if os.path.exists(os.path.join(recpath, "m_"+title+"_2.aac")):
653                             shutil.move(os.path.join(recpath, title+"_2.aac"),os.path.join(recpath, "m_"+title+"_2.aac"))
654                         if os.path.exists(os.path.join(recpath, "m_"+title+"_2.mp3")):
655                             shutil.move(os.path.join(recpath, title+"_2.mp3"),os.path.join(recpath, "m_"+title+"_2.mp3"))
656                     shutil.move(os.path.join(recpath, title+".ts"),os.path.join(recpath, "m_"+title+".ts"))
657                     tv2mp4.ts2mp4(os.path.join(recpath, "m_"+title+".ts"), poutt, optt)
658                     shutil.move(os.path.join(recpath, "m_"+title+".ts"),os.path.join(recpath, title+".ts"))
659             else:
660                 optt=opt
661                 poutt = recpath + "/" + "m_"+title + ".mp4"
662                 shutil.move(os.path.join(recpath, title+".ts"),os.path.join(recpath, "m_"+title+".ts"))
663                 if re.search("d", opt) or re.search("5", opt):
664                     if os.path.exists(os.path.join(recpath, "m_"+title+".m2v")):
665                         shutil.move(os.path.join(recpath, title+".m2v"),os.path.join(recpath, "m_"+title+".m2v"))
666                     if os.path.exists(os.path.join(recpath, "m_"+title+"_1.aac")):
667                         shutil.move(os.path.join(recpath, title+"_1.aac"),os.path.join(recpath, "m_"+title+"_1.aac"))
668                     if os.path.exists(os.path.join(recpath, "m_"+title+"_1.mp3")):
669                         shutil.move(os.path.join(recpath, title+"_1.mp3"),os.path.join(recpath, "m_"+title+"_1.mp3"))
670                     if os.path.exists(os.path.join(recpath, "m_"+title+"_2.aac")):
671                         shutil.move(os.path.join(recpath, title+"_2.aac"),os.path.join(recpath, "m_"+title+"_2.aac"))
672                     if os.path.exists(os.path.join(recpath, "m_"+title+"_2.mp3")):
673                         shutil.move(os.path.join(recpath, title+"_2.mp3"),os.path.join(recpath, "m_"+title+"_2.mp3"))
674                 tv2mp4.ts2mp4(os.path.join(recpath, "m_"+title+".ts"), poutt, optt)
675                 shutil.move(os.path.join(recpath, "m_"+title+".ts"),os.path.join(recpath, title+".ts"))
676             recdb.deleteReckey(typetxting, title, chtxt, btime)
677             time.sleep(10)
678             if re.search("E", opt):
679                 try:
680                     if os.path.exists(os.path.join(recpath,title+".mp4")):
681                         try:
682                             shutil.copy(os.path.join(recpath,title+".mp4"), os.path.join(movepath,title+".mp4"))
683                         except:
684                             ""
685                         try:
686                             os.chmod(os.path.join(movepath,title+".mp4"),0777)
687                         except:
688                             ""
689                         recque.writeRecQue(movepath, chtxt, title, opt)
690                         try:
691                             os.chmod(os.path.join(movepath,title+".recq"),0777)
692                         except:
693                             ""
694                     elif os.path.exists(os.path.join(recpath,title+".mkv")):
695                         try:
696                             shutil.copy(os.path.join(recpath,title+".mkv"), os.path.join(movepath,title+".mkv"))
697                         except:
698                             ""
699                         try:
700                             os.chmod(os.path.join(movepath,title+".mkv"),0777)
701                         except:
702                             ""
703                         recque.writeRecQue(movepath, chtxt, title, opt)
704                         try:
705                             os.chmod(os.path.join(movepath,title+".recq"),0777)
706                         except:
707                             ""
708                 except Exception, inst:
709                     errtxt1="move mkv/mp4 error."
710                     errtxt2=str(type(inst))+"\n"
711                     errtxt2=errtxt2+str(inst)
712                     recdblist.addCommonlogEX("Error", "type_encode_que(timerec.py)", errtxt1,errtxt2+traceback.format_exc(),log_level=200)
713                 recdb.reserveReckey(recdblist.REC_MOVE_END, title, chtxt, btime, etime, opt)
714             recdb.reserveReckey(typetxtfin, title, chtxt, btime, etime, opt)
715             sys.exit()
716         else:
717             recdb.deleteReckey(typetxtnow, title, chtxt, btime)
718             bt = bt + datetime.timedelta(seconds=600)
719             et = et + datetime.timedelta(seconds=600)
720             btime = bt.strftime("%Y-%m-%d %H:%M:%S")
721             etime = et.strftime("%Y-%m-%d %H:%M:%S")
722             recdb.reserveReckey(typetxtnow, title, chtxt, btime, etime, opt)
723             sys.exit()