OSDN Git Service

fix bug.
[rec10/rec10-git.git] / Rec10WEB / trunk / src / rec10web.py
1 #!/usr/bin/python
2 # coding: UTF-8
3 # Rec10 TS Recording Tools
4 # Copyright (C) 2009 Yukikaze
5 import cgi
6 import cgitb
7 import rec10web_dbMySQL
8 import os
9 import os.path
10 import re
11 import datetime
12 import ConfigParser
13 import time
14 cgitb.enable()
15 path = str(os.path.dirname(os.path.abspath(__file__))) + "/"
16 confp = ConfigParser.SafeConfigParser()
17 Conf = 'rec10.conf'
18 cpath=""
19 if (os.path.exists(os.path.join(path,Conf))):
20     cpath=os.path.join(path,Conf)
21 elif (os.path.exists(os.path.join("/etc/rec10",Conf))):
22     cpath=os.path.join("/etc/rec10",Conf)
23 elif (os.path.exists(os.path.join("/etc",Conf))):
24     cpath=os.path.join("/etc",Conf)
25
26 confp.read(cpath)
27 global f
28 f = cgi.FieldStorage()
29 def getpath(string):
30     global confp
31     return confp.get('path', string)
32 def getdbpath(string):
33     global confp
34     return confp.get('db', string)
35 def getdb():
36     retdb = ""
37     if getdbpath('db') == 'MySQL':
38         dbn = getdbpath("mysql_dbname")
39         dbh = getdbpath("mysql_host")
40         dbu = getdbpath("mysql_user")
41         dbpwd = getdbpath("mysql_passwd")
42         dbport = int(getdbpath("mysql_port"))
43         retdb = rec10web_dbMySQL.DB_MySQL(dbname=dbn, host=dbh, user=dbu, passwd=dbpwd, port=dbport)
44     return retdb
45 def getRecDate():
46     dl = database.select_all_timeline()
47     recdata = "id,type,chtxt,title,btime,etime,deltaday,opt\n"
48     #print dl
49     for d in dl:
50         id = d['id']
51         typet = d['type']
52         chtxt = d['chtxt']
53         title = d['title']
54         btime = d['btime']
55         etime = d['etime']
56         deltatime = d['deltatime']
57         deltaday = d['deltaday']
58         opt = d['opt']
59         if deltaday == None:
60             deltaday = u"なし"
61         elif deltaday == "":
62             deltaday = u"なし"
63         if opt == None:
64             opt = u"なし"
65         if typet == "reserve_flexible":
66             typet = u"浮動予約"
67         elif typet == "search_today":
68             typet = u"当日予約"
69         elif typet == "search_everyday":
70             typet = u"隔日予約"
71         elif typet == "reserve_fixed":
72             typet = u"確定予約"
73         elif typet == "grid":
74             typet = u"外部委託"
75         elif typet == "convert_ts_mp4":
76             typet = u"縁故予約"
77         elif typet == "convert_b25_ts":
78             typet = u"解読予約"
79         #print btime
80         btime = btime[5:16]
81         etime = etime[5:16]
82         btime = btime.replace("-", "/")
83         etime = etime.replace("-", "/")
84         if btime[0:5] == etime[0:5]:
85             etime = etime[6:]
86         s = "\"" + str(id) + "\",\"" + typet + "\",\"" + chtxt + "\",\"" + title + "\",\"" + btime + "\",\"" + etime + "\",\"" + deltaday + "\",\"" + opt + "\"\n"
87         s = str(id) + "," + typet + "," + chtxt + "," + title + "," + btime + "," + etime + "," + deltaday + "," + opt + "\n"
88         recdata = recdata + s
89     f = open(path + "/recdatum.csv", "w")
90     f.write(recdata)
91     f.close()
92 def getiEPGDate():
93     dl = database.select_all_iepg()
94     recdata = "id,name,chtxt\n"
95     #print dl
96     s = ""
97     for d in dl:
98         s = s + d[0] + "," + d[1] + "," + d[2] + "\n"
99     recdata = recdata + s
100     f = open(path + "/iepgdatum.csv", "w")
101     f.write(recdata)
102     f.close()
103 def getchtxt():
104     dl = database.select_all_epg_ch()
105     chopt = ""
106     for bctype, ontv, chtxt, chname, ch, csch, updatetime in dl:
107         chopt = chopt + "<option  value=" + chtxt + ">" + chname + "</option>\n                "
108     return chopt
109 def edit_date(id):
110     ret = database.select_by_id_timeline(id)
111     return ret[0]
112 def reserv_recday(keyword, chtxt, btime, etime, deltatime, opt, deltaday, day):
113     """
114     dayは月曜日を1日曜日を7とした数字
115     """
116     #bt=datetime.datetime.strptime(btime,"%Y-%m-%d %H:%M:%S")
117     #et=datetime.datetime.strptime(etime,"%Y-%m-%d %H:%M:%S")
118     bt = datetime.datetime(*time.strptime(btime, "%Y-%m-%d %H:%M:%S")[:-3])
119     et = datetime.datetime(*time.strptime(etime, "%Y-%m-%d %H:%M:%S")[:-3])
120     dt = int(day)-bt.isoweekday()
121     if dt < 0:
122         dt = dt + 7
123     dbt = bt + datetime.timedelta(days=dt)
124     det = et + datetime.timedelta(days=dt)
125     btime = dbt.strftime("%Y-%m-%d %H:%M:%S")
126     etime = det.strftime("%Y-%m-%d %H:%M:%S")
127     return reserv("keyevery", keyword, chtxt, btime, etime, deltatime, opt, "7")
128 def reserv(type, keyword, chtxt, btime, etime, deltatime, opt, deltaday):
129     MaxT = 2
130     MaxS = 2
131     tsnum = count_schedule(btime, etime)
132     MaxT = MaxT-tsnum[0]
133     MaxS = MaxS-tsnum[1]
134     bctype = ""
135     rett = ""
136     bctypegetdb = database.select_by_chtxt_epg_ch(chtxt)
137     for bctypet, ontvt, chtxtt, cht, cscht, updatetimet in bctypegetdb:
138         bctype = bctypet
139     if (type == "reserve_fixed") or (type == "reserve_flexible") or (type == "search_today") or (type == "search_everyday"):
140         if bctype.find("cs") > -1:
141             MaxS = MaxS-1
142         elif bctype.find("bs") > -1:
143             MaxS = MaxS-1
144         elif bctype.find("te") > -1:
145             MaxT = MaxT-1
146     if MaxS > -1 and MaxT > -1:
147         database.add_timeline(type=type, chtxt=chtxt, title=keyword, btime=btime, etime=etime, deltatime=deltatime, deltaday=deltaday, opt=opt)
148         rett = ""
149     else:
150         rett = "over"
151     return rett
152 def count_schedule(btime, etime):
153     """
154     return rec num (int return[0]:TE /int return[1]:BS/CS)
155     """
156     def cmpare(x, y):
157         #xt=datetime.datetime(*time.strptime(x,"%Y-%m-%d %H:%M:%S")[:-3])
158         #yt=datetime.datetime(*time.strptime(y,"%Y-%m-%d %H:%M:%S")[:-3])
159         xt = x
160         yt = y
161         if xt > yt:
162             return -1
163         elif xt == yt:
164             return 0
165         else:
166             return 1
167     dls = database.schedule_timeline(btime, etime)
168     times = []
169     btd = datetime.datetime(*time.strptime(btime, "%Y-%m-%d %H:%M:%S")[:-3])
170     etd = datetime.datetime(*time.strptime(etime, "%Y-%m-%d %H:%M:%S")[:-3])
171     for dl in dls:
172         dd1 = datetime.datetime(*time.strptime(dl[4], "%Y-%m-%d %H:%M:%S")[:-3])
173         dd2 = datetime.datetime(*time.strptime(dl[5], "%Y-%m-%d %H:%M:%S")[:-3])
174         if dd1 < btd:
175             dd1 = btd
176         if dd2 > etd:
177             dd2 = etd
178         times.append(dd1)
179         times.append(dd2)
180     times = list(set(times))
181     times.sort(cmpare)
182     times.reverse()
183     retcount = [0, 0]
184     for i in xrange(0, len(times)-2, 1):
185         bt1 = times[i]
186         et1 = times[i + 1]
187         btime1 = bt1.strftime("%Y-%m-%d %H:%M:%S")
188         etime1 = et1.strftime("%Y-%m-%d %H:%M:%S")
189         ret1 = database.count_schedule_timeline(btime1, etime1)
190         if retcount[0] < ret1[0]:
191             retcount[0] = ret1[0]
192         if retcount[1] < ret1[1]:
193             retcount[1] = ret1[1]
194     return retcount
195 def change_reserv(id, type, keyword, chtxt, btime, etime, deltatime, opt, deltaday):
196     """
197     idはテキスト
198     """
199     MaxT = 2
200     MaxS = 2
201     tsnum = count_schedule(btime, etime)
202     MaxT = MaxT-tsnum[0]
203     MaxS = MaxS-tsnum[1]
204     bctype = ""
205     rett = ""
206     for dl in database.select_by_chtxt_epg_ch(chtxt):
207         bctype = dl[0]
208     if (type == "reserve_fixed") or (type == "reserve_flexible") or (type == "search_today") or (type == "search_everyday"):
209         if bctype.find("cs") > -1:
210             MaxS = MaxS-1
211         elif bctype.find("bs") > -1:
212             MaxS = MaxS-1
213         elif bctype.find("te") > -1:
214             MaxT = MaxT-1
215     if MaxS > -1 and MaxT > -1:
216         database.del_by_id_timeline(id)
217         database.add_timeline(type=type, chtxt=chtxt, title=keyword, btime=btime, etime=etime, deltatime=deltatime, deltaday=deltaday, opt=opt)
218     else:
219         rett = "over"
220     return rett
221 def station2chtxt(station):
222     ret = ""
223     #try:
224     database.new_iepg()
225     #except:
226     #    ""
227     sta = database.select_by_station_iepg(station)
228     if len(sta) > 0:
229         ret = sta[0][2]
230     else:
231         ret = "n\/a"
232     return ret
233 def readHtmlSrcSimple():
234     f = open(path + 'rswi.htm')
235     ret = f.read()
236     f.close()
237     return ret
238 def readRecFinisSimple():
239     f = open(path + 'fin.htm')
240     ret = f.read()
241     f.close()
242     return ret
243 def readRecSchedule():
244     f = open(path + 'schedule.htm')
245     ret = f.read()
246     f.close()
247     return ret
248 def readiEPGadd():
249     f = open(path + 'iepg_add.htm')
250     ret = f.read()
251     f.close()
252     return ret
253 def readiEPGshow():
254     f = open(path + 'iepg_show.htm')
255     ret = f.read()
256     f.close()
257     return ret
258 def get_fin(string, refreshurl):
259     htmdate = readRecFinisSimple()
260     htmdate = htmdate.replace('<!--text_for_replace_fin//-->', string)
261     htmdate = htmdate.replace('<!--url_for_replace_fin//-->', refreshurl)
262     return htmdate
263 def mode_iepg_add(station):
264     htmdate = readiEPGadd()
265     htmdate = htmdate.replace("<!--text_for_replace_chtxt_input//-->", getchtxt())
266     htmdate = htmdate.replace("<!--ch-value//-->", "")
267     htmdate = htmdate.replace("<!--iepg_title-value//-->", station)
268     return htmdate
269 def mode_iepg_fin():
270     s = u"epgデータの追加を完了しました。<br>\n録画を行う場合はもう一度おねがいします。<br>"
271     u = "rec10web.py?exec=iepg-show"
272     return get_fin(s, u)
273 def mode_iepg_show():
274     htmdate = readiEPGshow()
275     return htmdate
276 def mode_iepg_del():
277     s = u"epgデータを削除しました。"
278     u = "rec10web.py?exec=iepg-show"
279     return get_fin(s, u)
280 def mode_iepg_del_miss():
281     s = u"epgデータの削除に失敗しました。"
282     u = "rec10web.py?exec=iepg-show"
283     return get_fin(s, u)
284 def mode_schedule():
285     htmdate = readRecSchedule()
286     return htmdate
287 def mode_recfin():
288     s = u"予約が終了しました。移動します。"
289     u = "rec10web.py?exec=schedule"
290     return get_fin(s, u)
291 def mode_recover():
292     s = u"最大予約可能数を超えています"
293     u = "rec10web.py?exec=schedule"
294     return get_fin(s, u)
295 def mode_normal():
296     htmdate = readHtmlSrcSimple()
297     htmdate = htmdate.replace("<!--exec-value//-->", "yes")
298     return unicode(htmdate,'utf-8')
299 def mode_del():
300     s = u"予約を削除しました。"
301     u = "rec10web.py?exec=schedule"
302     return get_fin(s, u)
303 def mode_edit_rec10web(tasknum):
304     #editnum=exect.replace("edit:","")
305     htmdate = readHtmlSrcSimple()
306     iddata = edit_date(tasknum)
307     htmdate = htmdate.replace("<!--text_for_replace_chtxt_input//-->", getchtxt())
308     htmdate = htmdate.replace("<!--ch-value//-->", iddata['chtxt'])
309     htmdate = htmdate.replace("<!--btime-value//-->", iddata['btime'])
310     htmdate = htmdate.replace("<!--etime-value//-->", iddata['etime'])
311     htmdate = htmdate.replace("<!--type-value//-->", iddata['type'])
312     htmdate = htmdate.replace("<!--ch-value//-->", iddata['chtxt'])
313     htmdate = htmdate.replace("<!--title-value//-->", iddata['title'])
314     htmdate = htmdate.replace("<!--size-value//-->", size)
315     htmdate = htmdate.replace("<!--opts-value//-->", iddata["opt"])
316     htmdate = htmdate.replace("<!--exec-value//-->", "edit-exec:" + tasknum)
317     return htmdate
318 def mode_edit():
319     editnum = exect.replace("edit:", "")
320     htmdate = readHtmlSrcSimple()
321     iddata = edit_date(editnum)
322     htmdate = htmdate.replace("<!--text_for_replace_chtxt_input//-->", getchtxt())
323     htmdate = htmdate.replace("<!--ch-value//-->", iddata['chtxt'])
324     htmdate = htmdate.replace("<!--btime-value//-->", iddata['btime'])
325     htmdate = htmdate.replace("<!--etime-value//-->", iddata['etime'])
326     htmdate = htmdate.replace("<!--type-value//-->", iddata['type'])
327     htmdate = htmdate.replace("<!--ch-value//-->", iddata['chtxt'])
328     htmdate = htmdate.replace("<!--title-value//-->", iddata['title'])
329     htmdate = htmdate.replace("<!--size-value//-->", size)
330     htmdate = htmdate.replace("<!--opts-value//-->", iddata["opt"])
331     htmdate = htmdate.replace("<!--exec-value//-->", "edit-exec:" + editnum)
332     return htmdate
333 dbpath = path + "ch.db"
334 database = getdb()
335 btime = ""
336 etime = ""
337 title = ""
338 chtxt = ""
339 type = "reserve_flexible"
340 bt = ""
341 station_name = ""
342 mode = ""
343 ###ここからiEPG用の読み出し
344 if f.getfirst('station_name'):
345     station = f.getfirst('station_name')
346     chtxt = station2chtxt(station)
347     if chtxt == "n\/a":
348         mode = "iepg-add"
349         station_name = station
350         exect = "iepg-add"
351 if f.getfirst('station'):
352     station = f.getfirst('station')
353     chtxt = station2chtxt(station)
354     if chtxt == "n\/a":
355         mode = "iepg-add"
356         station_name = station
357         exect = "iepg-add"
358 ###ここから外部からの読み出しの場合
359 if f.getfirst('type'):
360     type = f.getfirst('type')
361 if f.getfirst('title'):
362     title = f.getfirst('title')
363 if f.getfirst('chtxt'):
364     chtxt = f.getfirst('chtxt')
365 if f.getfirst('btime'):
366     btime = f.getfirst('btime')
367     bt = datetime.datetime(*time.strptime(btime, "%Y-%m-%d %H:%M:%S")[:-3])
368 if f.getfirst('etime'):
369     etime = f.getfirst('etime')
370     et = datetime.datetime(*time.strptime(etime, "%Y-%m-%d %H:%M:%S")[:-3])
371     if bt != "":
372         delt = et-bt
373         dt = delt.days * 24 * 60 * 60 + delt.seconds
374         if dt < 0:
375             dd = datetime.timedelta(days=1)
376             et = et + dd
377             etime = et.strftime("%Y-%m-%d %H:%M:%S")
378         if dt < -1 * 24 * 60 * 60:
379             d1 = datetime.datetime(bt.year, 0, 0)
380             d2 = datetime.datetime(bt.year + 1, 0, 0)
381             dd = d2-d1
382             et = et + dd
383             etime = et.strftime("%Y-%m-%d %H:%M:%S")
384 size = "S"
385 if f.getfirst('size'):
386     size = f.getfirst('size')
387 opts = ""
388 if f.getfirst('opts'):
389     opts = f.getfirst('opts')
390 deltahour = ""
391 if f.getfirst('deltahour', ""):
392     deltahour = f.getfirst('deltahour', "")
393 deltaday = ""
394 if f.getfirst('deltaday', ""):
395     deltaday = f.getfirst('deltaday', "")
396 exect = ""
397 if f.getfirst('exec', ""):
398     exect = f.getfirst('exec', "")
399 if exect == "schedule":
400     mode = "schedule"
401     getRecDate()
402 elif exect == "yes":
403     mode = "yes"
404 elif re.search('edit:', exect):
405     mode = "edit"
406 elif re.search('edit-exec:', exect):
407     mode = "edit-exec"
408 elif exect == "change":
409     mode = "edit-rec10"
410 elif exect == "del":
411     mode = "del"
412 elif exect == "iepg-add":
413     mode = "iepg-add"
414 elif exect == "iepg-show":
415     mode = "iepg-show"
416 elif exect == "iepg-add_yes":
417     mode = "iepg-add-yes"
418 elif exect == "iepg-del":
419     mode = "iepg-del"
420 htmdate = mode_normal()
421 htmdate = htmdate.replace("<!--text_for_replace_chtxt_input//-->", getchtxt())
422 htmdate = htmdate.replace("<!--btime-value//-->", btime)
423 htmdate = htmdate.replace("<!--etime-value//-->", etime)
424 htmdate = htmdate.replace("<!--type-value//-->", type)
425 htmdate = htmdate.replace("<!--ch-value//-->", chtxt)
426 htmdate = htmdate.replace("<!--title-value//-->", title)
427 htmdate = htmdate.replace("<!--size-value//-->", size)
428 htmdate = htmdate.replace("<!--opts-value//-->", opts)
429 #ここから曜日検索の設定
430 if f.getfirst('type') == "keyday":
431     rett = ""
432     dayt = f.getfirst('day_Mon')
433     if dayt:
434         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
435     dayt = f.getfirst('day_Tue')
436     if dayt:
437         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
438     dayt = f.getfirst('day_Wed')
439     if dayt:
440         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
441     dayt = f.getfirst('day_Thu')
442     if dayt:
443         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
444     dayt = f.getfirst('day_Fri')
445     if dayt:
446         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
447     dayt = f.getfirst('day_Sat')
448     if dayt:
449         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
450     dayt = f.getfirst('day_Sun')
451     if dayt:
452         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
453     if rett == "":
454         htmdate = mode_recfin()
455     else:
456         htmdate = mode_recover()
457     chtxt = ""
458     exect = ""
459
460
461 if mode == "schedule":
462     htmdate = mode_schedule()
463 elif mode == "edit":
464     htmdate = mode_edit()
465 elif mode == "iepg-add":
466     htmdate = mode_iepg_add(station_name)
467 elif mode == "iepg-add-yes":
468     try:
469         database.new_iepg()
470     except:
471         ""
472     if f.getfirst('iepg_station') and f.getfirst('iepg_chtxt'):
473         database.add_iepg(f.getfirst('iepg_station'), f.getfirst('iepg_chtxt'))
474     htmdate = mode_iepg_fin()
475 elif mode == "iepg-show":
476     getiEPGDate()
477     htmdate = mode_iepg_show()
478 elif mode == "iepg-del":
479     s = f.getfirst('iepgdelnum')
480     htmdate = ""
481     #try:
482     for st in s.split(","):
483         if st != "":
484             database.del_by_id_iepg(st)
485     htmdate = mode_iepg_del()
486     #except:
487     #    htmdate=mode_iepg_del_miss()
488 elif mode == "edit-rec10":
489     s = f.getfirst('tasknum')
490     s.replace(" ", "")
491     htmdate = mode_edit_rec10web(s.split(",")[0])
492 elif mode == "del":
493     s = f.getfirst('tasknum')
494     s.replace(" ", "")
495     ss = s.split(",")
496     for st in ss:
497         if st != "":
498             database.del_by_id_timeline(st)
499     htmdate = mode_del()
500 elif mode == "edit-exec":
501     if (chtxt != "")and(title != "")and(btime != "")and(etime != "")and(opts != ""):
502         editnum = exect.replace("edit-exec:", "")
503         restxt = change_reserv(editnum, type, title, chtxt, btime, etime, deltahour, opts, deltaday)
504         if restxt == "":
505             htmdate = mode_recfin()
506         elif restxt == "over":
507             htmdate = mode_recover()
508         else:
509             htmdate = mode_recfin()
510     exect = ""
511 elif mode == "yes":
512     if (chtxt != "")and(title != "")and(btime != "")and(etime != "")and(opts != ""):
513         restxt = reserv(type, title, chtxt, btime, etime, deltahour, opts, deltaday)
514         if restxt == "":
515             htmdate = mode_recfin()
516         elif restxt == "over":
517             htmdate = mode_recover()
518         else:
519             htmdate = mode_recfin()
520 print "Content-Type: text/html"
521 print htmdate.encode('utf-8')