OSDN Git Service

fix status double counting 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 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("6")
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     update = chdb.update()
37     print update
38     if len(update) > 0:
39         pid = os.fork()
40         if pid != 0:
41             time.sleep(1)
42         else:
43             i = 0
44             for bctype in update:
45                 recnum = 0
46                 if bctype.find('te') > -1:
47                     recnum = status.getTERecording() + recdb.countRecNow_minutes_TE("10")
48                     print bctype + "//ing:" + str(status.getTERecording()) + ":task:" + str(recdb.countRecNow_minutes_TE("10"))
49                 else:
50                     recnum = status.getBSCSRecording() + recdb.countRecNow_minutes_BSCS("10")
51                     print bctype + "//ing:" + str(status.getBSCSRecording()) + ":task:" + str(recdb.countRecNow_minutes_BSCS("10"))
52                 if recnum < 2:
53                     print update
54                     rec10d.rec10db.update_status_by_bctype_chdata(bctype, "0")
55                     epgdb.updatebc(bctype)
56                     update = chdb.update()
57                     i = i + 1
58                     #rec10d.rec10db.update_by_bctype_chdata(bctype)
59                 if i > 0:
60                     break
61             sys.exit()
62     for task in tasks:
63         #print task
64         try:
65             chtxt = task['chtxt']
66         except:
67             chtxt = ""
68         try:
69             title = task['title']
70         except:
71             title = ""
72         try:
73             btime = task['btime']
74             bt = datetime.datetime.strptime(btime, "%Y-%m-%d %H:%M:%S")
75         except:
76             btime = ""
77             bt = datetime.datetime.strptime("2009-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")
78         try:
79             etime = task['etime']
80             et = datetime.datetime.strptime(etime, "%Y-%m-%d %H:%M:%S")
81         except:
82             etime = ""
83             et = datetime.datetime.strptime("2009-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")
84         try:
85             opt = task['opt']
86         except:
87             opt = ""
88         #print title
89         #print task
90         tnow = datetime.datetime.now()
91         dtt = bt-tnow
92         dt = dtt.days * 24 * 60 * 60 + dtt.seconds
93         #print title+str(dt)
94         if task["type"] == recdb.REC_RESERVE:#"res,"+chtxt+","+title+","+btime+","+etime+","+opt
95             if (dt < 58 * 60 and dt > 20 * 60):
96                 pid = os.fork()
97                 if pid != 0:#親プロセスの場合
98                     ""
99                 else:#子プロセスの場合 アップデートを行って終了
100                     bctypet = chdb.chtxtsearch(chtxt)['bctype']
101                     chdatat = rec10d.rec10db.select_by_bctype_chdata(bctypet)
102                     dt1 = datetime.datetime.strptime(chdatat[0][5], "%Y-%m-%d %H:%M:%S")-datetime.datetime.now()
103                     dt1 = dt1.days * 24 * 60 * 60 + dt1.seconds
104                     #print "oikake search:"+str(dt1)
105                     if dt1 < 60 * 60:
106                         recdata = epgdb.searchtime2(title.decode('utf-8'), btime, "5", chtxt)
107                         chtxtn = recdata[0]
108                         titlen = recdata[1]
109                         btimen = recdata[2]
110                         etimen = recdata[3]
111                         bt = datetime.datetime.strptime(btimen, "%Y-%m-%d %H:%M:%S")
112                         et = datetime.datetime.strptime(etimen, "%Y-%m-%d %H:%M:%S")
113                         btimen = bt.strftime("%Y-%m-%d %H:%M:%S")
114                         etimen = et.strftime("%Y-%m-%d %H:%M:%S")
115                         if chtxt != "":
116                             try:
117                                 recdb.del_reckey(recdb.REC_RESERVE, title, chtxt, btime)
118                                 recdb.rec_reckey(recdb.REC_FINAL_RESERVE, titlen, chtxtn, btimen, etimen, opt)
119                                 print "Oikake "+title+" : "+titlen+" "+btimen+" "+etimen
120                             except Exception, inst:
121                                 print type(inst)
122                                 print inst
123                         else:
124                             print "nothing match"
125                     else:
126                         #print rec10d.rec10db.select_by_bctype_chdata(bctypet)
127                         if rec10d.rec10db.select_by_bctype_chdata(bctypet)[0][6] != "0":
128                             rec10d.rec10db.update_status_by_bctype_chdata(bctypet, "3")
129                     sys.exit()
130             elif dt <= 20 * 60:
131                 try:
132                     recdb.del_reckey(recdb.REC_RESERVE, title, chtxt, btime)
133                     recdb.rec_reckey(recdb.REC_FINAL_RESERVE, title, chtxt, btime, etime, opt)
134                 except Exception, inst:
135                     print type(inst)
136                     print inst
137         elif task["type"] == recdb.REC_KEYWORD:#"key,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt
138             deltatime = task['deltatime']
139             if dt < 90 * 60:
140                 recdata = epgdb.searchtime2(title.decode('utf-8'), btime, deltatime, chtxt)
141                 if recdata[1] != "":
142                     chtxtt = recdata[0]
143                     titlet = recdata[1]
144                     btimet = recdata[2]
145                     etimet = recdata[3]
146                     bt = datetime.datetime.strptime(btimet, "%Y-%m-%d %H:%M:%S")
147                     et = datetime.datetime.strptime(etimet, "%Y-%m-%d %H:%M:%S")
148                     btimet = bt.strftime("%Y-%m-%d %H:%M:%S")
149                     etimet = et.strftime("%Y-%m-%d %H:%M:%S")
150                     try:
151                         recdb.del_reckey(recdb.REC_KEYWORD, title, chtxt, btime)
152                         recdb.rec_reckey(recdb.REC_RESERVE, titlet, chtxtt, btimet, etimet, opt)
153                         print "key "+title+" : "+titlet+" "+btimet+" "+etimet
154                     except Exception, inst:
155                         print type(inst)
156                         print inst
157                 else:
158                     print "nothing match"
159         elif task["type"] == recdb.REC_KEYWORD_EVERY_SOME_DAYS:#"keyevery,"+chtxt+","+keyword+","+btime+","+deltatime+","+opt+","+deltaday
160             deltatime = task['deltatime']
161             deltaday = task['deltaday']
162             dd = datetime.timedelta(days=int(deltaday))
163             if dtt.days < 0:
164                 recdb.del_reckey(recdb.REC_KEYWORD_EVERY_SOME_DAYS, title, chtxt, btime)
165                 bt = bt + dd
166                 et = et + dd
167                 btxt = bt.strftime("%Y-%m-%d %H:%M:%S")
168                 etxt = et.strftime("%Y-%m-%d %H:%M:%S")
169                 recdb.everyreserv(title, chtxt, btxt, etxt, deltatime, opt, deltaday)
170             elif dt < 120 * 60:
171                 recdb.keyreserv(title, chtxt, btime, etime, deltatime, opt)
172                 recdb.del_reckey(recdb.REC_KEYWORD_EVERY_SOME_DAYS, title, chtxt, btime)
173                 bt = bt + dd
174                 et = et + dd
175                 btxt = bt.strftime("%Y-%m-%d %H:%M:%S")
176                 etxt = et.strftime("%Y-%m-%d %H:%M:%S")
177                 recdb.everyreserv(title, chtxt, btxt, etxt, deltatime, opt, deltaday)
178             
179         elif task["type"] == recdb.REC_FINAL_RESERVE:#"rec,"+chtxt+","+title+","+btime+","+etime+","+opt
180             print dt
181             if dt < 6 * 60 and dt > 0:
182                 recdb.del_reckey(recdb.REC_FINAL_RESERVE, title, chtxt, btime)
183                 recdb.rec_reckey(recdb.REC_TS_RECORDING, title, chtxt, btime, etime, opt)
184                 print "録画開始 "+title+" "+btime+" "+etime
185                 pid = os.fork()
186                 if pid != 0:#親プロセスの場合
187                     ""
188                 else:
189                     #print title
190                     tv2avi.timetv2b25(recpath + "/" + title + ".avi", chtxt, btime, etime, opt)
191                     recdb.del_reckey(recdb.REC_TS_RECORDING, title, chtxt, btime)
192                     tnow = datetime.datetime.now()
193                     bt = datetime.datetime.strptime(btime, "%Y-%m-%d %H:%M:%S")
194                     et = datetime.datetime.strptime(etime, "%Y-%m-%d %H:%M:%S")
195                     dt = tnow-bt
196                     bt = tnow + datetime.timedelta(seconds=600)
197                     et = et + dt + datetime.timedelta(seconds=600)
198                     btime = bt.strftime("%Y-%m-%d %H:%M:%S")
199                     etime = et.strftime("%Y-%m-%d %H:%M:%S")
200                     recdb.rec_reckey(recdb.REC_TS_DECODE_QUE, title, chtxt, btime, etime, opt)
201                     sys.exit()
202         elif task["type"] == recdb.REC_TS_DECODE_QUE:
203             if dt < 10 * 60:
204                 if status.getB25Decoding() < 2:
205                     pid = os.fork()
206                     if pid != 0:#親プロセスの場合
207                         ""
208                     else:
209                         pin = recpath + "/" + title
210                         recdb.del_reckey(recdb.REC_TS_DECODE_QUE, title, chtxt, btime)
211                         recdb.rec_reckey(recdb.REC_TS_DECODING, title, chtxt, btime, etime, opt)
212                         tv2avi.b252ts(pin, chtxt, btime, etime, opt)
213                         recdb.del_reckey(recdb.REC_TS_DECODING, title, chtxt, btime)
214                         if not os.access(recpath + "/" + title + ".ts", os.F_OK):
215                             recdb.del_reckey(recdb.REC_TS_DECODING, title, chtxt, btime)
216                             recdb.rec_reckey(recdb.REC_MISS_DECODE, title, chtxt, btime, etime, opt)
217                         bt = datetime.datetime.strptime(btime, "%Y-%m-%d %H:%M:%S")
218                         et = datetime.datetime.strptime(etime, "%Y-%m-%d %H:%M:%S")
219                         dt = et-bt
220                         tnow = datetime.datetime.now()
221                         bt = tnow + datetime.timedelta(seconds=900)
222                         et = bt + dt
223                         btime = bt.strftime("%Y-%m-%d %H:%M:%S")
224                         etime = et.strftime("%Y-%m-%d %H:%M:%S")
225                         recdb.rec_reckey(recdb.REC_ENCODE_QUE, title, chtxt, btime, etime, opt)
226                         print checker.checkB25Decode(recpath + "/" + title + ".ts.b25", recpath + "/" + title + ".ts")
227                         if checker.checkB25Decode(recpath + "/" + title + ".ts.b25", recpath + "/" + title + ".ts") == 1:
228                             os.remove(recpath + "/" + title + ".ts.b25")
229                         sys.exit()
230                 else:
231                     recdb.del_reckey(recdb.REC_TS_DECODE_QUE, title, chtxt, btime)
232                     bt = bt + datetime.timedelta(seconds=600)
233                     et = et + datetime.timedelta(seconds=600)
234                     btime = bt.strftime("%Y-%m-%d %H:%M:%S")
235                     etime = et.strftime("%Y-%m-%d %H:%M:%S")
236                     recdb.rec_reckey(recdb.REC_TS_DECODE_QUE, title, chtxt, btime, etime, opt)
237         elif task["type"] == recdb.REC_ENCODE_QUE:
238             if dt < 10 * 60:
239                 if status.getEncoding() < int(configreader.getenv("enc_max")):
240                     pid = os.fork()
241                     if pid > 0:#親プロセスの場合
242                         ""
243                     else:
244                         print opt
245                         pin = recpath + "/" + title + ".ts"
246                         if re.search("d", opt):
247                             pin = recpath + "/" + title + ".sa.avi"
248                         if re.search("5", opt):
249                             pin = recpath + "/" + title + ".sa.avi"
250                         #pout = recpath + "/" + title + ".avi"
251                         pout = recpath + "/" + title + ".mkv"
252                         print [pin, pout, opt]
253                         print pin
254                         #print pin+":"+pout+":"+opt
255                         recdb.del_reckey(recdb.REC_ENCODE_QUE, title, chtxt, btime)
256                         recdb.rec_reckey(recdb.REC_ENCODE_LOCAL, title, chtxt, btime, etime, opt)
257                         tv2mkv.ts2mkv(pin, pout, opt)
258                         #tv2avi.ts2avi(pin, pout, opt)
259                         recdb.del_reckey(recdb.REC_ENCODE_LOCAL, title, chtxt, btime)
260                         recdb.rec_reckey(recdb.REC_FIN_LOCAL, title, chtxt, btime, etime, opt)
261                         sys.exit()
262                 else:
263                     recdb.del_reckey(recdb.REC_ENCODE_QUE, title, chtxt, btime)
264                     bt = bt + datetime.timedelta(seconds=600)
265                     et = et + 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_ENCODE_QUE, title, chtxt, btime, etime, opt)
269     sys.exit()